小心!AngularJS结合RequireJS做文件合并压缩的那些坑


Posted in Javascript onJanuary 09, 2016

在项目使用了AngularJS框架,用RequireJS做异步模块加载(AMD),在做文件合并压缩时,遇到了一些坑,有些只是解决了,但不明白原因。

那些坑
1. build.js里面的paths必须跟main.js里面的保持一致。

这个build.js就是r.js使用的配置文件,而main.js就是RequireJS的main文件。在合并压缩时候,build.js文件里面也需要写paths,而且还是跟main.js一样,我很奇怪为什么就不能识别main里面的require.config的paths,省得合并的时候还要将paths拷贝过来(我试过build.js里面没有paths,是不能合并的)。(-_-!!!)

2. 某些依赖库需要写整个相对路径才能做合并。

在项目里, 我使用一个叫layer的第三方库(库是以requireJS define写的),一开始只做开发时候,在paths配置了路径后,使用此库只需要用个简称(define依赖时候)。 但在做合并时候,竟然提示文件不存在(因为直接拿简称去拼文件地址了),无奈之下只能修改这个库的使用办法,全部使用到这个库的都写整个相对路径,这个时候开发和做合并才没有错。

3. 合并之后可以运行,加上压缩就不可以。

这个是最严重问题,最严重问题,最严重问题。在文件合并压缩后,使用文件时候,AngularJS运行就不正常了,总是报模块初始化失败,Failed to instantiate module common due to: Error: [$injector:unpr] Unknown provider: e,如下图。

小心!AngularJS结合RequireJS做文件合并压缩的那些坑

很关键的一个点就是,不压缩可以用,一旦压缩了(用了默认的压缩),使用就会报错。所以思考必定某些东西被“压坏”了,网上某些文章都说是需要下面这样写AngularJS cntroller、directive等,使用的服务用字符串定义。

commonModule.controller( "broswerCtrl" ,["$scope" ,"$sce" , function ($scope,$sce){

可是我的整个应用就是这样定义,并没有给它注入错误的机会。最后在无奈之下,就只能配置mangle: false,不混淆变量名,这样做后,合并压缩的文件就能正确使用了!!!

PS:简单说法就是,合并压缩可以,变量名不能混淆(总觉得怪怪的),感觉问题暂时无解。

4. 第二层的require,做合并的时候,是合并不出来。

例如在mian.js里面这样加载模块,在合并时候会发现第二层的require并没有被合并到。

require([ "COMMON"], function(){
  require([ "angular", "LOGIN" ], function(angular){
   //....
  });
});

这时需要在build.js加findNestedDependencies: true, 这时才会合并第二层。

合并准备

1、安装nodejs

文件合并压缩基于nodejs,所以先安装nodejs。

2、下载r.js

r.js配合requirejs模块写法对文件进行合并,压缩。

简单配置

配置文件最好写一个build.js,如下:

({
  baseUrl:"../",
  paths: {
   //...
  },
  shim: {
   //...
  },
  optimize: "uglify2",
  uglify2: {
  mangle: false //false 不混淆变量名
  },
  findNestedDependencies: true,
  name: "js/main",
  out: "../js/main-built.js"
})

这里就讲几个关键属性:

baseUrl:所有的模块(般就是js)都相对于这个路径存在。

optimize:优化脚本文件的方式,有下面5种取值方式。

  • uglify:(默认) 用UglifyJS压缩。
  • uglify2: 用UglifyJS2( 2.1.2+)压缩。
  • closure: 使用Google's Closure Compiler 简单优化模式压缩文件, 仅在优化工具使用Java有效。
  • closure.keepLines:跟closure参数一样, 只不过保留换行符。
  • none: 不做压缩。

findNestedDependencies:寻找require()里面的require或define调用的依赖。

PS:配置属性还有很多,就不一细细说了。当文件配置好后,就执行命令合并压缩

node r.js -o build.js

总结

RequireJS模块的合并压缩还是比较简单的,但是遇到AngularJS,在压缩方面就有些问题了,目前没找到什么更好办法。

以上就是本文的详细内容,希望对大家的学习有所帮助。

Javascript 相关文章推荐
Expandable "Detail" Table Rows
Aug 29 Javascript
js变量以及其作用域详解
Jul 18 Javascript
动态显示可输入的字数提示还可以输入的字数
Apr 01 Javascript
javascript实现window.print()去除页眉页脚
Dec 30 Javascript
javascript中键盘事件用法实例分析
Jan 30 Javascript
JS实现滑动菜单效果代码(包括Tab,选项卡,横向等效果)
Sep 24 Javascript
jquery ui dialog替代confirm实例分析
Jan 25 Javascript
JavaScript小技巧整理篇(非常全)
Jan 26 Javascript
JS组件Bootstrap Table使用方法详解
Feb 02 Javascript
Vue中自定义全局组件的实现方法
Dec 08 Javascript
详解Angular中实现自定义组件的双向绑定的两种方法
Nov 23 Javascript
jQuery表单元素过滤选择器用法实例分析
Feb 20 jQuery
javascript跑马灯抽奖实例讲解
Apr 17 #Javascript
jQuery页面刷新(局部、全部)问题分析
Jan 09 #Javascript
javascript返回顶部的按钮实现方法
Jan 09 #Javascript
javascript类型系统 Array对象学习笔记
Jan 09 #Javascript
JS中生成随机数的用法及相关函数
Jan 09 #Javascript
JavaScript电子时钟倒计时
Jan 09 #Javascript
bootstrap-treeview自定义双击事件实现方法
Jan 09 #Javascript
You might like
PHP安装攻略:常见问题解答(二)
2006/10/09 PHP
PHP GD 图像处理组件的常用函数总结
2010/04/28 PHP
PHP COOKIE及时生效的方法介绍
2014/02/14 PHP
PHP多个文件上传到服务器实例
2014/10/29 PHP
Yii实现多数据库主从读写分离的方法
2014/12/29 PHP
深入解析WordPress中加载模板的get_template_part函数
2016/01/11 PHP
php版微信公众平台之微信网页登陆授权示例
2016/09/23 PHP
Yii2实现增删改查后留在当前页的方法详解
2017/01/13 PHP
Thinkphp实现站点静态化的方法详解
2017/03/21 PHP
JavaScript中this关键字使用方法详解
2007/03/08 Javascript
浅谈JavaScript 框架分类
2014/11/10 Javascript
javascript数组排序汇总
2015/07/07 Javascript
基于HTML5上使用iScroll实现下拉刷新,上拉加载更多
2016/05/21 Javascript
表单中单选框添加选项和移除选项
2016/07/04 Javascript
JS访问DOM节点方法详解
2016/11/29 Javascript
详细分析jsonp的原理和实现方式
2017/11/20 Javascript
jQuery中库的引用方法
2018/01/06 jQuery
Node.js assert断言原理与用法分析
2019/01/04 Javascript
express + jwt + postMan验证实现持久化登录
2019/06/05 Javascript
弱类型语言javascript中 a,b 的运算实例小结
2019/08/07 Javascript
jquery实现手风琴案例
2020/05/04 jQuery
[02:33]2018 DOTA2亚洲邀请赛回顾视频 再次拾起那些美妙的时刻
2018/04/10 DOTA
对python修改xml文件的节点值方法详解
2018/12/24 Python
Python vtk读取并显示dicom文件示例
2020/01/13 Python
PyCharm无法引用自身项目解决方式
2020/02/12 Python
美国珠宝网上商店:Jeulia
2016/09/01 全球购物
ProBikeKit德国:在线公路自行车专家
2018/06/03 全球购物
Timberland德国官网:靴子、鞋子、衣服、夹克及配件
2019/12/10 全球购物
车间调度岗位职责
2013/11/30 职场文书
入党思想汇报
2014/01/05 职场文书
2014年煤矿安全工作总结
2014/12/04 职场文书
工厂仓管员岗位职责
2015/04/01 职场文书
《攀登者》:“海拔8000米以上,你不能指望任何人”
2019/11/25 职场文书
MATLAB 全景图切割及盒图显示的实现步骤
2021/05/14 Python
电脑无法安装Windows 11怎么办?无法安装Win11的解决方法
2021/11/21 数码科技
CSS实现背景图片全屏铺满自适应的3种方式
2022/07/07 HTML / CSS