對于前臺開發(fā)而言,為了降低文件大小,js文件和css文件的壓縮和組合幾乎是默認的規(guī)矩。
我們利用YUI Compressor 和 google Compiler 可以很容易的完成文件的壓縮。 甚至 yui compressor 本身都已經(jīng)支持 多文件的批量壓縮。
但是,為了更好的處理這些機械化的事情,我們通常還是需要腳本來輔助,讓這些工作可以更好的自動化,可配置化。
網(wǎng)上有很多類似的腳本工具,或者有的也已經(jīng)編譯成了可視化的工具來使用。
我自己以前也寫過python版本的,也用過同事寫的類似的腳本,基本也都是python版本的。鑒于大多數(shù)前端的攻城師們對js更為熟悉,所以,這里也提供一個簡易的nodejs 版本的。下午花了3個小時寫的。
NodeCC –> Node Compressor and Compoer
代碼很簡單,基本就是讀文件,寫文件,調(diào)用系統(tǒng)jar命令 使用 yuicompressor 壓縮文件。
源碼托管在:github.com/hongru/nodeCC 上,100行左右。
【編碼中需要注意的幾個地方】
nodejs中fileSystem buffer的概念,簡單的可以理解成文本數(shù)據(jù)流,所以,為了得到我們常見的文本,注意 readFile 后 toString的使用。
生成新文件時,路徑是否存在的判斷,如果不存在,生成指定目錄時,由于node本身的mkdir不支持多級目錄,所以這里需要自己來處理多級目錄的遞歸生成。
有兩種方式,一種是利用child_process 創(chuàng)建一個子進程調(diào)用系統(tǒng)命令 mkdir -p.
另一種就是分析路徑,一級一級遞歸創(chuàng)建目錄。代碼參考https://gist.github.com/2817910
/* mkdir -p for node */
var fs = require('fs'),
path = require('path');
function mkdirpSync (pathes, mode) {
mode = mode || 0777;
var dirs = pathes.trim().split('/');
if (dirs[0] == '.') {
// ./aaa
dirs.shift();
}
if (dirs[0] == '..') {
// ../aaa
dirs.splice(0, 2, dirs[0] + '/' + dirs[1]);
}
dirs.length && mkdir(dirs.shift());
// mkdir
function mkdir (d) {
if (!path.existsSync(d)) {
fs.mkdirSync(d, mode);
}
dirs.length && mkdir(d + '/' + dirs.shift());
}
}
// eg
//mkdirpSync('hongru/me');
通過child_process 的spawn 來調(diào)用系統(tǒng)命令,比如 ls, java 等。然后通過stdout 和 stderr 來監(jiān)聽獲得 命令所返回的log或者error信息。
【使用方法】
當(dāng)然,因為是nodejs版本的,所以自然需要安裝nodejs,官方有提供詳細說明
因為用了jar包 yuicompressor.jar, 所以,需要安裝 JAVA的sdk,安裝過程也很簡單,不會的搜一下即可。
最后,關(guān)于config.json 文件的配置,很簡單,都是兩個字段,“source”和“target”,source代表源路徑文件,target表示壓縮之后生成的文件路徑。
支持目錄級別。
另外,如果source字段為一個數(shù)組的話,會將這個數(shù)組里面的文件按照順序合并,然后壓縮生成到指定target的路徑。
所以,config.json看起來會像是這個樣子:
{
"css-test": {
"source": "test/css/",
"target": "test/public/css/"
},
"normal-file-compress": {
"source": "test/test.js",
"target": "test/test.min.js"
},
"normal-dir-compress": {
"source": "test/js/",
"target": "test/public/js/"
},
"compress-and-merge": {
"source": [
"test/js/a.js",
"test/js/b.js"
],
"target": "test/public/js/ab.js"
}
}
將帶有 yuicompressor.jar 的tools/ ,主腳本 nodecc.js, 以及配置好的config.json 放置在同一目錄下,然后執(zhí)行
node nodecc.js
即可。
好了,工具很簡單,代碼也很簡單,希望能給有需要的同學(xué)提供一點點幫助