好吧,所以r.js可以運行在Rhino。這很棒。如何爲r.js提供僞文件系統?
做它需要做的事情。
在犀牛上,它基本上使用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")
。
我有沒有問題寫所需的三個模擬類,即那些在地方java.io.File
,java.io.FileInputStream
和java.io.FileOutputStream
使用,
一些問題,比如this有指向之類的東西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;
}
});
隱藏原始實現。
這個問題就越來越犀牛解決沙盒等價的...我不斷獲取
TypeError: [JavaPackage java.io.File] is not a function, it is object.
即使我前綴的java.io.File = org.jszip.rhino.SandboxFile
地圖我在現在缺java.io.File
沙盒實現將優先執行呼叫
我甚至可以考慮在編譯之前使用搜索並替換已加載的r.js
文件......但我覺得必須有更好的方法。
有沒有人有任何提示?