Java:格式化Javascript代码

fly*_*ire 1 javascript java code-formatting

在我的架构中,Javascript 代码是在服务器中生成的。生成一大块 Javascript 代码,存储在 a 中java.lang.String并发送到客户端。我想更轻松地调试生成的代码(生成和运行方式)。

有人知道格式化Javascript代码的简单方法吗?

Rom*_*hev 5

可能为时已晚,但仍然如此。

我还没有找到流行的 Java 库来做你想做的事;但是,有许多用于此的 javascript 库(例如,js-beautify)。您可以将此类库源代码保存在应用程序的资源中(您可以从 CDN 链接之一获取代码,因此您不必手动对其进行分组和缩小),然后加载它并使用 Nashorn javascript 引擎调用它.

您的代码可能如下所示(大致):

import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.io.InputStreamReader;

public class JavascriptBeautifierForJava {

    // my javascript beautifier of choice
    private static final String BEAUTIFY_JS_RESOURCE = "beautify.js";

    // name of beautifier function
    private static final String BEAUTIFY_METHOD_NAME = "js_beautify";

    private final ScriptEngine engine;

    JavascriptBeautifierForJava() throws ScriptException {
        engine = new ScriptEngineManager().getEngineByName("nashorn");

        // this is needed to make self invoking function modules work
        // otherwise you won't be able to invoke your function
        engine.eval("var global = this;");
        engine.eval(new InputStreamReader(getClass().getClassLoader().getResourceAsStream(BEAUTIFY_JS_RESOURCE)));
    }

    public String beautify(String javascriptCode) throws ScriptException, NoSuchMethodException {
        return (String) ((Invocable) engine).invokeFunction(BEAUTIFY_METHOD_NAME, javascriptCode);
    }

    public static void main(String[] args) throws ScriptException, NoSuchMethodException {
        String unformattedJs = "var a = 1; b = 2; var user = { name : \n \"Andrew\"}";

        JavascriptBeautifierForJava javascriptBeautifierForJava = new JavascriptBeautifierForJava();
        String formattedJs = javascriptBeautifierForJava.beautify(unformattedJs);

        System.out.println(formattedJs);
        // will print out:
        //        var a = 1;
        //        b = 2;
        //        var user = {
        //            name: "Andrew"
        //        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您打算使用这种方法,请确保重用 JavascriptBeautifier 对象,因为在需要美化代码时重新创建一个对象并不太有效。