好吧,所以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
文件......但我觉得必须有更好的方法。
有没有人有任何提示?