Update: 補上一張執行後的截圖 2013.03.27
GruntJS 是一套 JavaScript Task Runner,為什麼官網會這樣寫呢?網站上線之前,是不是需要經過測試,壓縮,及品質控管,這些 Task 該如何實現,在 GruntJS 還沒出現之前,大家可以透過 Linux command 的方式來達成,但是對於前端工程師而言,多學習 command line 真的是要他們的命,所以 GruntJS 解決了此問題,將所有的 Task 用 Javascript 方式設定就可以自動佈署或測試。GruntJS 的 Plugin 也非常多且完整,像是大家常用的 CoffeeScript、Handlebars、Jade、JsHint、Less、Sass、Compass、Stylus…等都有支援。更多好用的 Plugin 可以在官網搜尋頁面上找到。
安裝方式 Grunt 可以透過
Node.js 的管理工具 npm 方式來安裝,Windows 只要到 Node.js 官網下載安裝包,直接按下一步即可安裝完畢,Linux 可以透過 NVM 方式來管理 Node.js 版本,可以參考作者之前寫的 Node Version Manager 版本管理 NVM。需要注意的是 Grunt 0.4.x 需要 Node.js >= 0.8.0 版本才可以。
如果之前已經安裝 Grunt 請先移除安裝
$ npm uninstall -g gruntLinux 請切換到 root 使用者來安裝
$ npm install -g grunt-cli
準備新專案 在使用 Grunt 指令前,請在專案目錄內新增
package.json 及 Gruntfile.js 檔案 package.json: 此檔案紀錄專案 metadata 以便將來做成 npm module,另外也會記載專案內所用到 Grunt plugins 版本資訊,像是 devDependencies 設定。 Gruntfile.js: 此檔案可以用 Coffscript.coffee 撰寫,用來紀錄工作內容及相關 Plugins 載入. PS. 如果是用 Grunt 0.3.x 版本,請命名為 grunt.js
package.json 此檔案記載專案相關資訊,也包含了 GruntJS 所需要用到的 Plugins,範例如下(官網提供)
{
"name": "my-project-name",
"version": "0.1.0",
"devDependencies": {
"grunt": "~0.4.1",
"grunt-contrib-jshint": "~0.1.1",
"grunt-contrib-nodeunit": "~0.1.2"
}
}建立此檔案後,在專案目錄內,執行npm install,會發現專案內多了 node_modules 目錄。可以將此目錄名稱加入到 .gitignore,免的不小心 commit 到伺服器。如果不想手動更改 devDependencies 資訊,其實可以透過 npm install grunt –save-dev 方式加入到 devDependencies 裡。
Gruntfile.js 可以透過 Gruntfile.coffee 或 Gruntfile.js 來產生檔案,此命名適用於 0.4.x 版本,如果是 0.3.x 版本請命名為 grunt.js。此檔案會包含底下部份
* wrapper 寫法 * 專案及任務設定 * 載入 Grunt Plugins 和任務內容 * 定義特定任務拿官網的例子來介紹:
module.exports = function(grunt) {
// Project configuration.
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
uglify: {
options: {
banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n'
},
build: {
src: 'src/<%= pkg.name %>.js',
dest: 'build/<%= pkg.name %>.min.js'
}
}
});
// Load the plugin that provides the "uglify" task.
grunt.loadNpmTasks('grunt-contrib-uglify');
// Default task(s).
grunt.registerTask('default', ['uglify']);
};在 package.json 裡面設定安裝grunt-contrib-uglify 套件,uglify 任務就是將 Javascript 檔案壓縮,當我們執行 grunt 指令時,Grunt 會執行預設的任務 uglify。上面有提到四點 Grunt 檔案會包含的項目,其中第一點是 wrapper 寫法,也就是上面例子內的
module.exports = function(grunt) {
// Do grunt-related things in here
};接著注意專案的設定,也就是底下內容// Project configuration.
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
uglify: {
options: {
banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n'
},
build: {
src: 'src/<%= pkg.name %>.js',
dest: 'build/<%= pkg.name %>.min.js'
}
}
});所有的工作項目設定都會寫在 grunt.initConfig 裡面,看到第一行 grunt.file.readJSON(“package.json”),將 package.json 內容讀到 pkg 變數,接著參數設定就可以使 <% %> 方式讀取。uglify 工作項目內的 options 設定可以直接參考 grunt-contrib-uglify,我們可以定義多個 target 來區分多個工作內容,範例如下
// Project configuration.
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
uglify: {
options: {
banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n'
},
build: {
src: 'src/<%= pkg.name %>.js',
dest: 'build/<%= pkg.name %>.min.js'
},
my_target_1: {
options: {
sourceMap: 'path/to/source-map.js'
},
files: {
'dest/output.min.js': ['src/input.js']
}
},
my_target_2: {
options: {
sourceMap: 'path/to/source-map.js',
sourceMapRoot: 'http://example.com/path/to/src/',
sourceMapIn: 'example/coffeescript-sourcemap.js'
},
files: {
'dest/output.min.js': ['src/input.js']
}
}
}
});完成基本 Grunt Plugin 設定,接著將此 Plugin 載入// Load the plugin that provides the "uglify" task.
grunt.loadNpmTasks('grunt-contrib-uglify');最後定義預設的任務// Default task(s).
grunt.registerTask('default', ['uglify']);Grunt 設定檔就完成了,可以來進行測試,我們可以直接下grunt 指令,系統會自動跑預設任務,也就是 uglify,也或者如果有多個任務時,你只想執行 uglify 任務,請將指令改成 grunt uglify,如果是想要執行 uglify 任務內的 my_target_2 項目呢?請直接下 grunt uglify:my_target_2。 基本介紹到這裡,大家對於 Grunt.js 應該都有基本的瞭解。最後補張執行後的圖

