在内存中以编程方式缩小Javascript

我正在为express.js应用程序构build一个漂亮的小“资产pipe道”,但是我对JavaScript文件的压缩步骤有问题

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

到目前为止,事情正在按预期工作(逻辑本身是用咖啡书写的)。 合并JS文件后的下一步是缩小它们。 但是,这里是我的问题:当我从生产模式开始我的快速应用程序时,我想要做到这一点“热”,从我写的一个连接中间件。

我需要一个解决scheme,可以缩小给定的blob的JavaScript的东西, 而不会将结果写入磁盘 (!),换句话说:一个函数,做缩小,并直接返回结果作为结果值。 (不,也没有webservices 。)它应该是这样的可用:

 minified_result = awesomeMinifyFunction( result ) 

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

有谁知道一个合适的解决scheme? 提前致谢!

我build议你看一下基于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); 

你可以写你自己的function,删除所有评论/空格/空行等

你可以使用一个使用rJSmin的正则expression式:

 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); } 

我build议看看Asset Rack,它已经实现了你正在构build的东西。