本文主要讲如何使用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插件详解的更多相关文章

  1. Grunt学习笔记【8】---- grunt-angular-templates插件详解

    本文主要讲如何用Grunt打包AngularJS的模板HTML. 一 说明 AngularJS中使用单独HTML模板文件的地方非常多,例如:自定义指令.ng-include.templateUrl等. ...

  2. Grunt学习笔记【7】---- grunt-contrib-less插件详解

    本文主要讲如何使用Grunt实现less文件压缩. 一 说明 less是非常常用的样式框架之一,Grunt也提供了可以编译和打包less样式文件的插件:grunt-contrib-less. 实现原理 ...

  3. Linux防火墙iptables学习笔记(三)iptables命令详解和举例[转载]

     Linux防火墙iptables学习笔记(三)iptables命令详解和举例 2008-10-16 23:45:46 转载 网上看到这个配置讲解得还比较易懂,就转过来了,大家一起看下,希望对您工作能 ...

  4. (转)live555学习笔记10-h264 RTP传输详解(2)

    参考: 1,live555学习笔记10-h264 RTP传输详解(2) http://blog.csdn.net/niu_gao/article/details/6936108 2,H264 sps ...

  5. SNMP学习笔记之SNMP 原理与实战详解

    原文地址:http://freeloda.blog.51cto.com/2033581/1306743 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法 ...

  6. Django学习笔记之Django Form表单详解

    知识预览 构建一个表单 在Django 中构建一个表单 Django Form 类详解 使用表单模板 回到顶部 构建一个表单 假设你想在你的网站上创建一个简单的表单,以获得用户的名字.你需要类似这样的 ...

  7. JQuery学习笔记系列(一)----选择器详解

    笔者好长时间没有更新过博客园的笔记了,一部分原因是去年刚刚开始工作一段时间忙碌的加班,体会了一种每天加班到凌晨的充实感,之后闲暇时间了也因为自己懒惰没有坚持记笔记的习惯,现在重新拾起来. 借用古人的一 ...

  8. SharpDevelop学习笔记(5)—— AddIns系统详解

    在所有的插件被加载到指定的扩展点后,插件树就被创建完毕了, 但是,我们知道,插件树创建后,每个插件在插件树的位置在就固定的,但是,如果某些情况下,我们希望一些插件不可使用或应该隐藏起来, 或者说有的插 ...

  9. Hibernate学习笔记二:Hibernate缓存策略详解

    一:为什么使用Hibernate缓存: Hibernate是一个持久层框架,经常访问物理数据库. 为了降低应用程序访问物理数据库的频次,从而提高应用程序的性能. 缓存内的数据是对物理数据源的复制,应用 ...

随机推荐

  1. dhlin-vim-wiki

    记录vim中常用的几个操作 入门指南 $ vimtutor vim中是区分大小写 vim中移动光标 h 向左移动 j 向下移动 k 向上移动 l 向右移动 其实使用方向键也是能移动的,但是熟悉后再一些 ...

  2. iptables 一些有用的规则

      -A INPUT -i lo -j ACCEPT #允许本机内部访问,即回环 -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT #允许 ...

  3. Guru's Guide to SQL Server Architecture and Internals

    Guru's Guide to SQL Server Architecture and Internals

  4. 多线程一共就俩问题:1.线程安全(访问共享数据) 2.线程通信(wait(),notify())

    多线程一共就俩问题:1.线程安全(访问共享数据) 2.线程通信(wait(),notify()) 1.线程安全,无非就是加锁,访问共享资源时,synchronized 2.线程通信,就是控制各个线程之 ...

  5. C++输入和输出中进制问题

    默认下都是十进制 int i, j, k, l; cin>>oct>>i; //输入为八进制数 cin>>hex>>j; //输入为十六进制数 cin& ...

  6. 15 THINGS ALL GIRLS SHOULD KNOW ABOUT THEIR VAGINA

    Here are 15 facts that EVERY GIRL should know about her vagina. Don’t be shy! Your vagina is part of ...

  7. MFC中的CDC详细教程

    参考:  MFC中的CDC详细教程1,2,3 StretchDIBits用法

  8. 【音乐App】—— Vue-music 项目学习笔记:项目准备

    前言: 学习慕课网Vue高级实战课程后,在实践中总结一些这个项目带给自己的收获,希望可以再次巩固关于Vue开发的知识.这一篇主要梳理:项目概况.项目准备.页面骨架搭建.项目github地址:https ...

  9. SGU 231 Prime Sum 求<=n内有多少对素数(a,b)使得a+b也为素数 规律题

    题目链接:contest=0&problem=231">点击打开链接 题意: 求<=n内有多少对素数(a,b)使得a+b也为素数 思路: 我们发现全部素数间隔都是> ...

  10. (八)jQuery中的事件

    1.加载DOM在常规的JavaScript中,使用window.onload方法:而在jQuery中,使用$(document).ready(function(){ })方法.window.onloa ...