小心!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 相关文章推荐
JavaScript 模仿vbs中的 DateAdd() 函数的代码
Aug 13 Javascript
一些Javascript的IE和Firefox(火狐)兼容性的问题总结及常用例子
May 21 Javascript
javascript 学习笔记(onchange等)
Nov 14 Javascript
前端框架Vue.js中Directive知识详解
Sep 12 Javascript
微信小程序开发之录音机 音频播放 动画实例 (真机可用)
Dec 08 Javascript
Node.js的Mongodb使用实例
Dec 30 Javascript
React创建组件的三种方式及其区别
Jan 12 Javascript
微信小程序 request接口的封装实例代码
Apr 26 Javascript
基于node.js制作简单爬虫教程
Jun 29 Javascript
vue轮播图插件vue-concise-slider的使用
Mar 13 Javascript
JQuery获取元素尺寸、位置及页面滚动事件应用示例
May 14 jQuery
浅谈vue中$bus的使用和涉及到的问题
Jul 28 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
全国FM电台频率大全 - 25 云南省
2020/03/11 无线电
php过滤html标记属性类用法实例
2014/09/23 PHP
php自定义hash函数实例
2015/05/05 PHP
PHP实现HTTP断点续传的方法
2015/06/17 PHP
基于PHP实现的事件机制实例分析
2015/06/18 PHP
php获取指定(访客)IP所有信息(地址、邮政编码、国家、经纬度等)的方法
2015/07/06 PHP
如何用PHP来实现一个动态Web服务器
2015/07/29 PHP
php中使用websocket详解
2016/09/23 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
2019/12/20 PHP
javascript 处理null及null值示例
2014/06/09 Javascript
删除javascript中注释语句的正则表达式
2014/06/11 Javascript
JQuery选中checkbox方法代码实例(全选、反选、全不选)
2015/04/27 Javascript
使用jquery提交form表单并自定义action的实现代码
2016/05/25 Javascript
详解JS中的立即执行函数
2017/02/24 Javascript
浅析JS中的 map, filter, some, every, forEach, for in, for of 用法总结
2017/03/29 Javascript
详解node中创建服务进程
2017/05/09 Javascript
vue之数据交互实例代码
2017/06/16 Javascript
AngularJs ng-change事件/指令的用法小结
2017/11/01 Javascript
Angular移动端页面input无法输入的解决方法
2017/11/14 Javascript
Swiper 4.x 使用方法(移动端网站的内容触摸滑动)
2018/05/17 Javascript
深入理解Vue.js轻量高效的前端组件化方案
2018/12/10 Javascript
JS/HTML5游戏常用算法之碰撞检测 地图格子算法实例详解
2018/12/12 Javascript
富文本编辑器vue2-editor实现全屏功能
2019/05/26 Javascript
你不可不知的Vue.js列表渲染详解
2019/10/01 Javascript
[00:34]DOTA2上海特级锦标赛 VG战队宣传片
2016/03/04 DOTA
Python抓取Discuz!用户名脚本代码
2013/12/30 Python
Python连接DB2数据库
2016/08/27 Python
python 截取 取出一部分的字符串方法
2017/03/01 Python
python和mysql交互操作实例详解【基于pymysql库】
2019/06/04 Python
Django微信小程序后台开发教程的实现
2020/06/03 Python
Python使用sys.exc_info()方法获取异常信息
2020/07/23 Python
Python获取excel内容及相关操作代码实例
2020/08/10 Python
Pytorch模型迁移和迁移学习,导入部分模型参数的操作
2021/03/03 Python
法律系毕业生求职信
2014/05/28 职场文书
创业计划书之儿童理发店
2019/09/27 职场文书
python 爬取天气网卫星图片
2021/06/07 Python