通过 Nashorn 执行 uglifyJs2
Execution uglifyJs2 via Nashorn
我通过 uglifyjs --self
提取了 uglifyJs2,我正在尝试使用 uglify.js 缩小 app.js。我希望至少应该将缩小的 js 生成到新文件或控制台中,但现在它不起作用。我应该怎么做才能使用 uglify.min.js 缩小 app.js?
public static void main(String[] args) throws Exception {
ScriptEngine scriptEngine = new ScriptEngineManager().getEngineByName("nashorn");
Bindings bindings = new SimpleBindings();
bindings.put("console", System.console());
executeJs("uglifyjs.min.js",scriptEngine, bindings);
String res = (String) invocable.invokeFunction("UglifyJS.parse(code)", code);
//Here I got NoSuchMethodException: No such function UglifyJS.parse(code)
}
static String readFile(String path, Charset encoding)
throws IOException
{
byte[] encoded = Files.readAllBytes(Paths.get(path));
return new String(encoded, encoding);
}
private static void executeJs(String fileName, ScriptEngine engine, Bindings bindings) throws Exception {
String test = readFile(fileName, StandardCharsets.UTF_8);
engine.put(ScriptEngine.FILENAME, fileName);
engine.eval(test, bindings);
}
我什么时候
invokeFunction 只能用于调用全局函数。它不能像上面那样用于评估任意代码。以下将起作用:
// define a global function that accepts one arg and invoke UglifyJS.parse on it
scriptEngine.eval("function func(code) { return UglifyJS.parse(code) }");
// call the newly defined global function "func"
invocable.invokeFunction("func", code);
作为替代方案...
ScriptObjectMirror uglify = (ScriptObjectMirror)this.scriptEngine.eval("UglifyJS");
String ugly = (String)uglify.callMember("parse", "mycode");
在我的系统上 uglify.callMember(...) 的 100,000 次调用中,它确实显得有点慢,大约慢了 150 毫秒。通过首先调用 uglify.getMember("parse") 并直接对该对象使用调用似乎没有任何改进。
但是它确实避免了命名冲突
我通过 uglifyjs --self
提取了 uglifyJs2,我正在尝试使用 uglify.js 缩小 app.js。我希望至少应该将缩小的 js 生成到新文件或控制台中,但现在它不起作用。我应该怎么做才能使用 uglify.min.js 缩小 app.js?
public static void main(String[] args) throws Exception {
ScriptEngine scriptEngine = new ScriptEngineManager().getEngineByName("nashorn");
Bindings bindings = new SimpleBindings();
bindings.put("console", System.console());
executeJs("uglifyjs.min.js",scriptEngine, bindings);
String res = (String) invocable.invokeFunction("UglifyJS.parse(code)", code);
//Here I got NoSuchMethodException: No such function UglifyJS.parse(code)
}
static String readFile(String path, Charset encoding)
throws IOException
{
byte[] encoded = Files.readAllBytes(Paths.get(path));
return new String(encoded, encoding);
}
private static void executeJs(String fileName, ScriptEngine engine, Bindings bindings) throws Exception {
String test = readFile(fileName, StandardCharsets.UTF_8);
engine.put(ScriptEngine.FILENAME, fileName);
engine.eval(test, bindings);
}
我什么时候
invokeFunction 只能用于调用全局函数。它不能像上面那样用于评估任意代码。以下将起作用:
// define a global function that accepts one arg and invoke UglifyJS.parse on it
scriptEngine.eval("function func(code) { return UglifyJS.parse(code) }");
// call the newly defined global function "func"
invocable.invokeFunction("func", code);
作为替代方案...
ScriptObjectMirror uglify = (ScriptObjectMirror)this.scriptEngine.eval("UglifyJS");
String ugly = (String)uglify.callMember("parse", "mycode");
在我的系统上 uglify.callMember(...) 的 100,000 次调用中,它确实显得有点慢,大约慢了 150 毫秒。通过首先调用 uglify.getMember("parse") 并直接对该对象使用调用似乎没有任何改进。
但是它确实避免了命名冲突