Grunt学习笔记【6】---- grunt-contrib-requirejs插件详解
本文主要讲如何使用Grunt实现RequireJS文件压缩。
一 说明
ES6出来前,RequireJS是JavaScript模块化最常用的方式之一。对于使用RequireJS构建的项目,要实现打包压缩,需要使用grunt-contrib-requirejs插件。
二 安装
npm install grunt-contrib-requirejs --save-dev
三 加载任务
grunt.loadNpmTasks('grunt-contrib-requirejs');
四 配置
在Gruntfile.js的配置对象中添加requirejs属性,该属性下可以配置多个目标任务对象,每个目标任务对象包含一个options对象。
注意:这个options的属性很多和requireJS的requirejs-config.js配置类似,但要注意这块配置是用于Grunt打包的,requirejs-config.js是用于非压缩模式下加载requireJS项目的。同一个项目中,这两个的配置一般情况基本一致,但有时也会有差别。但无论是那个,都要确保各个模块中依赖的模块地址都能找到,即baseUrl、paths、shim等配置必须确保所有模块中依赖的模块地址正确。
options对象有如下属性:
1)appDir
此处是文件Gruntfile的相对位置。
2) baseUrl
baseUrl 为加载文件的默认路径,不写默认路径用grunt打包的时候很容易报错找不到文件。
该路径相对于appDir,代表要查找js文件的起始文件夹,下文所有文件路径的定义都是基于这个baseUrl的。
例如1:设置为 ./src 是相对于index.html的。
例如2:如果appDir设置为‘./app’,baseUrl设置为‘src’,则实际默认路径是‘./app/src’。
3) name
要打包的js入口文件地址和名字。
注意:该地址是相对于baseUrl的。
4) optimize
是否进行混淆优化,可选值:‘uglify’、‘none’。默认值是none。
5) paths
该属性和RequireJs的配置路径项类似,就是对requireJS模块中依赖的地址进行配置。
"paths" : {
'cModule' : 'src/c',
'jquery' : 'lib/jquery'
},
6) shim
该属性和RequireJS的配置项一样,都是为没有使用RequireJS的define()方法声明依赖关系的第三库,来声明各个第三方库的依赖和对外的全局变量。
shim是一个对象, Key 值(cate) 与上边paths中定义的名字一样.每个属性对象有deps和exports两个属性,分别定义该库的依赖和对外全局变量。
例如:AngularJS依赖jquery,AngularJS对外的全局变量是angular;jquery对外的全局变量是$.
"paths" : {
'cModule' : 'src/c',
'jquery' : 'lib/jquery',
'angular' : 'lib/angular'
},
"shim" : { // shim 中定义一个JSON对象, Key 值(cate) 与paths中定义的名字一样
'jquery' : { // shim中的JSON对象有两个属性: deps,exports
'deps' : [], // deps 为数组,表示其依赖的库
'exports' : '$' // exports 表示输出的对象名(标志该第三方库的全局变量标志)
},
'angular' : {
'deps' : ['jquery'],
'export' : 'angular'
}
}
7) out
设置压缩后的文件地址和文件名。
例如:‘dist/test.min.js’。
8)removeCombined
如果为true,将从输出目录中删除已合并的文件。注意:该配置只有在设置了dir情况下生效。
9)dir
保存输出的路径,如果只输出一个文件,可以使用out接口。如果输出多个文件,都会放在dir下。
五 实战
下边是一个实例项目。
5.1 整体项目目录如下:

5.2 Gruntfile.js配置如下:
module.exports = function (grunt) {
grunt.initConfig({
// 清理空文件夹
clean: {
foo1: {
src: ['dist/*']
}
},
requirejs: {
min: {
options: {
baseUrl: './',
optimize: 'none',
name: 'build',
out: 'dist/test.min.js',
// dir: 'dist',
removeCombined: true,
paths: {
cModule: 'src/c',
jquery: 'lib/jquery',
angular: 'lib/angular'
},
shim: {
jquery: {
deps: [],
exports: '$'
},
angular: {
deps: ['jquery'],
exports: 'angular'
}
},
}
}
},
});
grunt.loadNpmTasks('grunt-contrib-requirejs');
grunt.loadNpmTasks('grunt-contrib-clean');
// 默认被执行的任务列表。
grunt.registerTask('default', [
'clean',
'requirejs'
]);
};
5.3 入口文件build.js代码如下:
说明:入口文件必须是一个require()方法模块,而不能是一个define定义模块。不然会报错。
require([
'src/b'
]);
5.4 入口文件中加载的b.js文件代码如下:
define(['src/a', 'cModule/c', 'src/jq/jq', 'src/ng/ng'], function (a, c, jq, ng) {
window.console.log(a.name);
window.console.log(c);
window.console.log(jq);
window.console.log(ng);
var b = 'this is a log!'
return b;
});
5.5 其它各个文件说明:
jq.js文件用于引入jquery库;
ng.js文件用于引入AngularJS库;
其它各个文件都是简单的RequireJS模块文件。
六 实战示例源码
上边实战示例源码获取地址:
https://gitee.com/bangbangwa/grunt/blob/master/grunt-contrib-requirejs-test.rar
参考资料&内容来源:
Grunt官网:https://www.npmjs.com/package/grunt-contrib-requirejs
编程网志:http://www.codeweblog.com/requirejs-angularjs-grunt-contrib-requirejs-%E7%BA%AF%E6%89%8B%E6%95%B2-%E5%B9%B2%E8%B4%A7/
reuqireJS官网:http://www.requirejs.cn/
Grunt学习笔记【6】---- grunt-contrib-requirejs插件详解的更多相关文章
- Grunt学习笔记【8】---- grunt-angular-templates插件详解
本文主要讲如何用Grunt打包AngularJS的模板HTML. 一 说明 AngularJS中使用单独HTML模板文件的地方非常多,例如:自定义指令.ng-include.templateUrl等. ...
- Grunt学习笔记【7】---- grunt-contrib-less插件详解
本文主要讲如何使用Grunt实现less文件压缩. 一 说明 less是非常常用的样式框架之一,Grunt也提供了可以编译和打包less样式文件的插件:grunt-contrib-less. 实现原理 ...
- Linux防火墙iptables学习笔记(三)iptables命令详解和举例[转载]
Linux防火墙iptables学习笔记(三)iptables命令详解和举例 2008-10-16 23:45:46 转载 网上看到这个配置讲解得还比较易懂,就转过来了,大家一起看下,希望对您工作能 ...
- (转)live555学习笔记10-h264 RTP传输详解(2)
参考: 1,live555学习笔记10-h264 RTP传输详解(2) http://blog.csdn.net/niu_gao/article/details/6936108 2,H264 sps ...
- SNMP学习笔记之SNMP 原理与实战详解
原文地址:http://freeloda.blog.51cto.com/2033581/1306743 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法 ...
- Django学习笔记之Django Form表单详解
知识预览 构建一个表单 在Django 中构建一个表单 Django Form 类详解 使用表单模板 回到顶部 构建一个表单 假设你想在你的网站上创建一个简单的表单,以获得用户的名字.你需要类似这样的 ...
- JQuery学习笔记系列(一)----选择器详解
笔者好长时间没有更新过博客园的笔记了,一部分原因是去年刚刚开始工作一段时间忙碌的加班,体会了一种每天加班到凌晨的充实感,之后闲暇时间了也因为自己懒惰没有坚持记笔记的习惯,现在重新拾起来. 借用古人的一 ...
- SharpDevelop学习笔记(5)—— AddIns系统详解
在所有的插件被加载到指定的扩展点后,插件树就被创建完毕了, 但是,我们知道,插件树创建后,每个插件在插件树的位置在就固定的,但是,如果某些情况下,我们希望一些插件不可使用或应该隐藏起来, 或者说有的插 ...
- Hibernate学习笔记二:Hibernate缓存策略详解
一:为什么使用Hibernate缓存: Hibernate是一个持久层框架,经常访问物理数据库. 为了降低应用程序访问物理数据库的频次,从而提高应用程序的性能. 缓存内的数据是对物理数据源的复制,应用 ...
随机推荐
- 洛谷——P1621 集合
P1621 集合 题目描述 现在给你一些连续的整数,它们是从A到B的整数.一开始每个整数都属于各自的集合,然后你需要进行一下的操作: 每次选择两个属于不同集合的整数,如果这两个整数拥有大于等于P的公共 ...
- WebApp 安全风险与防护课堂开课了!
本文由葡萄城技术团队于原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 2018 网络安全事故频发,从数据泄露.信息窃取,到 DDOS 攻击.勒索 ...
- LCD设备驱动程序
LCD是Liquid Crystal Display的简称,也就是经常所说的液晶显示器 LCD能够支持彩色图像的显示和视频的播放,是一种非常重要的输出设备 Framebuffer 是Linux系统 ...
- C# Graphics
Graphics.FillPie 方法 填充由一对坐标.一个宽度.一个高度以及两条射线指定的椭圆所定义的扇形区的内部. Graphics.FillPie (Brush, Int32, Int32, I ...
- 白盒测试中如何实现真正意义上并发测试(Java)
在这个话题开始之前,首先我们来弄清楚为什么要做并发测试? 一般并发测试,是指模拟并发访问,测试多用户并发访问同一个应用.模块.数据时是否产生隐藏的并发问题,如内存泄漏.线程锁.资源争用问题. 站在性能 ...
- 在cmd窗口输入命令遇到You must run this command from a command prompt with administrator privilege怎么办?
点开始菜单,找到Accessories(附件),找到Command Prompt窗口,点右键,选“run as administrator”(以管理员身份运行),之后再执行先前的命令就好了. 2017 ...
- Java中对象、对象引用、堆、栈、值传递以及引用传递的详解
Java中对象.对象引用.堆.栈.值传递以及引用传递的详解 1.对象和对象引用的差别: (1).对象: 万物皆对象.对象是类的实例. 在Java中new是用来在堆上创建对象用的. 一个对象能够被多个引 ...
- jquery ajax传参数问题
var fd = new FormData();//实例化表单,提交数据使用fd.append('imgUrl',imgUrl);//将files追加进去fd.append('typeId',type ...
- 数据存储之Archiver、Unarchiver、偏好设置
数组的归档 对象的归档 NSData多个对象的归档 NSArray多个对象的归档 偏好设置的存储 1.NSString.NSDictionary.NSArray.NSData.NSNumber等类型的 ...
- python 中给文件加锁——fcntl模块
如果没有fcntl模块则用 sudo pip install fcntl安装 模块简单说明: 打开文件,不存在则创建之 f = open('./test','w') fcntl.flock(f,fcn ...