【问题标题】:Minify Javascript programmatically in-memory以编程方式在内存中缩小 Javascript
【发布时间】:2013-09-23 13:17:44
【问题描述】:

我正在为 express.js 应用程序构建一个漂亮的小“资产管道”,但我对 javascript 文件的压缩步骤有疑问

scripts = (fs.readFileSync(file) for file in filelist)
result = scripts.join("\n\n") # concat

到目前为止,一切都按预期进行(逻辑本身是用咖啡脚本编写的)。合并 JS 文件后的下一步是缩小它们。但这是我的问题:当我在生产模式下启动我的 express-app 时,我想从我写的一个连接中间件中做这个“热”。

我需要一个可以缩小给定 javascript 内容的解决方案,无需将结果写入磁盘(!),换句话说:一个执行缩小并直接返回结果的函数结果值。 (不,也没有网络服务。)它应该可以这样使用:

minified_result = awesomeMinifyFunction( result )

原始处理性能对我来说不是那么重要,压缩级别也不重要,我只需要以这种方式工作而没有麻烦的东西。

有人知道合适的解决方案吗?提前致谢!

【问题讨论】:

    标签: javascript node.js express coffeescript minify


    【解决方案1】:

    我建议您看看 Asset Rack,它已经实现了您正在构建的内容。

    【讨论】:

    • 我认真地看着它,但我想要一个特定的高性能行为。事实上,当前的资产管道都没有按照我希望的方式工作。
    【解决方案2】:

    我建议您查看基于 JavaScript 的压缩器之一,例如 UglifyJS2

    npm install uglify-js
    

    它可以在 Node.JS 应用程序中以编程方式使用:

    var UglifyJS = require("uglify-js");
    // you could pass multiple files (rather than reading them as strings)
    var result = UglifyJS.minify([ "file1.js", "file2.js", "file3.js" ]);
    console.log(result.code);
    

    或者你可以

    var result = scripts.join("\n\n");  # concat
    result = UglifyJS.minify(result, {fromString: true});
    console.log(result.code);
    

    【讨论】:

    • 好吧,它只是工作。我第一次没有看到他们的programming-api。
    【解决方案3】:

    您可以编写自己的函数来删除所有 cmets/空格/空行等。

    您可以使用使用rJSmin 的正则表达式,例如:

    function awesomeMinifyFunction(result)
    {
       pattern = (
        r'([^\047"/\000-\040]+)|((?:(?:\047[^\047\\\r\n]*(?:\\(?:[^\r\n]|\r?'
        r'\n|\r)[^\047\\\r\n]*)*\047)|(?:"[^"\\\r\n]*(?:\\(?:[^\r\n]|\r?\n|'
        r'\r)[^"\\\r\n]*)*"))[^\047"/\000-\040]*)|(?<=[(,=:\[!&|?{};\r\n])(?'
        r':[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*'
        r'(?:(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013\014\016-\040]|(?:/\*'
        r'[^*]*\*+(?:[^/*][^*]*\*+)*/))*)*((?:/(?![\r\n/*])[^/\\\[\r\n]*(?:('
        r'?:\\[^\r\n]|(?:\[[^\\\]\r\n]*(?:\\[^\r\n][^\\\]\r\n]*)*\]))[^/\\\['
        r'\r\n]*)*/)[^\047"/\000-\040]*)|(?<=[\000-#%-,./:-@\[-^`{-~-]return'
        r')(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/'
        r'))*(?:(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013\014\016-\040]|(?:'
        r'/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)))*((?:/(?![\r\n/*])[^/\\\[\r\n]*(?'
        r':(?:\\[^\r\n]|(?:\[[^\\\]\r\n]*(?:\\[^\r\n][^\\\]\r\n]*)*\]))[^/'
        r'\\\[\r\n]*)*/)[^\047"/\000-\040]*)|(?<=[^\000-!#%&(*,./:-@\[\\^`{|'
        r'~])(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)'
        r'*/))*(?:((?:(?://[^\r\n]*)?[\r\n]))(?:[\000-\011\013\014\016-\040]'
        r'|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)+(?=[^\000-\040"#%-\047)*,./'
        r':-@\\-^`|-~])|(?<=[^\000-#%-,./:-@\[-^`{-~-])((?:[\000-\011\013\01'
        r'4\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)))+(?=[^\000-#%-,./:'
        r'-@\[-^`{-~-])|(?<=\+)((?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*'
        r'\*+(?:[^/*][^*]*\*+)*/)))+(?=\+)|(?<=-)((?:[\000-\011\013\014\016-'
        r'\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)))+(?=-)|(?:[\000-\011\013'
        r'\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))+|(?:(?:(?://[^'
        r'\r\n]*)?[\r\n])(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^'
        r'/*][^*]*\*+)*/))*)+'
    )
     return result.match(pattern);
    }
    

    【讨论】:

    • 不错的方法,但是在重新格式化为有效的coffeescript之后,我意识到JS-regexps中的八进制是被禁止的(coffeescript使用严格模式)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    • 1970-01-01
    相关资源
    最近更新 更多