我试图让require.js加载在服务器端模块与Java 6和犀牛。
我能够加载require.js本身就好了。 犀牛可以看到require()
函数。 我可以告诉大家,因为犀牛抱怨说,它无法找到该功能时我改变require()
别的东西像requireffdkj()
但是,当我尝试甚至需要一个简单的JS,像hello.js
var hello = 'hello';
使用以下任一的:
require('hello');
require('./hello');
这是行不通的。 我得到
Caused by: javax.script.ScriptException: sun.org.mozilla.javascript.internal.JavaScriptException: [object Error] (<Unknown source>#31) in <Unknown source> at line number 31
at com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:153)
at com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:167)
at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:247)
我有我的hello.js
在Java类路径的顶部。 这就是我require.js
为好。 我试图移动hello.js
到处我能想到它有可能会去,包括我的硬盘驱动器的根,我的用户目录的根目录,该目录从我跑我的Java应用程序等没有什么工作。
我看着CommonJS的规范( http://wiki.commonjs.org/wiki/Modules/1.0 )和它说,顶级的ID(如hello
)从“概念性模块名字空间根”解决,而相对ID (如./hello
)是针对通话模块解决。 我不知道在哪里无论这些基线的是,我怀疑这是个问题。
有什么建议? 我甚至可以用require.js从犀牛?
编辑:思考,我需要在评论中设置的环境了按尖尖的建议之下,我试图评估r.js
为好。 (我试过评估后评估require.js
之前,然后再次require.js
。)在这两种情况下,我得到一个错误:
Caused by: javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: ReferenceError: "arguments" is not defined. (<Unknown source>#19) in <Unknown source> at line number 19
at com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:153)
at com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:167)
at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:247)
“参数”似乎是一个变量r.js
。 我认为这是命令行参数,所以我不认为r.js
是什么,我试图做正确的道路。 虽然不能肯定。
require.js犀牛效果很好。 最近,我用它在一个项目。
- 你必须确保使用r.js (不require.js),改性require.js犀牛的版本。
- 你必须扩展
ScritableObject
类来实现load
和print
功能。 当你调用require(["a"])
在这个类加载函数将被调用,您可以调整该功能能够从任何位置加载的js文件。 在下面的例子中,我从加载classpath
。 - 你必须定义属性
arguments
在sharedscope如示例代码如下所示 - 或者,您可以使用配置子路径
require.config
,指定内部类路径的子目录,其中的js文件的位置。
JsRuntimeSupport
public class JsRuntimeSupport extends ScriptableObject {
private static final long serialVersionUID = 1L;
private static Logger logger = Logger.getLogger(JsRuntimeSupport.class);
private static final boolean silent = false;
@Override
public String getClassName() {
return "test";
}
public static void print(Context cx, Scriptable thisObj, Object[] args,
Function funObj) {
if (silent)
return;
for (int i = 0; i < args.length; i++)
logger.info(Context.toString(args[i]));
}
public static void load(Context cx, Scriptable thisObj, Object[] args,
Function funObj) throws FileNotFoundException, IOException {
JsRuntimeSupport shell = (JsRuntimeSupport) getTopLevelScope(thisObj);
for (int i = 0; i < args.length; i++) {
logger.info("Loading file " + Context.toString(args[i]));
shell.processSource(cx, Context.toString(args[i]));
}
}
private void processSource(Context cx, String filename)
throws FileNotFoundException, IOException {
cx.evaluateReader(this, new InputStreamReader(getInputStream(filename)), filename, 1, null);
}
private InputStream getInputStream(String file) throws IOException {
return new ClassPathResource(file).getInputStream();
}
}
示例代码
public class RJsDemo {
@Test
public void simpleRhinoTest() throws FileNotFoundException, IOException {
Context cx = Context.enter();
final JsRuntimeSupport browserSupport = new JsRuntimeSupport();
final ScriptableObject sharedScope = cx.initStandardObjects(browserSupport, true);
String[] names = { "print", "load" };
sharedScope.defineFunctionProperties(names, sharedScope.getClass(), ScriptableObject.DONTENUM);
Scriptable argsObj = cx.newArray(sharedScope, new Object[] {});
sharedScope.defineProperty("arguments", argsObj, ScriptableObject.DONTENUM);
cx.evaluateReader(sharedScope, new FileReader("./r.js"), "require", 1, null);
cx.evaluateReader(sharedScope, new FileReader("./loader.js"), "loader", 1, null);
Context.exit();
}
}
loader.js
require.config({
baseUrl: "js/app"
});
require (["a", "b"], function(a, b) {
print('modules loaded');
});
js/app
目录应该在你的classpath中。