【问题标题】:How can I use CommonJS modules with Oracle's new Nashorn JS Engine?如何将 CommonJS 模块与 Oracle 的新 Nashorn JS 引擎一起使用?
【发布时间】:2013-10-21 16:41:03
【问题描述】:

我正在为 Nashorn 寻找一个模块系统。据我所知,CommonJS 是涉及 JS 模块的方法。我查看了列表(herehere),几乎没有发现 Java 的 CommonJS 实现方式。

Narwhal 不再处于活动状态,它的 documentation 不再托管在 GitHub 上。是否有支持 Java 的现有 CommonJS 实现,或者我应该开始一个新项目?

【问题讨论】:

    标签: commonjs nashorn


    【解决方案1】:

    在这里查看 jvm-npm https://github.com/nodyn/jvm-npm。这个项目被 nodyn 用作 CommonJS 模块系统。它支持 NPM,这意味着您可以直接从 NPM 加载模块,但它不提供任何 Node.js API。

    这是一个简单的用法示例:

    $ npm install pegjs
    npm http GET https://registry.npmjs.org/pegjs
    npm http 200 https://registry.npmjs.org/pegjs
    pegjs@0.8.0 node_modules/pegjs
    $ jrunscript
    nashorn> typeof require
    undefined
    nashorn> load('./jvm-npm.js')
    nashorn> typeof require
    function
    nashorn> var PEG = require('pegjs');
    nashorn> typeof PEG
    object
    

    主要是所有的 Javascript,但从文件系统中实际加载文件等都是使用 Java 完成的。

    【讨论】:

      【解决方案2】:

      还有 nashorn-require,你也可以从 github 获得它。我用过,我能做到

              engine.eval(reader("src/main/javascript/nashorn-require.js"),bindings);
              engine.eval("var initRequire = load('src/main/javascript/nashorn-require.js');",bindings);
              engine.eval("initRequire({mainFile : 'src/main/javascript/foo', debug : true})", bindings);
              engine.eval("var babel = require('babel');",bindings);
      

      然后使用

      将 JSX React 组件转换为 ES5
              Buffer input = findTemplateSource(fileLocation,context);
              bindings.put("input",input.toString());
              result = engine.eval("babel.transform(input,{ presets: ['react', 'es2015'] }).code;",bindings);
      

      然后,当我将 react 和 react-dom 拉入浏览器并加载生成的 js 组件时,一切正常,所以我确信 Babel 非常高兴,尽管我不确定它是否会找到 3rd-party插件与否...

      【讨论】:

        【解决方案3】:

        我也有同样的需求,我用了一段时间jvm-npm,但我需要一些即使不允许在 JavaScript 中使用 Java 包也能工作的东西,所以我在这里写了自己的版本:https://github.com/coveo/nashorn-commonjs-modules

        它完全用 Java 实现,支持从文件系统以外的其他地方加载模块(Java 资源、自定义数据库等)

        如果有人想使用它,它会在 Maven Central 上发布。

        【讨论】:

          【解决方案4】:

          不久前我在 Nashorn 邮件列表上问了一个非常相似的问题,这是 Sundar(Nashorn 工程师)的回复:

          来自:A. Sundararajan

          收件人:nashorn-dev@openjdk.java.net

          我忘记添加了。 Nashorn 不包含任何内置模块系统。 但是,如果一个模块系统是纯 JS + Java 的,它必须是可以运行的 在 nashorn 上。

          Nashorn 支持“加载”(从 URL、文件、资源加载脚本)和 “loadWithNewGlobal”(加载脚本但进入新的全局范围) 除了旧的“eval”之外的原语。所以,应该是 任何模块系统都可以在 nashorn 之上实现 纯 JS 或者可能带有一点 Java 代码。

          -桑达尔

          【讨论】:

            【解决方案5】:

            我一直在寻找这样的实现。我一直在使用Rhino-Require 的一个小补丁版本。尽管 Rhino 声称与 CommonJS 兼容,但 AFAIK,它只实现了模块而不是包(package.json)无法解析。 RingoJS 应该是兼容的。但 Nashorn 永远不会是see

            后来,Oracle 宣布了依赖 Avatar.jshere 的项目 Avatar。它是非官方称为 Node.jar 的官方项目。但是到目前为止,您必须自己编译它。这个项目很年轻。

            另一个非常年轻的项目是Nodyn,它依赖于 dyn.js。

            所以,如果理解得好,CommonJs 应该与 avatar-js 和 nodyn 一起工作,但是这两个还很年轻。我不明白为什么 avatar-js 没有与 nashorn 一起完全分布。

            一种解决方案是添加一个 CommonJS 兼容性脚本,就像 Rhino 的那样,它添加了 importClass/importPackage (mozilla_compat.js),它将 CommonJS 兼容性添加到 nashorn 中,一种 Rhino-Require shim 彻底测试。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-11-13
              • 2015-10-17
              • 2017-06-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多