11

Nashorn 用のモジュール システムを探しています。私が知る限り、CommonJS は JS 用のモジュールに関して進むべき道です。リスト ( hereおよびhere ) を調べたところ、Java 用の CommonJS 実装の方法はほとんど見つかりませんでした。

Narwhalはアクティブではなくなり、そのドキュメントは GitHub でホストされなくなりました。Java をサポートする既存の CommonJS 実装はありますか、それとも新しいプロジェクトを開始する必要がありますか?

4

5 に答える 5

18

ここで jvm-npm を見てください https://github.com/nodyn/jvm-npm。このプロジェクトは、CommonJS モジュール システムとして nodyn によって使用されます。これは 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 を使用して行われます。

于 2014-06-16T16:39:36.287 に答える
6

少し前に Nashorn メーリング リストで非常によく似た質問をしました。Sundar (Nashorn エンジニア) の回答は次のとおりです。

From: A. スンダラジャン

宛先: nashorn-dev@openjdk.java.net

追加するのを忘れていました。Nashorn には組み込みモジュール システムは含まれていません。ただし、純粋な JS + Java のモジュール システムであれば、nashorn で実行できる必要があります。

Nashorn は、古き良き 'eval' に加えて、"load" (URL、ファイル、リソースからスクリプトをロードする) および "loadWithNewGlobal" (スクリプトを新しいグローバル スコープにロードする) プリミティブをサポートしています。そのため、任意のモジュール システムを nashorn の上に純粋な JS で、またはおそらく Java コードで実装することが可能になるはずです。

-サンダー

于 2013-10-21T23:49:06.570 に答える
5

私も同じニーズがあり、しばらくjvm-npmを使用していましたが、JavaScript 内で Java パッケージの使用を許可しなくても機能するものが必要だったので、ここに独自のバージョンを作成しました: https://github.com/coveo /nashorn-commonjs-modules

完全に Java で実装され、ファイルシステム以外の場所 (Java リソース、カスタム データベースなど) からのモジュールのロードをサポートします。

誰かが使用したい場合は、Maven Central で公開されています。

于 2016-03-28T09:41:00.433 に答える
5

私はしばらくの間、そのような実装を探していました。Rhino-Requireの少しパッチを当てたバージョンを使用しています。RhinoはCommonJSと互換性があると主張していますが、AFAIKではモジュールのみを実装し、パッケージ(package.json)は解析できません。 RingoJSは互換性があるはずです。しかし、Nashorn が表示されることはありません。

その後、Oracle はAvatar.jsまたはhereに依存するプロジェクト Avatar を発表しました。これは、非公式に Node.jar と呼ばれていたものの公式プロジェクトです。ただし、現時点では、自分でコンパイルする必要があります。プロジェクトは非常に若いです。

もう 1 つの非常に若いプロジェクトは、 dyn.jsに依存する Nodyn です。

したがって、よく理解すれば、CommonJs は avatar-js と nodyn で動作するはずですが、これら 2 つはまだかなり新しいものです。ただし、avatar-js が nashorn と一緒に完全に配布されていない理由がわかりません。

一種の解決策は、CommonJS 互換性を nashorn に追加する Rhino 用のような CommonJS 互換性スクリプト ( mozilla_compat.js ) を追加することです。これは、徹底的にテストされた Rhino-Require shim の一種です。

于 2013-10-22T21:05:03.557 に答える
1

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 は完全に満足していると確信しています。 ...

于 2016-11-20T18:33:28.443 に答える