Gruntjavascript
代碼: https://github.com/RyenToretto/grunt-gulp-webpackcss
環境: node 版本 > 0.8html
特色: java
自動化: 壓縮、合併、編譯等等操做,前提是 Gruntfile.js 文件配置好了node
Gruntfile.js
或 Gruntfile.coffee
,用來配置或定義任務(task)並加載Grunt插件的webpack
grunt 插件: grunt 做爲大腦,指揮插件們工做git
contrib-官方維護的插件es6
項目結構: github
1. 全局安裝 grunt 腳手架 命令行接口 grunt-cliweb
sudo npm install -g grunt-cli
調用與 Gruntfile.js
在同一目錄中 Grunt
2. 局部安裝 grunt
sudo npm install --save-dev grunt
每次運行grunt
時,他就利用node提供的require()
系統查找本地安裝的 Grunt。
正是因爲這一機制,你能夠在項目的任意子目錄中運行 grunt,更多詳情請閱讀源碼
3. 編輯 Gruntfile.js
Gruntfile.js
中package.json
文件中的項目元數據(metadata)被導入到 Grunt 配置中
grunt-contrib-uglify 插件中的 uglify
任務(task)被配置爲壓縮(minify)源碼文件
並依據上述元數據動態生成一個文件頭註釋。
當在命令行中執行 grunt
命令時,uglify
任務將被默認執行。
commonJS 模塊化語法 暴露
module.exports = function(grunt) { // 初始化配置 grunt 任務. grunt.initConfig({ }); // 當 grunt 執行時,要加載的插件。 // grunt.loadNpmTasks(''); // 註冊 構建任務 列表。 grunt.registerTask('default', []); // 默認任務,依賴爲 [] };
4. 加入 合併 js 的插件 grunt-contrib-concat
(1) sudo npm install --save-dev grunt-contrib-concat
(2) 修改 Gruntfile.js
module.exports = function(grunt) { // 初始化配置 grunt 任務. grunt.initConfig({ concat: { options: { separator: ';', // 鏈接符, 兩個 js 文件之間 以 ; 鏈接 }, // 選項 dist: { src: ['src/js/*.js'], // 要合併的 源文件 dest: 'dist/built.js', // 輸出到的 新文件 }, // 合併 }, // 執行任務的任務名 }); // 當 grunt 執行時,要加載的插件。 grunt.loadNpmTasks('grunt-contrib-concat'); // 註冊 構建任務 列表。 grunt.registerTask('default', []); // 默認任務,依賴爲 [] };
(3) 執行 concat 任務
grunt concat
(4) 科學的 Gruntfile.js打包路徑:
(5) index.html 調用下 js 看看效果
<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html" charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1"> <meta name="viewport" content="width=device-width,initial-scale=1.0"> <link rel="shortcut icon" href="https://img-yunzhi.cdn.bcebos.com/yz-favicon.ico" /> <link rel="bookmark" href="https://img-yunzhi.cdn.bcebos.com/yz-favicon.ico" type="image/x-icon" /> <title>自動化構建 - grunt</title> <script type="text/javascript" src="./static/js/fastclick.js"></script> </head> <body> <div id="app"></div> <script type="text/javascript"> if ('addEventListener' in document) { document.addEventListener('DOMContentLoaded', function() { FastClick.attach(document.body); }, false); } if(!window.Promise) { document.writeln('<script src="https://as.alipayobjects.com/g/component/es6-promise/3.2.2/es6-promise.min.js"'+'>'+'<'+'/'+'script>'); } /* 解決點擊響應延時 0.3s 問題 */ </script> <script type="text/javascript" src="./build/js/build.js"></script> </body> </html>
5. 加入 壓縮 js 的插件 grunt-contrib-uglify , 註冊自動化任務數組
(1) sudo npm install --save-dev grunt-contrib-uglify
(2) 修改 Gruntfile.js
module.exports = function(grunt) { // 初始化配置 grunt 任務. grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), concat: { options: { separator: ';', // 鏈接符, 兩個 js 文件之間 以 ; 鏈接 }, // 選項 dist: { src: ['src/js/*.js'], // 要合併的 源文件 dest: 'build/js/build.js', // 輸出到的 新文件 }, // 合併 }, // concat 執行 合併任務 的任務名 uglify: { options: { // 壓縮文件的 頂部註釋 banner: '/*! <%= pkg.name %> - v<%= pkg.version %> - ' + '<%= grunt.template.today("yyyy-mm-dd") %> */' }, build: { files: { 'build/js/build.min.js': ['build/js/build.js'] } } } // uglify 執行 壓縮任務 的任務名 }); // 當 grunt 執行時,要加載的插件。 grunt.loadNpmTasks('grunt-contrib-concat'); grunt.loadNpmTasks('grunt-contrib-uglify'); // 註冊 構建任務 列表。 grunt.registerTask('default', [ 'concat', 'uglify' ]); // 默認任務,依賴爲 [], 執行 'grunt default' / 'grunt' 後,會順序執行數組裏的任務 };
(3) 執行 grunt
6. 默認任務的 數組,會同步,順序執行,因此前後順序很重要
7. 加入 js-hint 語法檢查插件
(1) sudo npm install --save-dev grunt-contrib-jshint
(2) 建立並配置 .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"] }
(3) 配置 Gruntfile.js
module.exports = function(grunt) { // 初始化配置 grunt 任務. grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), concat: { options: { separator: ';', // 鏈接符, 兩個 js 文件之間 以 ; 鏈接 }, // 選項 dist: { src: ['src/js/*.js'], // 要合併的 源文件 dest: 'build/js/build.js', // 輸出到的 新文件 }, // 合併 }, // concat 執行 合併任務 的任務名 uglify: { options: { // 壓縮文件的 頂部註釋 banner: '/*! <%= pkg.name %> - v<%= pkg.version %> - ' + '<%= grunt.template.today("yyyy-mm-dd") %> */' }, build: { files: { 'build/js/build.min.js': ['build/js/build.js'] } } }, // uglify 執行 壓縮任務 的任務名 jshint : { options: { jshintrc : '.jshintrc' //指定配置文件 }, build : ['Gruntfile.js', 'src/js/*.js'] //指定檢查的文件 }, }); // 當 grunt 執行時,要加載的插件。 grunt.loadNpmTasks('grunt-contrib-concat'); grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.loadNpmTasks('grunt-contrib-jshint'); // 註冊 構建任務 列表。 grunt.registerTask('default', [ 'concat', 'uglify', 'jshint' ]); // 默認任務,依賴爲 [], 執行 'grunt default' / 'grunt' 後,會順序執行數組裏的任務 };
(4) 構建
grunt
8. 加入 合併壓縮 css 的插件
(1) sudo npm install --save-dev grunt-contrib-cssmin
(2) 配置 Gruntfile.js
module.exports = function(grunt) { // 初始化配置 grunt 任務. grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), concat: { options: { separator: ';', // 鏈接符, 兩個 js 文件之間 以 ; 鏈接 }, // 選項 dist: { src: ['src/js/*.js'], // 要合併的 源文件 dest: 'build/js/build.js', // 輸出到的 新文件 }, // 合併 }, // concat 執行 合併任務 的任務名 uglify: { options: { // 壓縮文件的 頂部註釋 banner: '/*! <%= pkg.name %> - v<%= pkg.version %> - ' + '<%= grunt.template.today("yyyy-mm-dd") %> */' }, build: { files: { 'build/js/build.min.js': ['build/js/build.js'] } } }, // uglify 執行 壓縮任務 的任務名 jshint : { options: { jshintrc : '.jshintrc' //指定配置文件 }, build : ['Gruntfile.js', 'src/js/*.js'] //指定檢查的文件 }, // 語法檢查插件 cssmin: { options: { shorthandCompacting: false, roundingPrecision: -1 }, build: { files: { 'build/css/build.min.css': ['src/css/*.css'] } } } // css 合併壓縮插件 }); // 當 grunt 執行時,要加載的插件。 grunt.loadNpmTasks('grunt-contrib-concat'); grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.loadNpmTasks('grunt-contrib-jshint'); grunt.loadNpmTasks('grunt-contrib-cssmin'); // 註冊 構建任務 列表。 grunt.registerTask('default', [ 'concat', 'uglify', 'jshint', 'cssmin' ]); // 默認任務,依賴爲 [], 執行 'grunt default' / 'grunt' 後,會順序執行數組裏的任務 };
(3) 構建
grunt
9. 實現 watch 監視文件修改任務,實現自動打包編譯
(1) sudo npm install --save-dev grunt-contrib-watch
(2) 修改 Gruntfile.js
module.exports = function(grunt) { // 初始化配置 grunt 任務. grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), concat: { options: { separator: ';', // 鏈接符, 兩個 js 文件之間 以 ; 鏈接 }, // 選項 dist: { src: ['src/js/*.js'], // 要合併的 源文件 dest: 'build/js/build.js', // 輸出到的 新文件 }, // 合併 }, // concat 執行 合併任務 的任務名 uglify: { options: { // 壓縮文件的 頂部註釋 banner: '/*! <%= pkg.name %> - v<%= pkg.version %> - ' + '<%= grunt.template.today("yyyy-mm-dd") %> */' }, build: { files: { 'build/js/build.min.js': ['build/js/build.js'] } } }, // uglify 執行 壓縮任務 的任務名 jshint : { options: { jshintrc : '.jshintrc' //指定配置文件 }, build : ['Gruntfile.js', 'src/js/*.js'] //指定檢查的文件 }, // 語法檢查插件 cssmin: { options: { shorthandCompacting: false, roundingPrecision: -1 }, build: { files: { 'build/css/build.min.css': ['src/css/*.css'] } } }, // css 合併壓縮插件 watch : { scripts : { files : ['src/js/*.js', 'src/css/*.css'], tasks : ['concat', 'jshint', 'uglify', 'cssmin'], options : {spawn : false}//增量更新---全量更新 } } }); // 當 grunt 執行時,要加載的插件。 grunt.loadNpmTasks('grunt-contrib-concat'); grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.loadNpmTasks('grunt-contrib-jshint'); grunt.loadNpmTasks('grunt-contrib-cssmin'); grunt.loadNpmTasks('grunt-contrib-watch'); // 註冊 構建任務 列表。 grunt.registerTask('default', [ 'concat', 'uglify', 'jshint', 'cssmin' ]); // 默認任務,依賴爲 [], 執行 'grunt default' / 'grunt' 後,會順序執行數組裏的任務 grunt.registerTask('build', ['default']); grunt.registerTask('dev', ['default', 'watch']); };
(3) grunt dev