Language: 简体中文 | English
dart_quickjs
是一个使用Dart
对QuickJS
引擎的一个绑定,支持在Android
IOS
中执行JavaScript
代码, QuickJS
是一款轻量级, 并支持ECMAScript 2020规范的JavaScript
引擎
$ dart pub add dart_quickjs
如果需要指定版本可以在pubspec.yaml
文件中添加
dependencies:
dart_quickjs: ^版本号
println
为dart_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);
在通信中可以传递基础类型和函数类型
- 使用模块系统时需要传递
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);
println
setInterval
clearInterval
setTimeout
clearTimeout