小心!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 相关文章推荐
jquery1.4后 jqDrag 拖动 不可用
Feb 06 Javascript
javascript 子窗体父窗体相互传值方法
May 31 Javascript
js实现全屏漂浮广告移入光标停止移动
Dec 02 Javascript
jQuery获得内容和属性示例代码
Jan 16 Javascript
在jQuery中处理XML数据的大致方法
Aug 14 Javascript
jQuery实现下拉框左右移动(全部移动,已选移动)
Apr 15 Javascript
Angular中使用$watch监听object属性值的变化(详解)
Apr 24 Javascript
基于jQuery选择器之表单对象属性筛选选择器的实例
Sep 19 jQuery
vue input输入框关键字筛选检索列表数据展示
Oct 26 Javascript
微信小程序如何调用json数据接口并解析
Jun 29 Javascript
微信小程序防止多次点击跳转和防止表单组件输入内容多次验证功能(函数防抖)
Sep 19 Javascript
Vue简单封装axios之解决post请求后端接收不到参数问题
Feb 16 Javascript
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入门小知识
2008/03/24 PHP
php 大数据量及海量数据处理算法总结
2011/05/07 PHP
Zend Framework创建自己的动作助手详解
2016/03/05 PHP
PC端微信扫码支付成功之后自动跳转php版代码
2017/07/07 PHP
对php 判断http还是https,以及获得当前url的方法详解
2019/01/15 PHP
JavaScript Tips 使用DocumentFragment加快DOM渲染速度
2010/06/28 Javascript
JavaScript对象、属性、事件手册集合方便查询
2010/07/04 Javascript
JqGrid web打印实现代码
2011/05/31 Javascript
Jquery命名冲突解决的五种方案分享
2012/03/16 Javascript
js 利用image对象实现图片的预加载提高访问速度
2013/03/29 Javascript
jQuery使用一个按钮控制图片的伸缩实现思路
2013/04/19 Javascript
JS分页控件 可用于无刷新分页
2013/07/23 Javascript
Javascript实现的常用算法(如冒泡、快速、鸽巢、奇偶等)
2014/04/29 Javascript
关注jquery技巧提高jquery技能(前端开发必学)
2015/11/02 Javascript
聊一聊Vue.js过渡效果
2016/09/07 Javascript
BootStrap框架中的data-[ ]自定义属性理解(推荐)
2017/02/14 Javascript
详解Vue如何支持JSX语法
2017/11/10 Javascript
可能被忽略的一些JavaScript数组方法细节
2019/02/28 Javascript
解决vue单页面应用中动态修改title问题
2019/06/09 Javascript
解决layui批量传值到后台操作时出现传值为空的问题
2019/09/28 Javascript
Django中URLconf和include()的协同工作方法
2015/07/20 Python
bpython 功能强大的Python shell
2016/02/16 Python
深入理解Python中装饰器的用法
2016/06/28 Python
Python简单获取自身外网IP的方法
2016/09/18 Python
pygame实现五子棋游戏
2019/10/29 Python
基于Python快速处理PDF表格数据
2020/06/03 Python
python else语句在循环中的运用详解
2020/07/06 Python
美国玩具公司:U.S.Toy
2018/05/19 全球购物
德国健康生活方式网上商店:Landkaufhaus Mayer
2019/03/12 全球购物
俄罗斯购买内衣网站:Trusiki
2020/08/22 全球购物
市场总监岗位职责
2015/02/11 职场文书
交通事故案件代理词
2015/05/23 职场文书
南极大冒险观后感
2015/06/05 职场文书
歌舞青春观后感
2015/06/10 职场文书
800字作文之大雪
2019/12/04 职场文书
pytest配置文件pytest.ini的详细使用
2021/04/17 Python