#engine #javascript-engine #script #run-time #spidermonkey

es_runtime

SpiderMonkey 脚本引擎周围的 API 和实用工具

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 每月下载量

GPL-3.0 许可证

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

教程

HOWTO

依赖项

~81MB
~1.5M SLoC