4

我正在为 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 )

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

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

4

3 回答 3

7

我建议您查看基于 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);
于 2013-09-18T19:03:42.407 回答
0

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

您可以使用使用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);
}
于 2013-09-18T17:08:14.447 回答
0

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

于 2013-09-19T07:57:16.510 回答