为保证作者版权在此声明本文部分摘自
http://yujiangshui.com/grunt-basic-tutorial/
另,参考文章

http://www.tuicool.com/articles/yABV73

及官方英文文档
http://gruntjs.com/plugins

开始学习 Grunt

它就是一个工具框架,有很多插件扩展它的功能。

是一套前端自动化工具,基于nodeJS的命令行工具,一般用于:

① 压缩文件

②合并文件

③简单语法检查

Grunt 基于 Node.js ,用 JS 开发,这样就可以借助 Node.js 实现跨系统跨平台的桌面端的操作,例如文件操作等等。此外,Grunt 以及它的插件们,都作为一个 包 ,可以用 NPM 安装进行管理。

所以 NPM 生成的 package.json 项目文件,里面可以记录当前项目中用到的 Grunt 插件,而 Grunt 会调用 Gruntfile.js 这个文件,解析里面的任务(task)并执行相应操作。

如果你对 Node.js、NPM 这些名词不太熟悉,建议先去搜索了解一下,因为下面的命令会涉及到它们,但是本文不会过多介绍。

安装 Grunt

Grunt 依赖 Node.js 所以在安装之前确保你安装了 Node.js。(可在官网上下载)然后开始安装 Grunt。

实际上,安装的并不是 Grunt,而是 Grunt-cli,也就是命令行的 Grunt,这样你就可以使用 grunt 命令来执行某个项目中的 Gruntfile.js 中定义的 task 。但是要注意,Grunt-cli 只是一个命令行工具,用来执行,而不是 Grunt 这个工具本身。

安装 Grunt-cli 需要使用 NPM,使用下面一行即可在全局范围安装 Grunt-cli ,换句话说,就是你可以在任何地方执行 grunt 命令:

npm install -g grunt-cli

需要注意,因为使用 -g 命令会安装到全局,可能会涉及到系统敏感目录,如果用 Windows 的话,可能需要你用管理员权限,如果用 OS X / Linux 的话,你可能需要加上 sudo 命令。

下面我们新建一个项目目录,并新建一些文件,这里我准备了一份很简单的项目,放在了 Github 上,下面操作将以此来操作,你可以下载或者 clone 下来: https://github.com/yujiangshui/gruntxx

生成 package.json 文件

这个 package.json 文件其实是 Node.js 来描述一个项目的文件,JSON 格式。生成这个文件超级简单,推荐用命令行交互式的生成一下:

打开命令行,cd gruntxx 文件夹下面,输入指令 npm init 之后,就出来很多信息,然后开始填写项目名称,填写好了之后回车即可。其实这里你一路回车下去也无妨,但是建议你细细的填一下,不明白的跳过好了。

填写好了之后,查看目录就会发现生成 package.json 文件了,这样就算生成好了。

其实就是一个文件而已,你觉得这种方式麻烦,完全可以新建一个文件,然后将类似下面的代码复制进去,改一下对应选项,保存成 package.json 文件就可以:

{ "name": "my-project-name", "version": "0.1.0", "devDependencies": { } }

最后我生成的代码如下:

{"name": "gruntxx","version": "0.0.1","description": "学习 grunt","repository": {"type": "git","url": "https://github.com/yujiangshui/gruntxx.git"},"author": "Jiangshui","license": "MIT","bugs": {"url": "https://github.com/yujiangshui/gruntxx/issues"},"homepage": "https://github.com/yujiangshui/gruntxx"
}

但这时我们还没有在项目文件中安装 Grunt 以及相关任务插件。

安装 Grunt 和所需要的插件

就现在的这个示例项目而言,我打算让 Grunt 帮忙实现下面几个功能:检查每个 JS 文件语法、合并两个 JS 文件、将合并后的 JS 文件压缩、将 SCSS 文件编译、新建一个本地服务器监听文件变动自动刷新 HTML 文件。

差不多就是这些,根据这些任务需求,需要用到:

  • 合并文件:grunt-contrib-concat
  • 语法检查:grunt-contrib-jshint
  • Scss 编译:grunt-contrib-sass
  • 压缩文件:grunt-contrib-uglify
  • 监听文件变动:grunt-contrib-watch
  • 建立本地服务器:grunt-contrib-connect

它们的命名和文档都很规范,因为这些是官方提供的比较常用的插件。这些插件同时都是 NPM 管理的包,比如 grunt-contrib-concat - npm 你也可以在这上面看到用法等。

下面我们就要在这个项目中安装这些插件,执行命令:

npm install grunt --save-dev

表示通过 npm 安装了 grunt 到当前项目,同时加上了 —save-dev 参数,表示会把刚安装的东西添加到 package.json 文件中。不信你打开 package.json 文件看下,是不是多了

"devDependencies": { "grunt": "^0.4.5" }

没错,这个的意思就是当前项目依赖 grunt,后面是它的版本,咱们不用管。如果安装的时候没有添加 —save-dev 参数,这里就不会出现了,你需要自行添加上去。

下面我们来安装 Grunt 的插件,当然,不需要一个个的安装,太麻烦了,我们可以:

npm install --save-dev grunt-contrib-concat grunt-contrib-jshint grunt-contrib-sass grunt-contrib-uglify grunt-contrib-watch grunt-contrib-connect

等待一大串乱七八糟的下载状态,我们把 grunt 和相关插件都安装好了,不信看下是不是多了一个 node_modules 文件夹?打开看下,里面就是咱们刚安装的插件。

配置 Gruntfile.js 的语法

插件也装好了,开始写任务吧!既然是要程序来读取执行,必要要有一定的语法规范,下面来简单的说一下:

首先要明白,这是一个 JS 文件,你可以写任意的 JS 代码,比如声明一个 对象 来存储一会要写任务的参数,或者是一个变量当作开关等等。

然后,所有的代码要包裹在

module.exports = function(grunt) { ... };

里面。没有为什么。

在这里面的代码,除去你自己写的乱七八糟的 JS,与 Grunt 有关的主要有三块代码:任务配置代码插件加载代码任务注册代码

顾名思义,这三块代码,任务配置代码就是调用插件配置一下要执行的任务和实现的功能,插件加载代码就是把需要用到的插件加载进来,任务注册代码就是注册一个 task,里面包含刚在前面编写的任务配置代码。

这样,就可以用 grunt 来执行注册的一个 task 从而根据任务配置代码调用需要的插件来执行相应的操作。

下面来分别看一下这三块代码的写法。

任务配置代码

 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'}}});

可以看出,具体的任务配置代码以对象格式放在 grunt.initConfig 函数里面,其中先写了一句 pkg: grunt.file.readJSON('package.json') 功能是读取 package.json 文件,并把里面的信息获取出来,方便在后面任务中应用(例如下面就用了 <%= pkg.name %> 来输出项目名称),这样可以提高灵活性。之后就是 uglify 对象,这个名字是固定的,表示下面任务是调用 uglify 插件的,首先先配置了一些全局的 options 然后新建了一个 build 任务。

也就是说,在 Uglify 插件下面,有一个 build 任务,内容是把 XX.js 压缩输出到 xx.min.js 里面。如果你需要更多压缩任务,也可以参照 build 多写几个任务。

至于怎么写出来 options 里面的参数和 build 里面的参数内容,这才是 grunt 学习的难点,你需要查看每个插件的用法,根据用法来编写任务,可以看下 grunt-contrib-uglify 的官方文档,往下面拉你就可以看到参数和使用方法了。

这样,我们就新建了一个基于 uglify 的任务 build,功能是把 src/<%= pkg.name %>.js 压缩输出 build/<%= pkg.name %>.min.js

插件加载代码

这个就超级简单了,由于上面任务需要用到 grunt-contrib-uglify,当 grunt-contrib-uglify 安装到我们的项目之后,写下下面代码即可加载:

grunt.loadNpmTasks('grunt-contrib-uglify');

任务注册代码

插件也加载了,任务也布置了,下面我们得注册一下任务,使用

grunt.registerTask('default', ['uglify']);

来注册一个任务。上面代码意思是,你在 default 上面注册了一个 Uglify 任务,default 就是别名,它是默认的 task,当你在项目目录执行 grunt 的时候,它会执行注册到 default 上面的任务。

也就是说,当我们执行 grunt 命令的时候,uglify 的所有代码将会执行。我们也可以注册别的 task,例如:

grunt.registerTask('compress', ['uglify:build']);

如果想要执行这个 task,我们就不能只输入 grunt 命令了,我们需要输入 grunt compress 命令来执行这条 task,而这条 task 的任务是 uglify 下面的 build 任务,也就是说,我们只会执行 uglify 里面 build 定义的任务,而不会执行 uglify 里面定义的其他任务。

这里需要注意的是,task 的命名不能与后面的任务配置同名,也就是说这里的 compress 不能命名成 uglify,这样会报错或者产生意外情况

OK,加上这三块代码,我们的示例 Gruntfile.js 就是这样子的:

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']); }; 

这就是官方那个坑爹示例,貌似 uglify 的参数好像不对,反正我之前学习的时候,没法运行这个配置,下面我们来根据示例项目和我们的需求配置一下。

配置 Gruntfile.js

先从简单的入手,我们先来配置一下编译 Scss 文件的 task。先新建一个 Gruntfile.js 文件,把大体的配置结构复制进去:

module.exports = function(grunt) {var sassStyle = 'expanded'; grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), sass: { } }); grunt.loadNpmTasks('grunt-contrib-sass'); grunt.registerTask('outputcss',['sass']); grunt.registerTask('default'); }; 

应该可以看懂把?这里不再赘述了,我们来根据 Sass 文档,编写一个 Sass 任务 output :

module.exports = function(grunt) {var sassStyle = 'expanded'; grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), sass: { output : { options: { style: sassStyle }, files: { './style.css': './scss/style.scss' } } } }); grunt.loadNpmTasks('grunt-contrib-sass'); grunt.registerTask('outputcss',['sass']); grunt.registerTask('default'); }; 

意思就是将 ./scss/style.scss 这个文件以 sassStyle 变量存储的方式编译成 根目录下面的 style.css 文件。

下面拿起命令行,cd 到当前文档目录,执行一下 grunt 命令,结果报错 undefined,没错,因为我们的 default task 里面没有定义任何任务,然后执行 grunt outputcss 命令,提示编译 Scss 文件成功,当然前提是你的 Scss 语法正确,如果有问题就不会成功。

下面我们打算先把 src 目录下面的两个 JS 文件合并起来,然后再用 jshint 检测一下是否有语法问题,如果正确,再用 uglify 对合并起来的文件进行压缩。

参照 grunt-contrib-concat 的官方文档,我们可以写出下面的任务:

module.exports = function(grunt) {var sassStyle = 'expanded'; grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), sass: { output : { options: { style: sassStyle }, files: { './style.css': './scss/style.scss' } } }, concat: { options: { separator: ';', }, dist: { src: ['./src/plugin.js', './src/plugin2.js'], dest: './global.js', }, } }); grunt.loadNpmTasks('grunt-contrib-sass'); grunt.loadNpmTasks('grunt-contrib-concat'); grunt.registerTask('outputcss',['sass']); grunt.registerTask('concatjs',['concat']); grunt.registerTask('default'); }; 

执行 grunt concatjs 之后,就会发现根目录多了一个 global.js 文件,里面是两个文件合并起来的。然后类似的继续看 uglify 和 jshint 的文档,我们就可以根据需求写出下面任务:

module.exports = function(grunt) {var sassStyle = 'expanded'; grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), sass: { output : { options: { style: sassStyle }, files: { './style.css': './scss/style.scss' } } }, concat: { options: { separator: ';', }, dist: { src: ['./src/plugin.js', './src/plugin2.js'], dest: './global.js', }, }, uglify: { compressjs: { files: { './global.min.js': ['./global.js'] } } }, jshint: { all: ['./global.js'] } }); grunt.loadNpmTasks('grunt-contrib-sass'); grunt.loadNpmTasks('grunt-contrib-concat'); grunt.loadNpmTasks('grunt-contrib-jshint'); grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.registerTask('outputcss',['sass']); grunt.registerTask('concatjs',['concat']); grunt.registerTask('compressjs',['concat','jshint','uglify']); grunt.registerTask('default'); }; 

其中注册了一个 compressjs 任务 grunt.registerTask('compressjs',['concat','jshint','uglify']); 意思就是依次执行 合并、检查、压缩 任务。我们把刚生成的 global.js 文件删掉,在命令行执行 grunt compressjs 任务,结果 jshint 报错了:

未完待续····

转载于:https://www.cnblogs.com/chaoran/p/4782531.html

菜鸟进阶——grunt相关推荐

  1. Python大佬 | 菜鸟进阶必备的九大技能!

    来源:CSDN 本文约4000字,建议阅读5分钟 本文介绍了Python菜鸟进阶大佬的必备技能. Python是一种很棒的语言,语法简单,无需在代码中搜索分号.对于初学者来说,Python是入门最简单 ...

  2. 菜鸟进阶: C++实现KNN文本分类算法

    作者:finallyliuyu(转载请注明原作者和出处) (代码暂不发布源码下载版,以后会发布) KNN文本分类算法又称为(k nearest neighhor).它是一种基于事例的学习方法,也称懒惰 ...

  3. JVM菜鸟进阶高手之路

    本文转载自公众号  匠心零度 问题现象 代码如下,使用 ParNew + Serial Old 回收器组合与使用 ParNew + CMS 回收器组合时,结果为什么差异如此之大 ? private s ...

  4. 菜鸟进阶:在Mac上安装Tomcat+Jenkins

    前期准备: 没啥别的好说,装好jar包就完事了 自行百度jar包安装.环境变量配置,然后继续! 前方警告⚠️ 有Homebrew的可以不用看了 // 命令行输入brew install jenkins ...

  5. 2016Bytecup之菜鸟进阶

    2016Bytecup之菜鸟进阶 写在前面:好久没写文章了,最近两个月忙成狗,基本上都是白天实验室做项目,晚上抽时间打比赛.学习.今年上半年开始入门,然后断断续续参加了几个比赛,大多都是水过去了,感觉 ...

  6. Mac菜鸟进阶必学的10个Mac小技巧

    Mac系统中的菜鸟用户想要进阶为大神,要学会一些Mac系统的操作技巧,进而简化工作流程提升工作效率.而如何快速掌握Mac操作技巧呢?下面我们分享几个Mac小技巧. 1.在多个桌面之间切换 如果您使用多 ...

  7. C++菜鸟进阶之破解vs2010

    最近在学习C++,女,数学一般,额,一般吧,说自己差的话真的就怕要放弃了.逻辑自认为一般般,但是我觉得逻辑思维能力可以通过学习稍微加强一点对不对,不接受任何反驳来打击我的积极性! 认识一位大神,因为是 ...

  8. 单片机c语言全程图文教程,单片机C语言,从小白到菜鸟进阶教程(超详细代码解读)...

    首先要认识单片机是啥?单片机语言是啥?单片机是一种可存储可读写可编程可运行的芯片,你写啥它就运行啥,运行出错,那你程序写错了.单片机语言,嗯!确定要学C啊!有哪一种语言能够抗衡C的强大地位?没有!哪一 ...

  9. 菜鸟进阶高手, 推荐 7 个 Python 上手实战项目

    作为一个语法简洁.有着丰富的第三方库的编程语言,Python 上手极为简单,短时间内就可以让你编写出能够解决实际问题的小程序,甚至去面试初级 Python 工程师的职位. 不过,如果要写出一些更复杂的 ...

最新文章

  1. C++_泛型编程与标准库(一)
  2. qmail+spamassassin启用spf过滤
  3. 递归算法学习系列之八皇后问题
  4. Min_25 筛小结
  5. leetcode 149. 直线上最多的点数
  6. ubuntu安装spark-2.4.7-bin-without-hadoop
  7. java环境配置 Windows10
  8. 为什么二维码这么神奇,扫一下就能得到各种各样的信息?
  9. Python办公自动化--Word、Excel、PDF
  10. name after, name for, name as
  11. 白云机场停车费一天要多少钱,广州白云机场t2航站楼最近停车场
  12. RUBY发送验证码通知短信(互亿无线)
  13. [Linux]CentOS修改YUM镜像地址提高下载速度
  14. Java 分割字符串---按字节长度分割带有中文字符串
  15. 第六天----数据结构笔记
  16. Unity3D制作巡逻兵小游戏
  17. 冒泡,选择,插入排序
  18. 量子计算机错误率,读创--迄今错误率最低量子比特面世 有望推进量子计算机研发...
  19. 十六周实验报告 任务二
  20. 什么是蓝筹股| 一线蓝筹股|二线蓝筹

热门文章

  1. 1.项目体系架构设计(电商推荐系统)
  2. JAVA环境变量设置win7(JDK安装后的配置)
  3. 爱情36技之一劳永逸
  4. Java并发包的灵魂AbstractQueuedSynchronizer
  5. springboot+vue+nodejs休闲娱乐电玩城网上售票系统java
  6. 头条百科怎么做?如何创建头条百科词条。
  7. 虚拟机安装Ubuntu18.04系统
  8. python调用键盘驱动_python+selenuim自动化测试(三)键盘的操作
  9. ST7920LCD12864反白显示
  10. oracle转义单引号,Oracle 单引号 双引号 转义符 分隔符