Nashorn 用のモジュール システムを探しています。私が知る限り、CommonJS は JS 用のモジュールに関して進むべき道です。リスト ( hereおよびhere ) を調べたところ、Java 用の CommonJS 実装の方法はほとんど見つかりませんでした。
Narwhalはアクティブではなくなり、そのドキュメントは GitHub でホストされなくなりました。Java をサポートする既存の CommonJS 実装はありますか、それとも新しいプロジェクトを開始する必要がありますか?
ここで 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 を使用して行われます。
少し前に Nashorn メーリング リストで非常によく似た質問をしました。Sundar (Nashorn エンジニア) の回答は次のとおりです。
From: A. スンダラジャン
宛先: nashorn-dev@openjdk.java.net
追加するのを忘れていました。Nashorn には組み込みモジュール システムは含まれていません。ただし、純粋な JS + Java のモジュール システムであれば、nashorn で実行できる必要があります。
Nashorn は、古き良き 'eval' に加えて、"load" (URL、ファイル、リソースからスクリプトをロードする) および "loadWithNewGlobal" (スクリプトを新しいグローバル スコープにロードする) プリミティブをサポートしています。そのため、任意のモジュール システムを nashorn の上に純粋な JS で、またはおそらく Java コードで実装することが可能になるはずです。
-サンダー
私も同じニーズがあり、しばらくjvm-npmを使用していましたが、JavaScript 内で Java パッケージの使用を許可しなくても機能するものが必要だったので、ここに独自のバージョンを作成しました: https://github.com/coveo /nashorn-commonjs-modules
完全に Java で実装され、ファイルシステム以外の場所 (Java リソース、カスタム データベースなど) からのモジュールのロードをサポートします。
誰かが使用したい場合は、Maven Central で公開されています。
私はしばらくの間、そのような実装を探していました。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 の一種です。
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 は完全に満足していると確信しています。 ...