6

有什么方法可以将 javascript 源代码转换为一些预编译的声明,可以以某种方式存储和加载,org.graalvm.polyglot.Context而不是将其评估为原始字符串?像--persistent-code-cache在 nashorn 中没有记录的东西。

4

1 回答 1

5

截至 19 年 5 月,您可以在同一进程内共享代码以避免重新解析(类似于 Nashorn 代码持久性),方法是Engine在不同Context的 s 之间重用相同的对象,如下所示:

try (Engine engine = Engine.create()) {
    Source source = Source.create("js", "21 + 21");
    try (Context context = Context.newBuilder().engine(engine).build()) {
        int v = context.eval(source).asInt();
        assert v == 42;
    }
    try (Context context = Context.newBuilder().engine(engine).build()) {
        int v = context.eval(source).asInt();
        assert v == 42;
    }
}

更多细节可以在这里找到:https ://www.graalvm.org/docs/graalvm-as-a-platform/embed/#enable-source-caching

我们计划在未来结合 GraalVM 原生镜像工具支持跨进程的持久代码缓存。我们已经支持创建包含 JavaScript 解释器和 GraalVM 编译器的原生镜像。我们希望添加对允许包含预热脚本的支持,希望也包含预编译的 JavaScript 本机代码。因此,您可能能够以接近零的启动时间来启动您的 JS 应用程序。虽然没有预计到达时间。

于 2019-05-02T12:53:27.573 回答