本文主要讲如何使用Grunt实现RequireJS文件压缩。

一 说明

ES6出来前,RequireJS是JavaScript模块化最常用的方式之一。对于使用RequireJS构建的项目,要实现打包压缩,需要使用grunt-contrib-requirejs插件。

二 安装

  1. npm install grunt-contrib-requirejs --save-dev

三 加载任务

  1. 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模块中依赖的地址进行配置。

  1. "paths" : {
  2. 'cModule' : 'src/c',
  3. 'jquery' : 'lib/jquery'
  4. },

6) shim

该属性和RequireJS的配置项一样,都是为没有使用RequireJS的define()方法声明依赖关系的第三库,来声明各个第三方库的依赖和对外的全局变量。

shim是一个对象, Key 值(cate) 与上边paths中定义的名字一样.每个属性对象有deps和exports两个属性,分别定义该库的依赖和对外全局变量。

例如:AngularJS依赖jquery,AngularJS对外的全局变量是angular;jquery对外的全局变量是$.

  1. "paths" : {
  2. 'cModule' : 'src/c',
  3. 'jquery' : 'lib/jquery',
  4. 'angular' : 'lib/angular'
  5. },
  6. "shim" : { // shim 中定义一个JSON对象, Key 值(cate) 与paths中定义的名字一样
  7. 'jquery' : { // shim中的JSON对象有两个属性: deps,exports
  8. 'deps' : [], // deps 为数组,表示其依赖的库
  9. 'exports' : '$' // exports 表示输出的对象名(标志该第三方库的全局变量标志)
  10. },
  11. 'angular' : {
  12. 'deps' : ['jquery'],
  13. 'export' : 'angular'
  14. }
  15. }

7) out

设置压缩后的文件地址和文件名。

例如:‘dist/test.min.js’。

8)removeCombined

如果为true,将从输出目录中删除已合并的文件。注意:该配置只有在设置了dir情况下生效。

9)dir

保存输出的路径,如果只输出一个文件,可以使用out接口。如果输出多个文件,都会放在dir下。

五 实战

下边是一个实例项目。

5.1 整体项目目录如下:

5.2 Gruntfile.js配置如下:

  1. module.exports = function (grunt) {
  2. grunt.initConfig({
  3. // 清理空文件夹
  4. clean: {
  5. foo1: {
  6. src: ['dist/*']
  7. }
  8. },
  9. requirejs: {
  10. min: {
  11. options: {
  12. baseUrl: './',
  13. optimize: 'none',
  14. name: 'build',
  15. out: 'dist/test.min.js',
  16. // dir: 'dist',
  17. removeCombined: true,
  18. paths: {
  19. cModule: 'src/c',
  20. jquery: 'lib/jquery',
  21. angular: 'lib/angular'
  22. },
  23. shim: {
  24. jquery: {
  25. deps: [],
  26. exports: '$'
  27. },
  28. angular: {
  29. deps: ['jquery'],
  30. exports: 'angular'
  31. }
  32. },
  33.  
  34. }
  35. }
  36. },
  37.  
  38. });
  39.  
  40. grunt.loadNpmTasks('grunt-contrib-requirejs');
  41. grunt.loadNpmTasks('grunt-contrib-clean');
  42.  
  43. // 默认被执行的任务列表。
  44. grunt.registerTask('default', [
  45. 'clean',
  46. 'requirejs'
  47. ]);
  48.  
  49. };

5.3 入口文件build.js代码如下:

说明:入口文件必须是一个require()方法模块,而不能是一个define定义模块。不然会报错。

  1. require([
  2. 'src/b'
  3. ]);

5.4 入口文件中加载的b.js文件代码如下:

  1. define(['src/a', 'cModule/c', 'src/jq/jq', 'src/ng/ng'], function (a, c, jq, ng) {
  2. window.console.log(a.name);
  3. window.console.log(c);
  4. window.console.log(jq);
  5. window.console.log(ng);
  6.  
  7. var b = 'this is a log!'
  8. return b;
  9. });

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. luogu P2423 双塔

    题目描述 2001年9月11日,一场突发的灾难将纽约世界贸易中心大厦夷为平地,Mr. F曾亲眼目睹了这次灾难.为了纪念“911”事件,Mr. F决定自己用水晶来搭建一座双塔.Mr. F有N块水晶,每块 ...

  2. spring配置文件中配置sessionFactory失败

    配置失败主要原因有两个: <bean id="studentDaoImp" class="com.gxwuz.maven.dao.StudentDaoImp&quo ...

  3. CBIntrospector俗称:内部检查工具

    Download View Introspector   (CBIntrospector)内部检查工具是IOS和IOS模拟器的小工具集,帮助在调试的UIKit类的用户界面,它尤其有用于动态UI布局创建 ...

  4. [Android实例] Scroll原理-附ScrollView源码分析 (转载)

    想象一下你拿着放大镜贴很近的看一副巨大的清明上河图, 那放大镜里可以看到的内容是很有限的, 而随着放大镜的上下左右移动,就可以看到不同的内容了 android中手机屏幕就相当于这个放大镜, 而看到的内 ...

  5. linux中top命令的用法

    收集了两篇关于介绍Linux中监控命令top命令的详细使用方法的文章.总的来说,top命令主要用来查看Linux系统的各个进程和系统资源占用情况,在监控Linux系统性能方面top显得非常有用,下面就 ...

  6. maven module和project的区别

    Maven Project可以理解为父工程.Maven Module可以理解为子工程.创建Maven Module工程必须有存在的父工程,maven就是通过父子工程进行工程管理的.

  7. JAVA Eclipse开发Android如何让超出界面的部分自动显示滚动条

    在原有布局的最外围添加一层ScrollView,注意原有布局的声明也要删了 <ScrollView xmlns:android="http://schemas.android.com/ ...

  8. IT行业是吃青春饭的吗?

    作者:杨中科 1.“it专业的学生太多了,而且就业压力很大”是吗?     现在各个大学为了赚钱拼命扩招,所以不仅IT专业的学生人比较多,而且其他专业的学生人数也比较多,“僧多粥少”就通常意味着就业压 ...

  9. BZOJ 4128 Matrix BSGS+矩阵求逆

    题意:链接 方法: BSGS+矩阵求逆 解析: 这题就是把Ax=B(mod C)的A和B换成了矩阵. 然而别的地方并没有修改. 所以就涉及到矩阵的逆元这个问题. 矩阵的逆元怎么求呢? 先在原矩阵后接一 ...

  10. 每天学点Python之bytes

    每天学点Python之bytes Python中的字节码用b'xxx'的形式表示.x能够用字符表示,也能够用ASCII编码形式\xnn表示.nn从00-ff(十六进制)共256种字符. 基本操作 以下 ...