Нет необходимости разбивать jQuery, он работает с env.js 1.2 (http://www.envjs.com/), Rhino 1.7R2 и jQuery 1.7.1, если выполнить следующие шаги.
- Скачать env.js source и запустите 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();
}
При этом просто загрузите скриптиспользует функциональные возможности RRe Rative Reader:
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 превысить ограничение в 64 Кбайт-кода. Как только env.js загружен в модуликак и выше (порядок важен!), оригинальный код jQuery просто работает.
Если вы используете $ .ajax или другие вызовы jQuery XHR, будьте внимательны, чтобы jQuery + env.js следовал той же политике домена, поэтому серверв запросе XHR должно совпадать window.location
.