Grunt 簡單入門
Grunt 是一個基于Nodejs的自動化任務執行工具。那么什么是任務執行工具呢,其實就是按照之前編定好的規則執行任務的一個工具。
下面是Grunt的簡單使用方法。
安裝Grunt
首先要安裝nodejs(包含npm)。通過 npm install -g grunt
來安裝grunt。這個命令僅僅安裝了grunt命令行接口(grunt-cli),還不能在文件夾里運行,需要配置完成才可以。
配置Grunt
Grunt要向運行必須得在在文件夾根目錄下找到配置文件 Gruntfile.js
, 而 Gruntfile.js
依賴與nodejs的配置文件 package.json
。所以項目根目錄下得有package.json
和 Gruntfile.js
兩個配置文件。package.json
可以通過 node init
來生成,而 Gruntfile.js
好像得手工創建。
Gruntfile.js
內的代碼包括四個主要元素:
- 包裹函數
- 項目和任務配置
- 加載Grunt插件和任務
- 自定義任務
下面先貼上整體配置文件再一一分析
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']); };
其中
module.exports= function (grunt) { }
既為包裹函數,其內部的
grunt.initConfig({})
就是Grunt 項目配置函數。這個對象{}
既為配置對象。配置對象內又有各個 任務的配置。
其中 pkg:grunt.file.readJSON('package.json')
是讀取根目錄總的pakcage.json文件,作為配置對象的一個屬性 pkg
,以方便后面的配置使用。
uglify: { options: { banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n' }, build: { src: 'src/<%= pkg.name %>.js', dest: 'build/<%= pkg.name %>.min.js' } }
就是一個任務配置對象,屬性名必須與插件名稱一致。其中的 options
是這個任務的 任務級配置,build
是一個 目標,一個任務可以包含多個目標,目標名稱命名規范與js命名規范一樣(也就是說可以隨意取)。每個目標內還可以有 目標級配置。
目標內的 src
屬性為源文件,dest
為目標文件(保存任務執行結果)。
<% %>
是模版,模版內可以運行javascript代碼,可以訪問任務配置對象內的屬性。
項目配置完成后需要加載Grunt插件 grunt.loadNpmTasks('grunt-contrib-uglify')
最后是自定義任務(可選) grunt.registerTask('default', ['uglify']);
執行Grunt任務
運行之前要確保Gruntfile.js中加載的插件已經安裝了,如果為安裝可以通過 npm install 插件名 --save-dev
來安裝,例如: npm install grunt-contrib-ublify --save-dev
。
如果像上面一樣配置了自定義任務,直接運行 grunt
就可以執行 uglify
任務了。如果沒有配置default,則需要 grunt uglify
來執行 uglify
任務。執行 uglify
任務時會按順序執行它的各個目標,亦可以通過 grunt uglify:build
來單獨執行某個目標。
官方樣例
這里再貼一個官方提供的 Gruntfile.js樣例
module.exports = function(grunt) { grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), concat: { options: { separator: ';' }, dist: { src: ['src/**/*.js'], dest: 'dist/<%= pkg.name %>.js' } }, uglify: { options: { banner: '/*! <%= pkg.name %> <%= grunt.template.today("dd-mm-yyyy") %> */\n' }, dist: { files: { 'dist/<%= pkg.name %>.min.js': ['<%= concat.dist.dest %>'] } } }, qunit: { files: ['test/**/*.html'] }, jshint: { files: ['Gruntfile.js', 'src/**/*.js', 'test/**/*.js'], options: { // options here to override JSHint defaults globals: { jQuery: true, console: true, module: true, document: true } } }, watch: { files: ['<%= jshint.files %>'], tasks: ['jshint', 'qunit'] } }); grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.loadNpmTasks('grunt-contrib-jshint'); grunt.loadNpmTasks('grunt-contrib-qunit'); grunt.loadNpmTasks('grunt-contrib-watch'); grunt.loadNpmTasks('grunt-contrib-concat'); grunt.registerTask('test', ['jshint', 'qunit']); grunt.registerTask('default', ['jshint', 'qunit', 'concat', 'uglify']); };
這個樣例基本可以對付大多數任務了,具體詳細的配置可以看官方文檔