11 个版本
0.1.4 | 2020 年 6 月 1 日 |
---|---|
0.1.3 | 2020 年 4 月 10 日 |
0.0.6 | 2020 年 4 月 4 日 |
0.0.4 | 2020 年 3 月 31 日 |
#1753 在 开发工具
36 每月下载量
150KB
3.5K SLoC
es_runtime
es_runtime 是一个 crate,旨在让 Rust 开发者能够将其 Rust 项目中的 ECMA-Script 引擎集成,而不需要具备 ECMA-Script 引擎的专业知识。
使用的引擎是 Mozilla SpiderMonkey 引擎 (https://mdn.org.cn/en-US/docs/Mozilla/Projects/SpiderMonkey).
这个项目最初是我作为一个学习 Rust 的兴趣项目开始的。我希望你们中的一些人能从 Rust 中使用 SpiderMonkey 找到一些有用的东西。
状态
有关当前状态和版本,请参阅 https://github.com/DRFos/es_runtime
在 crates.io 上发布的版本基于 mozjs 0.10.1,这是 mozjs 发布的最新版本。
更当前的版本依赖于 mozjs 的 github 仓库,但由于这个原因,它不能发布到 crates.io
请参阅 变更日志 了解新增内容。
0.1 目标
- 掌握何时使用根值(Handle)和何时使用值(JSVal)
- 轻松加载脚本文件
- 错误处理(在 Rust 中获取带有文件名/行号等的 ES 错误)
- 将 Rust 函数添加到引擎中,以便从 ECMA-Script 中调用它们
- 阻塞
- 非阻塞(在脚本中返回一个 Promise)
- 从 Rust 中调用 ECMA-Script 函数的简单方法
- 通过名称(run_global_function())
- 通过对象名称和名称(myObj.doSomething())
- 从 Rust 传递参数
- 将数据从引擎作为原语或 Vecs 和 Maps 获取
- 原语
- 从 Map 到 Map 的对象
- 数组作为 Vecs
- 工作控制台(日志记录)
- 脚本中的工作 Promise
- 在 Rust 中等待 Promise
- 支持 import/export 语句
- 缓存模块
- 不再有内存泄漏
0.2 及以后的目标
请参阅 https://github.com/DRFos/es_runtime
其他计划
我还在开发一个功能更丰富的运行时,它有一个命令行工具,以及一个基于此运行时的应用服务器
有关这些状态的更新,请参阅 https://github.com/DRFos
我想知道您在这个项目中想看到什么,或者您想用它来做什么,请给我留言 @ [email protected]
示例
Cargo.toml
- 对于最新版本
[dependencies]
es_runtime = {git = "https://github.com/DRFos/es_runtime"}
# but you should check in the repo for the tag or branch you want to use and link to that
# es_runtime = {git = "https://github.com/DRFos/es_runtime", tag = "0.3.5"}
- 针对发布版本
[dependencies]
es_runtime = "0.1"
my_app.rs
#[test]
fn example() {
// start a runtime
let rt = EsRuntimeWrapper::builder()
// run the garbage collector every 5 secs
.gc_interval(Duration::from_secs(5))
.build();
// create an example object
rt.eval_sync("this.myObj = {a: 1, b: 2};", "test1.es")
.ok()
.unwrap();
// register a native rust method
rt.register_op(
"my_rusty_op",
Box::new(|_sm_rt, args: Vec<EsValueFacade>| {
let a = args.get(0).unwrap().get_i32();
let b = args.get(1).unwrap().get_i32();
Ok(EsValueFacade::new_i32(a * b))
}),
);
// call the rust method from ES
rt.eval_sync(
"this.myObj.c = esses.invoke_rust_op_sync('my_rusty_op', 3, 7);",
"test2.es",
)
.ok()
.unwrap();
let c: Result<EsValueFacade, EsErrorInfo> =
rt.eval_sync("(this.myObj.c);", "test3.es");
assert_eq!(&21, c.ok().unwrap().get_i32());
// define an ES method and calling it from rust
rt.eval_sync("this.my_method = (a, b) => {return a * b;};", "test4.es")
.ok()
.unwrap();
let args = vec![EsValueFacade::new_i32(12), EsValueFacade::new_i32(5)];
let c_res: Result<EsValueFacade, EsErrorInfo> = rt.call_sync("my_method", args);
let c: EsValueFacade = c_res.ok().unwrap();
assert_eq!(&60, c.get_i32());
}
关于编译的一些话
目前我只在64位Linux机器上编译了它(我使用openSUSE)
除了rust,您还需要安装以下包来编译mozjs crate
- gcc-7
- autoconf2.13
- automake
- clang
- python
有关更详细的信息,请访问 https://github.com/servo/mozjs#building
教程
依赖项
~81MB
~1.5M SLoC