1

CommonJS API (require()) をネイティブ Java コードに実装する JavaScript ファイルのコンパイルを試みた/運が良かった人がいるかどうか疑問に思っていました。

私は現在、これと同様のテキスト エディタを使用して構築しているサイトを持っています。これは、stackoverflow オープンソース (WMD エディタのポート) です: http://code.google.com/p/pagedown/

このプロジェクトには、エディタのマークアップ言語をサニタイズして有効な HTML に変換する JavaScript ファイルがいくつか付属しています。

Rhino 1.7R4 を少しいじってみたところ、実行時に JavaScript ファイル/モジュールをロードすることができ、require 関数をいつでも実行できるようになりました。

ただし、これらのスクリプトをネイティブ Java コードにプリコンパイルすることをお勧めします。このRhinoドキュメントに従って、CommonJS機能を使用しない単一のスクリプトをコンパイルすることができました:

https://developer.mozilla.org/en-US/docs/Rhino/JavaScript_Compiler

しかし、CommonJS 機能を実装する複数の依存スクリプトをコンパイルする正しい方法については途方に暮れており、Rhino 自体は十分に文書化されていません。

アイデアは、マークアップ変換とサニタイズのためのネイティブ Java コードを用意することであり、2 つの異なるコード ベースを作成/維持するための翻訳コストは必要ありません (JS を Java に変換するだけです)。

乾杯

4

1 に答える 1

0

RingoJS は次のようなことができます。

Ringo は、CommonJS モジュール仕様を実装しています。つまり、これは次のことを意味します。

すべての JavaScript ファイルは、独自のトップレベル スコープ内にあるモジュールとして扱われます。

モジュールの exports オブジェクトにアタッチされたすべての関数またはプロパティが公開されます。

require() 関数は、モジュールの exports オブジェクトを返します。

指定された識別子文字列が ./ または ../ で始まる場合、Ringo のモジュール ローダーはファイルを検索してロードしようとします。したがって、require('./foo') は、ファイル ./foo.js をモジュールとしてロードするよう Ringo にアドバイスします。

それ以外の場合、Ringo はモジュール パスのすべてのフォルダーでモジュールを探します。

モジュール パスは、Ringo がモジュールを検索する標準的な場所のリストです。

モジュール パスは、次の方法で設定できます。

RINGO_MODULE_PATH 環境変数の設定。

ringo.modulepath Java システム プロパティの設定。

-m または --modules オプションを ringo コマンドライン ツールに使用します。

JsgiServlet で module-path サーブレット init パラメータを使用する。

Ringo 内から require.paths 配列のようなプロパティに要素を追加または削除します。

パッケージは、複数のモジュールやその他のリソースを 1 つのユニットにまとめる手段を提供します。パッケージは、package.json パッケージ記述子ファイルを含むディレクトリです。package.json 記述子のメイン プロパティは、モジュールのメイン エントリ ポイントとして Ringo のモジュール ローダーによって認識されます。

{
    "main": "lib/main.js"
}

モジュール ID がパッケージ ディレクトリに直接解決され、package.json がメイン プロパティを定義する場合、Ringo は指定されたリソースを読み込もうとします。メイン プロパティの値は、パッケージ ルートからの相対パスである必要があります。

モジュール ID が package.json ファイルを含まないディレクトリに解決される場合、または package.json がメイン プロパティを定義しない場合、Ringo はそのディレクトリにファイル index.js を読み込もうとします。

モジュール ID の一部がパッケージ ディレクトリに解決される場合、Ringo は ID の残りの部分をそのパッケージの lib ディレクトリに対して解決しようとします。lib ディレクトリの場所は、package.json の directory.lib プロパティを使用してオーバーライドできます。

{
    "directories": {
        "lib": "new-lib"
    }
}

CommonJS モジュールの仕様は、意図的に小さく保たれています。Ringo は、エクスポートおよびインポートするためのいくつかの特別な機能を提供します。これらを使用することの欠点は、コードが Ringo に結び付けられていることですが、コードを「純粋な」CommonJS に変換するのは比較的簡単で、そのためのコマンド ライン ツールもあります。

1 つの Ringo 拡張機能は include 関数です。これは require に似ていますが、他のモジュールの exports オブジェクトを全体として返す代わりに、その各プロパティを呼び出しモジュールのスコープに直接コピーし、ローカルで定義されているかのように使用できるようにします。

include は、タイピングの経済性が最優先されるシェル作業やクイック スクリプトに最適であり、それが目的です。プログラムで使用されるトップレベル関数の起源を隠すため、大規模で長期間存続するプログラムに使用することは、通常は良い考えではありません。

この目的のためには、require を JavaScript 1.8 破壊割り当てと組み合わせて使用​​し、ローカル スコープ内の別のモジュールから選択したプロパティを明示的に含めることをお勧めします。

var {foo, bar} = require("some/module");

上記のステートメントは、「some/module」によってエクスポートされた API の「foo」および「bar」プロパティを呼び出しスコープに直接インポートします。

Ringo を使用してコマンド ライン スクリプトを作成するのは簡単です。すべての任意の JavaScript ファイルを [script-file] 引数として ringo コマンドに渡すことができます。

ringo [script-file] [script-arg1] [script-arg2] ...

Ringo はスクリプト ファイルをロードし、システム モジュールの args 配列を介して引数を提供します。args 配列の最初の要素は、スクリプト ファイルの名前です。

参考文献

于 2017-07-04T15:39:48.053 に答える