さて、r.jsはRhinoで実行できます。これは素晴らしいことです。
それがする必要があることをするために。
rhinoでは、基本的にを使用し、java.io.File
必要なファイルシステムの変更を実現します。java.io.FileOutputStream
java.io.FileInputStream
(背景:私はMavenベースのJava / Javascript開発者により良い開発体験を提供することに取り組んでいます。Mavenであるため、慣習の力と意見の力があります。進捗状況はjszip.orgで確認できます。)
だから私がやりたいのは、ディスク上の構造を魔法のように仮想ファイルシステムとして表示させることです。
したがって、ディスク上では次のような構造になります。
/
/module1/src/main/js/controllers/controller.js
/module2/src/main/js/models/model.js
/module3/src/main/js/views/view.js
/webapp/src/build/js/profile.js
/webapp/src/main/js/main.js
/webapp/src/main/webapp/index.html
は次の/webapp/src/build/js/profile.js
ようになります。
({
appDir: "src",
baseUrl:".",
dir: "target",
optimize: "closure",
modules:[
{
name:"main"
}
]
})
そのような
r.jsが要求したとき、
new File("src/main.js")
私は実際にそれを与えますnew File("/webapp/src/main/js/main.js")
それが求められ
new File("profile.js")
たら私はそれを与えますnew File("/webapp/src/build/js/profile.js")
それが求められ
new File("controllers/controller.js")
たら私はそれを与えますnew File("/module1/src/main/js/controllers/controller.js")
それが求められ
new File("target")
たら、私はそれを与えますnew File("/webapp/target/webapp-1.0-SNAPSHOT")
。
必要な3つのモッククラス、つまり、、、の代わりに使用するクラスを記述しても問題ありjava.io.File
ませjava.io.FileInputStream
んjava.io.FileOutputStream
。
このようないくつかの質問には、ClassShutterのようなものを指す回答があります。これは、次のように使用できることがわかります。
context.setClassShutter(new ClassShutter() {
public boolean visibleToScripts(String fullClassName) {
if (File.class.getName().equals(fullClassName)) return false;
if (FileOutputStream.class.getName().equals(fullClassName)) return false;
if (FileInputStream.class.getName().equals(fullClassName)) return false;
return true;
}
});
元の実装を非表示にします。
問題は、Rhinoにサンドボックス化された同等のものを解決させることです...私は取得し続けます
TypeError: [JavaPackage java.io.File] is not a function, it is object.
java.io.File = org.jszip.rhino.SandboxFile
以前にmapを実行して呼び出しの前にプレフィックスを付けたとしても、サンドボックス化された実装は、現在欠落しているものよりも優先されますjava.io.File
r.js
コンパイルする直前に、ロードされたファイルに対して検索と置換を使用することを検討することもできます...しかし、もっと良い方法があるはずだと思います。
誰かヒントはありますか?