2013-09-18 2 views
4

Я строй изящный немного «активы-трубопровод» для применения express.js, но у меня есть проблемы с компрессионным шагом для файлов JavaScriptMinify Javascript программен в памяти

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

ДО в настоящее время, все работает так, как ожидалось (сама логика написана в coffeescript). Следующим шагом после слияния JS-файлов будет их минимизация. Но вот моя проблема: я хочу сделать это «горячим», когда я запускаю свое экспресс-приложение в режиме производства, изнутри написанного мной связующего ПО.

мне нужно решение, которое может Минимизировать данный сгусток яваскрипта вещи, без записи результата на диск, другими словами (!): Функция, которая делает минификация и возвращает результат непосредственно в качестве значения результата. (Нет, нет WebServices либо.) Она должна быть полезной, как это:

minified_result = awesomeMinifyFunction(result) 

Необработанные производительность обработки не что важно для меня, ни является уровень сжатия, мне нужно только то, что работает таким образом без хлопот.

Кто-нибудь знает подходящее решение? Заранее спасибо!

ответ

7

Я предлагаю вам посмотрите на один из основателей JavaScript, например UglifyJS2.

npm install uglify-js 

Он может быть использован в приложении Node.js Programatically:

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); 
+0

хорошо, это просто работает. Я не видел их программирования-api в первый раз. – Hisako

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-#%-,./:[email protected]\[-^`{-~-]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-!#%&(*,./:[email protected]\[\\^`{|' 
    r'~])(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)' 
    r'*/))*(?:((?:(?://[^\r\n]*)?[\r\n]))(?:[\000-\011\013\014\016-\040]' 
    r'|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)+(?=[^\000-\040"#%-\047)*,./' 
    r':[email protected]\\-^`|-~])|(?<=[^\000-#%-,./:[email protected]\[-^`{-~-])((?:[\000-\011\013\01' 
    r'4\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)))+(?=[^\000-#%-,./:' 
    r'[email protected]\[-^`{-~-])|(?<=\+)((?:[\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); 
} 
+1

Приятный подход, но после повторного форматирования до действительного кофейня, я понял, что восьмеричные в JS-регулярных выражениях запрещены (coffeescript использует строгий режим). – Hisako

0

Я рекомендую взглянуть на стойку активов, которые уже реализует что вы строите.

+0

Я серьезно смотрел на него, но мне нужно конкретное и высокопроизводительное поведение. на самом деле, ни один из текущих магистральных трубопроводов не работает так, как я их хочу. – Hisako

Смежные вопросы