- Grunt介紹
- 中文首頁 : http://www.gruntjs.net/
- 是一套前端自動化建構工具,一個基于nodeJs的指令行工具
- 它是一個任務運作器, 配合其豐富強大的插件
- 常用功能:
- 合并檔案(js/css)
- 壓縮檔案(js/css)
- 文法檢查(js)
- less/sass預編譯處理
- 其它…
- 安裝nodejs, 檢視版本
node -v
|- build----------建構生成的檔案所在的檔案夾
|- src------------源碼檔案夾
|- js---------------js源檔案夾
|- css--------------css源檔案夾
|- index.html-----頁面檔案
|- Gruntfile.js---grunt配置檔案(注意首字母大寫)
|- package.json---項目包配置檔案
{
"name": "grunt_test",
"version": "1.0.0"
}
npm install -g grunt-cli
npm install grunt --save-dev
grunt //提示 Warning: Task "default" not found
- 配置檔案: Gruntfile.js
- 此配置檔案本質就是一個node函數類型子產品
- 配置編碼包含3步:
- 初始化插件配置
- 加載插件任務
- 注冊建構任務
- 基本編碼:
module.exports = function(grunt){
// 1. 初始化插件配置
grunt.initConfig({
//主要編碼處
});
// 2. 加載插件任務
// grunt.loadNpmTasks('grunt-contrib-concat');
// 3. 注冊建構任務
grunt.registerTask('default', []);
};
- 指令: grunt //提示成功, 但沒有任何效果(還沒有使用插件定義任務)
- Grunt插件介紹
- grunt官網的插件清單頁面 http://www.gruntjs.net/plugins
- 插件分類:
- grunt團隊貢獻的插件 : 插件名大都以contrib-開頭
- 第三方提供的插件 : 大都不以contrib-開頭
- 常用的插件:
- grunt-contrib-clean——清除檔案(打包處理生成的)
- grunt-contrib-concat——合并多個檔案的代碼到一個檔案中
- grunt-contrib-uglify——壓縮js檔案
- grunt-contrib-jshint——javascript文法錯誤檢查;
- grunt-contrib-cssmin——壓縮/合并css檔案
- grunt-contrib-htmlmin——壓縮html檔案
- grunt-contrib-imagemin——壓縮圖檔檔案(無損)
- grunt-contrib-copy——複制檔案、檔案夾
- grunt-contrib-watch——實時監控檔案變化、調用相應的任務重新執行
- 合并js: 使用concat插件
npm install grunt-contrib-concat --save-dev
(function () {
function add(num1, num2) {
return num1 + num2;
}
console.log(add(10, 20));
})();
* src/js/test2.js
(function () {
var arr = [2,3,4].map(function (item, index) {
return item+1;
});
console.log(arr);
})();
concat: {
options: { //可選項配置
separator: ';' //使用;連接配接合并
},
build: { //此名稱任意
src: ["src/js/*.js"], //合并哪些js檔案
dest: "build/js/built.js" //輸出的js檔案
}
}
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.registerTask('default', ['concat']);
grunt //會在build下生成一個built.js
npm install grunt-contrib-uglify --save-dev
pkg : grunt.file.readJSON('package.json'),
uglify : {
options: { //不是必須的
banner: '/*! <%= pkg.name %> - v<%= pkg.version %> - ' +
'<%= grunt.template.today("yyyy-mm-dd") %> */'
},
build: {
files: {
'build/js/built-<%=pkg.name%>-<%=pkg.version%>.min.js': ['build/js/built.js']
}
}
}
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.registerTask('default', ['concat', 'uglify']);
grunt //會在build下生成一個壓縮的js檔案
npm install grunt-contrib-jshint --save-dev
- 編碼: .jshintrc
{
"curly": true,
"eqeqeq": true,
"eqnull": true,
"expr" : true,
"immed": true,
"newcap": true,
"noempty": true,
"noarg": true,
"regexp": true,
"browser": true,
"devel": true,
"node": true,
"boss": false,
//不能使用未定義的變量
"undef": true,
//語句後面必須有分号
"asi": false,
//預定義不檢查的全局變量
"predef": [ "define", "BMap", "angular", "BMAP_STATUS_SUCCESS"]
}
- 修改src/js/test1.js
(function () {
function add(num1, num2) {
num1 = num1 + num3
return num1 + num2;
}
console.log(add(10, 20));
})();
jshint : {
options: {
jshintrc : '.jshintrc' //指定配置檔案
},
build : ['Gruntfile.js', 'src/js/*.js'] //指定檢查的檔案
}
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.registerTask('default', ['concat', 'uglify', 'jshint']);
grunt //提示變量未定義和語句後未加分号 -->修改後重新編譯
npm install grunt-contrib-cssmin --save-dev
#box1 {
width: 100px;
height: 100px;
background: red;
}
#box2 {
width: 200px;
height: 200px;
background: blue;
}
<link rel="stylesheet" href="build/css/output.min.css" target="_blank" rel="external nofollow" >
<div id="box1"></div>
<div id="box2"></div>
cssmin:{
options: {
shorthandCompacting: false,
roundingPrecision: -1
},
build: {
files: {
'build/css/output.min.css': ['src/css/*.css']
}
}
}
grunt.loadNpmTasks('grunt-contrib-cssmin');
grunt.registerTask('default', ['concat', 'uglify', 'jshint', 'cssmin']);
grunt //在build/css/下生成output.min.css
- 使用watch插件(真正實作自動化)
- 指令: npm install grunt-contrib-watch --save-dev
- 配置 : Gruntfile.js
watch : {
scripts : {
files : ['src/js/*.js', 'src/css/*.css'],
tasks : ['concat', 'jshint', 'uglify', 'cssmin'],
options : {spawn : false}
}
}
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.registerTask('default', ['concat', 'uglify', 'jshint', 'watch']);
改進:grunt.registerTask('myWatch', ['default','watch']);
grunt //控制台提示watch已經開始監聽, 修改儲存後自動編譯處理