Skip to content

Latest commit

 

History

History
196 lines (161 loc) · 4.54 KB

README-ZH.md

File metadata and controls

196 lines (161 loc) · 4.54 KB

dart_quickjs

Pub

Language: 简体中文 | English

dart_quickjs是一个使用DartQuickJS引擎的一个绑定,支持在Android IOS中执行JavaScript代码, QuickJS 是一款轻量级, 并支持ECMAScript 2020规范的JavaScript引擎

开始使用

添加依赖

$ dart pub add dart_quickjs

如果需要指定版本可以在pubspec.yaml文件中添加

dependencies:
  dart_quickjs: ^版本号

最新稳定版本:Pub

示例

printlndart_quickjs注入的打印函数

import 'package:dart_quickjs/dart_quickjs.dart';

final runtime = Runtime();
const script = 'println("Hello World");';

runtime.evaluateJavaScript(script, 'main.js');

类型支持和映射

Dart JavasCript
JSObject Object
JSString String
JSNumber Number
JSFloat Number
JSBool Boolean
JSArray Array
JSFunction Function
JSPromise Promise
JSNull null
JSUndefined undefined

注入对象

import 'package:dart_quickjs/dart_quickjs.dart';

final runtime = Runtime();
// 创建和注入对象
final value = JSString.create(runtime.context, 'dart_quickjs');
// 添加到全局对象
runtime.global.setPropertyStr('name', value);
// 打印name
runtime.evaluateJavaScript('println(name);', 'main.js');

注入方法

import 'package:dart_quickjs/dart_quickjs.dart';

final runtime = Runtime();
// 创建方法
final value = JSFunction.create(runtime.context, (JSNumber data) {
  return JSNumber.create(runtime.context, data.value + 1);
});
// 添加到全局对象
runtime.global.setPropertyStr('add', value);
// 执行代码
runtime.evaluateJavaScript('println(add(1));', 'main.js');

通信

JavaScript调用dart

import 'package:dart_quickjs/dart_quickjs.dart';

final runtime = Runtime();
// 创建方法
final value = JSFunction.create(runtime.context, (JSString message) {
  print('JavaScriptMessage: ${message.value}');
});
// 添加到全局对象
runtime.global.setPropertyStr('test', value);
// 执行代码
runtime.evaluateJavaScript('test("dart_quickjs");', 'main.js');

dart调用JavaScript

import 'package:dart_quickjs/dart_quickjs.dart';

final runtime = Runtime();
// javascript代码
const code  = '''function message(value) {
  return value + 1;
}
message;''';
// 执行代码
final callback = runtime.evaluateJavaScript(code, 'main.js') as JSFunction;
// 调用javascript方法
final value = callback.call([JSNumber.create(runtime.context, 1)]);
// 打印返回值
print(value);

在通信中可以传递基础类型和函数类型

module导入

  • 使用模块系统时需要传递moduleLoader方法来加载模块
  • 在运行入口时候运行模式需要设置成JSEvalType.module
import 'package:dart_quickjs/dart_quickjs.dart';

// 创建运行时
final runtime = Runtime(
  moduleLoader: (String name) {
    if (name == 'message') {
      return "export const message = 'dart_quickjs'";
    }

    return '';
  },
);
// main.js
const main  = '''
  import { message } from 'message'
  println(message)
''';
// 执行代码
runtime.evaluateJavaScript(main, 'main.js', JSEvalType.module);

销毁和释放

import 'package:dart_quickjs/dart_quickjs.dart';

final runtime = Runtime();

// 释放运行时
runtime.destroy();

插件

import 'package:dart_quickjs/dart_quickjs.dart';

class Test extends Plugin {
  late Runtime _runtime;

  @override
  void onCreate(Runtime runtime) {
    _runtime = runtime;
    // 注入方法
    runtime.global.setPropertyStr(
      'getMessage',
      JSFunction.create(runtime.context, test),
    );
  }

  JSString test(JSString data) {
    return JSString.create(_runtime.context, '${data.value} World');
  }

  @override
  void destroy(Runtime runtime) {}
}

final runtime = Runtime(
  plugins: [
    // 注册插件
    Test()
  ],
);

const script = 'println(getMessage("Hello"));';
runtime.evaluateJavaScript(script, 'main.js');

字节码

import 'package:dart_quickjs/dart_quickjs.dart';

final runtime = Runtime();

const script = 'println("Hello World");';
// 编译字节码
final bytecode = runtime.compile(script, 'main.js');
// 运行字节码
runtime.evaluateBytecode(bytecode);

内置 javascript api方法

println setInterval clearInterval setTimeout clearTimeout