去做它需要做的事情。
在 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")
。
我编写所需的三个模拟类没有问题,即用于代替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
我什至可以考虑在编译之前对加载的文件使用搜索和替换......但我觉得必须有更好的方法。
有没有人有任何提示?