1. Grunt 的介绍和使用
参考链接:http://www.gruntjs.net/ Grunt中文网
为何要用构建工具?
一句话:自动化。对于需要反复重复的任务,例如压缩(minification)、编译、单元测试、linting等,自动化工具可以减轻你的劳动,简化你的工作。当你在 Gruntfile 文件正确配置好了任务,任务运行器就会自动帮你或你的小组完成大部分无聊的工作。
为什么要使用Grunt?
Grunt生态系统非常庞大,并且一直在增长。由于拥有数量庞大的插件可供选择,因此,你可以利用Grunt自动完成任何事,并且花费最少的代价。如果找不到你所需要的插件,那就自己动手创造一个Grunt插件,然后将其发布到npm上吧。先看看入门文档吧。
可用的Grunt插件
你所需要的大多数task都已经作为Grunt插件被开发了出来,并且每天都有更多的插件诞生。插件列表页面列出了完整的清单。下面给出几个你可能听说过的插件:
- CoffeeScript 它和思想跟 Ruby 特别的像,是我们可以更简单的去写 JS ,它使得我们整个的书写 JS 变得十分简单
- handlebars 它是有个模板引擎
- jade 它也是有个模板引擎
- JS Hint 它是一个代码检查工具,他可以把我们平常团队规范的 JS 进行规整,不让每个人去随意地书写 JS ,它有一个完整的列表,可以根据我们整个 Team 相关的需要把我们的配置写到它的配置文件里面,这个时候大家就都必须遵守这个配置进行书写
- Less 它是一个 css 预处理器,可以让 css 像编程一样去书写
- REQUIRE.JS 它是一个 JS 模块化的工具,也是一个非常伟大的库
- Sass 它也是一个 css 预处理器,跟 Less 所做的功能差不多
- Stylus 它也是一个 css 预处理器,跟 Less 所做的功能差不多
2. Grunt 的安装
参考链接:http://www.gruntjs.net/getting-started Grunt 快速入门
- 安装 CLI ``` npm install -g grunt-cli
上述命令执行完后,`grunt` 命令就被加入到你的系统路径中了,以后就可以在任何目录下执行此命令了。<br />注意,安装`grunt-cli`并不等于安装了 Grunt!<br />
Grunt CLI的任务很简单:调用与`Gruntfile`在同一目录中 Grunt。这样带来的好处是,允许你在同一个系统上同时安装多个版本的 Grunt。<br />
这样就能让多个版本的 Grunt 同时安装在同一台机器上。<br />CLI 是如何工作的<br />
每次运行`grunt`时,他就利用node提供的`require()`系统查找本地安装的 Grunt。正是由于这一机制,你可以在项目的任意子目录中运行`grunt`。<br />
2. 在桌面新建一个 grunttest 文件夹,并在 命令行中进入该目录下
cd Desktop cd grunttest
3. Grunt CLI 已经正确安装,还需要在项目中新建两个文件 package.json 和 Gruntfile,这两个是 运行 Grunt 必须有的文件
3. 项目初始化,生成 package.json 文件
3. 在项目中安装 grunt 工具
cnpm install grunt —save-dev
6. 此时运行 grunt ,命令行中会报如下错误
> <br />
无法找到 gruntfile ,gruntfile 是项目中写任务的文件 它可以是一个文件也可是是一个文件夹
7. 在项目中新建一个 gruntfile.js 文件
7. 运行 grunt ,命令行中会报如下错误
> <br />
这个是因为我们并没有书写需要执行什么任务的代码,现在安装步骤已经完成了<br />
#3. Grunt 的应用<br />
参考链接:[http://www.gruntjs.net/configuring-tasks](http://www.gruntjs.net/configuring-tasks) Grunt 配置任务
1. 在之前的项目中新建文件 结构如下
> js -> index.js<br />
js -> main.js<br />
index.html<br />
build<br />
dest
2. 编辑文件<br />
index.js
var index = index || {}; index = { init:function(argument) { console.log(‘index init’); } } index.init();
main.js
function test(argument) { this.a = 1; }; test.prototype.method_name = function(){ console.log(this.a); };
gruntfile.js 暂时配置了第一个 `uglify` 压缩任务
//不需要 require 直接以模块的形式便可以把 grunt 引入进来 module.exports = function(grunt) { //grunt 初始化 grunt.initConfig({ pkg: grunt.file.readJSON(‘package.json’), //压缩 uglify: { options:{ //后面的命令是 grunt 模块自带的命令,他创建了一个时间 banner:’/! create by <%= grunt.template.today(“yyyy-mm-dd”) %> /\n’ }, //这个是帮我们找到静态资源所对应的目录 它可以把我们的静态资源指定 从哪来 到哪去 static_mappings:{ //files 可以支持数组进行批量的操作 files:[{ //从哪来 src:’js/index.js’, //到哪去 dest:’build/index.min.js’ },{ src:’js/main.js’, dest:’build/main.min.js’ }] } }, //合并 concat: {
},
//观察本地文件的变化,让他去可以工作
watch: {
}
});
//加载上面初始化时配置的插件 这些需要的包都需要在命令行中进行安装 --save-dev
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.loadNpmTasks('grunt-contrib-watch');
//默认被执行的任务列表
grunt.registerTask('default',['uglify'])
}
3. 安装在 gruntfile.js 文件中所用到的三个插件
cnpm install grunt-contrib-uglify —save-dev cnpm install grunt-contrib-concat —save-dev cnpm install grunt-contrib-watch —save-dev
4. 运行程序 `grunt`,如下图所示,执行成功了
> 
5. 因为上面的执行任务列表只写了 uglify 压缩命令,此时去查看 build 文件夹会发现里面多出了 一个 index.min.js 和 main.min.js 文件<br />
index.min.js
/! create by 2017-11-25 /
var index=index||{};(index={init:function(i){console.log(“index init”)}}).init();
main.min.js
/! create by 2017-11-25 /
function test(t){this.a=1}test.prototype.method_name=function(){console.log(this.a)};
这两个文件就是将 index.js 和 main.js 文件压缩后得到的对应的两个文件<br />
6. 编辑 gruntfile.js 文件 添加 `concat` 合并命令
//合并 concat: { bar: { src: [‘build/*.js’], dest: ‘dest/all.min.js’ } }
//默认被执行的任务列表 grunt.registerTask(‘default’, [‘uglify’,’concat’])
7. 运行程序 `grunt`,命令行中显示如下图,证明运行成功了
> 
8. 此时会发现在 dest 文件夹下新增了一个 all.min.js 文件<br />
all.min.js
/! create by 2017-11-25 /
var index=index||{};(index={init:function(i){console.log(“index init”)}}).init(); /! create by 2017-11-25 /
function test(t){this.a=1}test.prototype.method_name=function(){console.log(this.a)};
这个文件将压缩好的 index.min.js 和 main.min.js 文件给合并在了一起<br />
9. 还有一个是 `watch` 插件,它主要是可以在运行程序后,你又去修改 类似于 index.js 这样的文件后,它可以自动观察到你的修改操作自动执行 后面自定义的行为 (uglify,concat)<br />
编辑 gruntfile.js 文件
//观察本地文件的变化,让他去可以工作 watch: { //这里以数组的方式设置需要观察的文件 files:[‘js/index.js’,’js/main.js’], //这里是以数组的方式定义需要执行的任务列表 tasks:[‘uglify’,’concat’] }
//默认被执行的任务列表 grunt.registerTask(‘default’, [‘uglify’,’concat’,’watch’])
10 . 此时运行程序 `grunt`,你会发现在命令行中程序并没有结束
> 
然后再编辑器中修改 index.js 文件
var index = index || {}; index = { init:function(argument) { console.log(‘index ok’); } } index.init();
`ctrl + s` 保存相应的操作,你会发现在命令行中又多了几行操作提示,是说它观察到了 你修改了 index.js 文件 然后它又自动重新执行了一遍 `uglify` `concat` 任务
> 
查看此时的 index.min.js 和 all.min.js 文件,会发现它们也将你刚才修改的一些代码进行了同步<br />index.min.js
/! create by 2017-11-25 /
var index=index||{};(index={init:function(i){console.log(“index ok”)}}).init();
all.min.js
/! create by 2017-11-25 /
var index=index||{};(index={init:function(i){console.log(“index ok”)}}).init(); /! create by 2017-11-25 /
function test(){this.a=1}test.prototype.method_name=function(){console.log(this.a)};
``
修改 main.js 文件,也会得到相应的更新,这便是
watch` 观察插件的作用
- 更多的使用技巧可以到官网自行查看学习
参考链接:http://www.gruntjs.net/sample-gruntfile Gruntfile 实例
http://www.gruntjs.net/creating-tasks 创建任务