基于任務的指令行建構工具(針對javascript項目)
前端的工具算得上是五花八門,在介紹如何grunt之前,首先我們得反問自己:
grunt能夠幫我們解決什麼問題?
是否有其他更合适的替代方案?
作為一名開發人員,我們見過了不少功能胡裡花哨但并不實用的工具。但是,我們很少會因為一個工具功能很強大而去使用它。更多地,是因為在工作中我們遇到了一些問題,而某個工具剛好幫我們解決了這些問題。
假設我們有個叫<code>imweb_proj</code>的項目,該項目主要包含兩個功能子產品,分别是<code>modulea</code>、<code>moduleb</code>。回想一下,作為一名前端開發人員,從功能開發到産品正式上線,我們的工作流程是什麼樣的:
正式進入編碼工作前,得做些準備工作:
建立目錄<code>imweb_proj</code>,index.html為主入口;根目錄下面再另外建立三個目錄js、css、img,分别用來存放js檔案、css檔案、圖檔
imweb_proj/js下建立個main.js作為項目主邏輯的入口,添加modulea.js、modueb.js,對了,不能把我們的基礎元件badjs.js、simple.js、nohost.js給忘了
imweb_proj/css下建立個reset.css,添加modulea.css、moduleb.css
熱火朝天地編碼,産品終于即将上線,上線前的準備工作同樣不能馬虎
<code>jshint</code>——檢查下js代碼規範性,避免進行類似隐式全局變量這樣的坑裡
<code>concat</code>——js檔案合并,合理減少請求數,提升加載速度
<code>cssmin</code>——css檔案合并,合理減少請求數,提升加載速度
<code>uglyfy</code>——壓縮檔案,減少檔案尺寸,提升使用者側加載速度
<code>qunit</code>——單元測試,提高項目可維護性,結合遞歸測試可盡早發現潛在問題
…
上面的場景是不是很眼熟?重複而枯燥的工作占據了我們太多的時間,忘了誰說過,當重複做一件事超過三次,就應該考慮将它自動化。
grunt正是為了解決上述問題而誕生,它将上面提到的項目結構生成、jshint檢查、檔案合并、壓縮、單元測試等繁瑣的工作變成一個個可自動化完成的任務,一鍵搞定。
文檔豐富:詳細的使用說明,從入門使用,到進階定制,非常詳盡
插件豐富:基本能夠想到的常用的任務,都可以找到
社群活躍:grunt的開發團隊還是挺勤勞的,社群活躍度也挺高
當然有,而且不少,ant、yeoman、mod、fiddler+willow+qzmin等,先不展開
grunt使用場景通常分兩種:
維護現有的grunt項目——已經配置好的項目,下面以jquery plugin項目為例進行講解,簡單了解下一個grunt項目的基本結構;
新建立的grunt項目——包括項目目錄結構的建立,到grunt任務的配置等;這裡可以采用現有的grunt模闆,也可以采用自定義的模闆;下文會采用自定義模闆的形式,逐漸講解如何建立一個**imweb團隊的前端基礎項目結構**
注意:為了解決多版本并存的問題,從<code>0.4.x</code>版本開始,每個項目需獨立安裝grunt及對應插件,版本分别如下:
grunt <code>0.4.x</code>
nodejs <code>>=0.8.0</code>
grunt從版本0.3.x到0.4.x,變化比較大,主要是為了解決grunt多版本共存的問題,有興趣的童鞋可以了解下。如果之前安裝了0.3.x版本,需先進行解除安裝
grunt-cli的主要作用是讓我們可以運作grunt指令,加上-g,則可以在任意目錄下運作,不展開
grunt-init是個腳手架工具,它可以幫你完成項目的自動化建立,包括項目的目錄結構,每個目錄裡的檔案等。具體情況要看你運作grunt-init指定的模闆,以及建立過程中你對問題的回答,下文會簡單講到這個功能。
先運作下面指令安裝grunt-init,
下面我們先通過安裝jquery plugin模闆,來展示gurnt模闆的安裝,項目的建立,以及一個grunt項目的目錄結構
下面指令可以檢視官方維護的grunt模闆
運作下面指令安裝jquery模闆
在上一步中我們已經安裝好了jquery模闆,接着運作下面指令,安裝jquery項目
按照引導回答下面問題,完成項目的建立
項目目錄結構如下:
從上面的目錄結構,大緻可以看出各個目錄、檔案的作用,其中我們需要注意的是兩個檔案gruntfile.js、package.json,這兩個檔案都需要放在項目跟目錄下。下面會稍微詳細介紹到:
gruntfile.js 項目的grunt配置資訊,包括子產品依賴、任務定義
package.json 項目node子產品的依賴資訊,主要根據gruntfile生成
其他其他檔案非grunt項目必須的,可以暫時不去看它
首先運作下面指令,安裝所需node子產品,耐心等候安裝完即可
輸入下面指令,運作grunt任務
輸出如下,done
方式一:運作下面指令,通過逐漸回答問題的方式建立基礎的package.json檔案2```
方式二:建立空的package.json檔案,拷貝下面内容,根據需要進行修改
建立完package.json,運作如下指令,安裝所需插件
運作如下指令,安裝<code>最新版</code>的grunt
其實這種方式還是有點麻煩,grunt團隊還是比較人性化的,針對gruntfile,還提供了一個單獨的plugin,讓我們免去重複勞動之苦,後面再講
打開下載下傳下來的示例目錄,可以看到如下内容:
簡單介紹下裡面内容:
<code>template.js</code> 主模闆檔案,非常重要!裡面主要内容有:項目建立時需要回答的問題,項目依賴的grunt子產品(根據這個生成package.json)
<code>rename.json</code> 針對目前模闆的目錄/文 件重命名規則,不贅述
<code>root/</code> 重要!在這個目錄裡的檔案,通過該模闆生成項目結構時,會将root目錄下的檔案都拷貝到項目中去
下面是template.js最常包含的一些内容,主要包括:
<code>exports.description</code> 模闆簡單介紹資訊
<code>exports.notes</code> 開始回答項目相關問題前,控制台列印的相關資訊
<code>exports.after</code> 開始回答項目相關問題前,控制台列印的相關資訊
<code>init.process</code> 項目建立的時候,需要回答的問題
<code>init.writepackagejson</code> 生成package.json,供grunt、npm使用
reame.json的作用比較簡單,定義了從root目錄将檔案拷貝到實際項目下時的路徑映射關系,以<code>sourcepath: destpath</code>的形式聲明。sourcepath是相對于root的路徑,而destpath則是相對于實際項目的路徑。
ps:當destpath為false時,sourcepath對應的檔案不會被拷貝到項目中去
進入root目錄,可以看到很多檔案,其中我們需要關注的有gruntfile.js、readme.md
gruntfile.js 項目的任務配置資訊,把基礎任務,如jshint、concat、uglify等配置好即可,其他的各個任務可自行擴充
readme.md 項目的readme資訊,一個調理清晰的readme很重要
對gruntfile.js檔案進行修改,如下,熟悉qzmin配置檔案的童鞋應該很容易看懂
花了一點時間把imweb_proj配置好,現在終于到了實際運作階段了。假設我們目前在目錄imweb_proj下,imweb_template為imweb_proj目錄目前僅有的内容
操作步驟可參照**jquery plugin示例:如何通過現有模闆建立項目、運作grunt任務**,下面直接上指令
下面為運作grunt指令後控制台輸出的資訊
可以看到helloproj目錄下的内容發生了改變,enjoy yourself!
上面對grunt進行了入門介紹,下面簡單說下ant、aven
mod:元彥童鞋開發維護,功能很強大,grunt能完成的,mod都能完成,而且使用更加貼近我們的項目實踐,入門更簡單(有部分原因是因為
mod內建了很多常使用者任務,而grunt早期也是這麼做的,不過因為多版本的問題放棄了這種做法),之前聽過元彥的分享,挺不錯的,打算在項目中試用
由于時間問題,這裡沒有對grunt、ant、mod進行詳細的對比,來個todo吧~~