4

Express.js アプリケーション用の気の利いた小さな「アセット パイプライン」を構築していますが、javascript ファイルの圧縮ステップに問題があります。

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

これまでのところ、物事は期待どおりに機能しています (ロジック自体は coffeescript で記述されています)。JS ファイルをマージした後の次のステップは、それらを縮小することです。しかし、ここに私の問題があります。私が書いた接続ミドルウェア内から、エクスプレスアプリをプロダクションモードで起動するときに、これを「ホット」にしたいのです。

結果をディスク (!) に書き込むことなく、JavaScript の特定のブロブを縮小できるソリューションが必要です。つまり、縮小を実行し、結果値として結果を直接返す関数が必要です。(いいえ、Web サービスもありません。) 次のように使用できるはずです。

minified_result = awesomeMinifyFunction( result )

生の処理パフォーマンスは私にとってそれほど重要ではありません。また、圧縮のレベルも重要ではありません。問題なくこのように機能するものが必要です

適切な解決策を知っている人はいますか?前もって感謝します!

4

3 に答える 3

7

UgliifyJS2のような JavaScript ベースのミニファイアの 1 つを確認することをお勧めします。

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 に答える