小心!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 相关文章推荐
jquery关于页面焦点的定位(文本框获取焦点时改变样式 )
Sep 10 Javascript
基于dom编程中 动态创建与删除元素的使用
Apr 17 Javascript
js实现星星打分效果的方法
Jul 05 Javascript
Javascript的表单与验证-非空验证
Mar 18 Javascript
详细分析单线程JS执行问题
Nov 22 Javascript
vue如何引入sass全局变量
Jun 28 Javascript
详解关于Angular4 ng-zorro使用过程中遇到的问题
Dec 05 Javascript
JQuery的加载和选择器用法简单示例
May 13 jQuery
Vue extend的基本用法(实例详解)
Dec 09 Javascript
Vue如何获取数据列表展示
Dec 11 Javascript
JavaScript如何实现图片处理与合成
May 29 Javascript
vue中v-model对select的绑定操作
Aug 31 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
大师制作的中短波矿石收音机
2020/04/02 无线电
用户的详细注册和判断
2006/10/09 PHP
WordPress判断用户是否登录的代码
2011/03/17 PHP
php学习之数据类型之间的转换代码
2011/05/29 PHP
apache mysql php 源码编译使用方法
2012/05/03 PHP
destoon网站转移服务器后搜索汉字出现乱码的解决方法
2014/06/21 PHP
基于PHP的加载类操作以及其他两种魔术方法的应用实例
2017/08/28 PHP
php DES加密算法实例分析
2019/09/18 PHP
javascript中关于break,continue的特殊用法与介绍
2012/05/24 Javascript
关于include标签导致js路径找不到的问题分析及解决
2013/07/09 Javascript
客户端js性能优化小技巧整理
2013/11/05 Javascript
js控制网页背景音乐播放与停止的方法
2015/02/06 Javascript
深入理解JavaScript系列(22):S.O.L.I.D五大原则之依赖倒置原则DIP详解
2015/03/05 Javascript
javascript背景时钟实现方法
2015/06/18 Javascript
浅谈JavaScript中运算符的优先级
2015/07/07 Javascript
Bootstrap每天必学之导航
2015/11/26 Javascript
JavaScript弹窗基础篇
2016/04/27 Javascript
jQuery链式调用与show知识浅析
2016/05/11 Javascript
jQuery fadeOut 异步实例代码详解
2016/08/18 Javascript
解决Angular.Js与Django标签冲突的方案
2016/12/20 Javascript
webpack4 CSS Tree Shaking的使用
2018/09/03 Javascript
jquery分页优化操作实例分析
2019/08/23 jQuery
三步实现ionic3点击退出app程序
2019/09/17 Javascript
layui数据表格重载实现往后台传参
2019/11/15 Javascript
js调用网络摄像头的方法
2020/12/05 Javascript
python使用any判断一个对象是否为空的方法
2014/11/19 Python
浅谈Python中的全局锁(GIL)问题
2019/01/11 Python
python之pyqt5通过按钮改变Label的背景颜色方法
2019/06/13 Python
Python3环境安装Scrapy爬虫框架过程及常见错误
2019/07/12 Python
150行Python代码实现带界面的数独游戏
2020/04/04 Python
美国婴儿用品店:Babies”R”Us
2017/10/12 全球购物
新西兰购物网站:TheMarket NZ
2020/09/19 全球购物
乌克兰设计师和品牌的服装:Love&Live
2020/04/14 全球购物
2016年国庆节宣传标语
2015/11/25 职场文书
2019年工作总结范文
2019/05/21 职场文书
Python中文分词库jieba(结巴分词)详细使用介绍
2022/04/07 Python