无需拆分 jQuery,它适用于 env.js 1.2 (http://www.envjs.com/)、Rhino 1.7R2 和 jQuery 1.7.1,如果执行以下步骤。
- 下载 env.js 源代码并在根目录下运行 ant。
- 从生成的 ./dist 中,将除 env.js 和 env.rhino.js 之外的所有文件复制到您的代码可以访问它的位置(我将文件夹称为“env.js”)。
执行以下操作,您将在服务器上拥有快速、启用 jQuery 的上下文:
Context cx = ContextFactory.getGlobal().enterContext();
try {
Scriptable scope = cx.initStandardObjects();
//global function print is needed to redirect console output. E.g.:
cx.evaluateString(scope,
"var print = function(v) {"+
" java.lang.System.out.println(v);"+
" };",
"print",1,null);
//load env.js one by one
loadScript(cx, scope, "env.js/platform/core.js");
loadScript(cx, scope, "env.js/platform/rhino.js");
loadScript(cx, scope, "env.js/console.js");
loadScript(cx, scope, "env.js/dom.js");
loadScript(cx, scope, "env.js/event.js");
loadScript(cx, scope, "env.js/html.js");
loadScript(cx, scope, "env.js/css.js");
loadScript(cx, scope, "env.js/parser.js");
loadScript(cx, scope, "env.js/xhr.js");
loadScript(cx, scope, "env.js/timer.js");
loadScript(cx, scope, "env.js/window.js");
//now everything is ready to load jquery
loadScript(cx, scope, "jquery/jquery.js");
//now you can do jQuery calls in this scope
cx.evaluateString(scope,
"$.each([42, 1024], "+
" function(index, value) { console.log(index+' -> '+value); });",
"example", 1, null);
} finally {
Context.exit();
}
其中 loadScript 简单地利用了 Rhino 的 evaluateReader 功能:
private void loadScript(Context cx, Scriptable scope, String name) {
FileReader readerJQ = null;
try {
readerJQ = new FileReader(name);
cx.evaluateReader(scope, readerJQ, name, 1, null);
readerJQ.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
我猜这是 env.js 和 jQuery 的组合,它们都包装在 IIFE 中,导致 Rhino 超过 64k 字节代码限制。一旦 env.js 被加载到像 abvove 这样的模块中(顺序很重要!),原始的 jQuery 代码就可以工作了。
如果您尝试 $.ajax 或其他 XHR jQuery 调用,请注意,jQuery + env.js 遵循相同的域策略,因此 XHR 请求中的服务器需要匹配window.location
。