序
使用构建工具去对 JS、CSS、HTML、LESS、IMG 等进行合并压缩构建到最后实现自动化构建项目。是前端工程师必备的技能之一
- 什么是项目构建?
- 编译项目中的js,sass,less
- 合并js/css等资源文件
- 压缩js/css/html等资源文件
- js语法的检查
- 构建工具的作用?
- Grunt中文官网
- 是一套前端自动化构建工具,一个基于nodeJs的命令行工具
- 它是一个任务运行器, 配合其丰富强大的插件
- 常用功能:
- 合并文件(js/css)
- 压缩文件(js/css)
- 语法检查(js)
- less/sass预编译处理
安装
举例创建一个简单的应用grunt_test
1
2
3
4
5
6
7
8
9
10
11
12
13|- build----------构建生成的文件所在的文件夹
|- src------------源码文件夹
|- js---------------js源文件夹
|- css--------------css源文件夹
|- index.html-----页面文件
|- Gruntfile.js---grunt配置文件(去官网获取,注意首字母大写)
|- package.json---项目包配置文件
{
"name": "grunt_test",
"version": "1.0.0"
}
```
* 安装nodejs, 查看版本node -v
1
* 全局安装 grunt-cli
npm install -g grunt-cli
1
* 安装grunt
npm install grunt –save-dev
1
* 运行构建项目命令
grunt //提示 Warning: Task “default” not found
1
2
3
4
5
6
7* 配置文件: Gruntfile.js
* 此配置文件本质就是一个node函数类型模块
* 配置编码包含3步:
1. 初始化插件配置
2. 加载插件任务
3. 注册构建任务
* 基本编码:官网有详细介绍
module.exports = function(grunt){// 1. 初始化插件配置 grunt.initConfig({ //主要编码处 }); // 2. 加载插件任务 // grunt.loadNpmTasks('grunt-contrib-concat'); // 3. 注册构建任务 grunt.registerTask('default', []);
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21* 命令: 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-requirejs**——合并压缩requirejs管理的所有js模块文件
* grunt-contrib-watch——实时监控文件变化、调用相应的任务重新执行
## 合并js: 使用concat插件
* 命令:npm install grunt-contrib-concat –save-dev
1
2
3
* 配置: Gruntfile.js
* 配置任务:concat: { options: { //可选项配置 separator: ';' //使用;连接合并 }, build: { //此名称任意 src: ["src/js/*.js"], //合并哪些js文件 dest: "build/js/built.js" //输出的js文件 } }
grunt.loadNpmTasks('grunt-contrib-concat');1
* 加载插件:
grunt.registerTask('default', ['concat']);1
* 注册任务:
grunt //会在build下生成一个built.js1
2* **grunt执行任务是同步的**,插件顺序要放对
* 命令:1
2
3
4
5
## 压缩js: 使用uglify插件
* 先合并后压缩
* 下载npm install grunt-contrib-uglify –save-dev
1
2* 配置: Gruntfile.js
* 配置任务: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.min.js': ['build/js/built.js'] } } }
grunt.loadNpmTasks('grunt-contrib-uglify');1
* 加载任务:
grunt.registerTask('default', ['concat', 'uglify']);1
* 注册任务:
grunt //会在build下生成一个压缩的js文件1
* 命令:
1
2
3
## js语法检查: 使用jshint插件
* 命令:npm install grunt-contrib-jshint –save-dev
1
* 编码: 创建.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"]
}
1
2
3
* 配置 : Gruntfile.js
* 配置任务:jshint : { options: { jshintrc : '.jshintrc' //指定配置文件 }, build : ['Gruntfile.js', 'src/js/*.js'] //指定检查的文件 }
grunt.loadNpmTasks('grunt-contrib-jshint');1
* 加载任务:
grunt.registerTask('default', ['concat', 'uglify', 'jshint']);1
* 注册任务:
grunt //提示变量未定义和语句后未加分号 -->修改后重新编译1
* 命令:
1
2
3
## 压缩/合并css文件:使用cssmin插件
* 安装:npm install grunt-contrib-cssmin –save-dev
1
2* 配置 : Gruntfile.js
* 配置任务:cssmin:{ options: { shorthandCompacting: false,//快速压缩 roundingPrecision: -1//精确度 }, build: { files: { 'build/css/output.min.css': ['src/css/*.css'] } } }
grunt.loadNpmTasks('grunt-contrib-cssmin');1
* 加载任务:
grunt.registerTask('default', ['concat', 'uglify', 'jshint', 'cssmin']);1
* 注册任务:
grunt //在build/css/下生成output.min.css1
* 命令:
watch : { scripts : { files : ['src/js/*.js', 'src/css/*.css'], tasks : ['concat', 'jshint', 'uglify', 'cssmin'], options : {spawn : false} } }1
2
3
4
5
6
## 使用watch插件:(真正实现自动化-实时监控文件变化、调用相应的任务重新执行)
* 命令: npm install grunt-contrib-watch --save-dev
* 配置 : Gruntfile.js
* 配置任务:grunt.loadNpmTasks('grunt-contrib-watch');1
* 加载任务:
grunt.registerTask('default', ['concat', 'uglify', 'jshint', 'watch']); 改进:grunt.registerTask('myWatch', ['default','watch']);1
* 注册任务:
grunt //控制台提示watch已经开始监听, 修改保存后自动编译处理 ```1
* 命令: