小心!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 相关文章推荐
extjs grid设置某列背景颜色和字体颜色的方法
Sep 03 Javascript
JavaScript类和继承 prototype属性
Sep 03 Javascript
JavaScript中链式调用之研习
Apr 07 Javascript
jquery中使用ajax获取远程页面信息
Nov 13 Javascript
javascript删除数组重复元素的方法汇总
Jun 24 Javascript
jQuery1.9+中删除了live以后的替代方法
Jun 17 Javascript
使用UrlConnection实现后台模拟http请求的简单实例
Jan 04 Javascript
微信小程序使用wxParse解析html的方法教程
Jul 06 Javascript
angularJs提交文本框数据到后台的方法
Oct 08 Javascript
vue 实现单选框设置默认选中值
Nov 07 Javascript
vue el-table实现自定义表头
Dec 11 Javascript
如何让vue长列表快速加载
Mar 29 Vue.js
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
编写漂亮的代码 - 将后台程序与前端程序分开
2008/04/23 PHP
基于php缓存的详解
2013/05/15 PHP
php实现执行某一操作时弹出确认、取消对话框
2013/12/30 PHP
PHP实现动态删除XML数据的方法示例
2018/03/30 PHP
广告代码静态化js通用函数
2007/05/09 Javascript
为原生js Array增加each方法
2012/04/07 Javascript
JQuery Highcharts 动态生成图表的方法
2013/11/15 Javascript
JS将数字转换成三位逗号分隔的样式(示例代码)
2014/02/19 Javascript
JavaScript严格模式禁用With语句的原因
2014/10/20 Javascript
Jquery弹出层插件ThickBox的使用方法
2014/12/09 Javascript
js兼容火狐获取图片宽和高的方法
2015/05/21 Javascript
JS非Alert实现网页右下角“未读信息”效果弹窗
2015/09/26 Javascript
JavaScript原生对象常用方法总结(推荐)
2016/05/13 Javascript
深入学习Bootstrap表单
2016/12/13 Javascript
Bootstrap table使用方法汇总
2017/11/17 Javascript
JavaScript指定断点操作实例教程
2018/09/18 Javascript
微信公众平台 发送模板消息(Java接口开发)
2019/04/17 Javascript
Vue 3.0 前瞻Vue Function API新特性体验
2019/08/12 Javascript
JS实现的进制转换,浮点数相加,数字判断操作示例
2019/11/09 Javascript
vue学习笔记之给组件绑定原生事件操作示例
2020/02/27 Javascript
JavaScript enum枚举类型定义及使用方法
2020/05/15 Javascript
原生JS封装拖动验证滑块的实现代码示例
2020/06/01 Javascript
[01:45:05]VGJ.T vs Newbee Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
tensorflow构建BP神经网络的方法
2018/03/12 Python
python抓取京东小米8手机配置信息
2018/11/13 Python
python文件拆分与重组实例
2018/12/10 Python
PyQt5+requests实现车票查询工具
2019/01/21 Python
Flask框架 CSRF 保护实现方法详解
2019/10/30 Python
python IDLE添加行号显示教程
2020/04/25 Python
德国最大的拼图在线商店:Puzzle.de
2016/12/17 全球购物
DVF官方网站:美国时装界尊尚品牌
2017/08/29 全球购物
Myprotein意大利官网:欧洲第一运动营养品牌
2018/11/22 全球购物
2014年计生协会工作总结
2014/11/21 职场文书
小学语文教师年度考核个人总结
2015/02/05 职场文书
专家推荐信范文
2015/03/26 职场文书
MySQL 四种连接和多表查询详解
2021/07/16 MySQL