seajs模块压缩问题与解决方法实例分析


Posted in Javascript onOctober 10, 2017

本文实例讲述了seajs模块压缩问题与解决方法。分享给大家供大家参考,具体如下:

在优化整理项目代码时,想使用seajs来把代码模块化。看了下官方5分钟上手教程,觉得很不错,也没多想就一直开发下去了,也没出什么问题。等一同事说把代码打包个放到设备上去测试一下,发现怎么也跑不起来,郁闷了。

于是单步调试一把,发现模块一直加不进来。看了一下seajs的原码,明白了是怎么回事。

define模块解析依赖有两种途径,一种是从define(id, deps, factory)中的deps来;还有一种是解析define代码,从require中来。来看一下代码:

Module.define = function (id, deps, factory) {
 var argsLen = arguments.length
 // define(factory)
 if (argsLen === 1) {
  factory = id
  id = undefined
 }
 else if (argsLen === 2) {
  factory = deps
  // define(deps, factory)
  if (isArray(id)) {
   deps = id
   id = undefined
  }
  // define(id, factory)
  else {
   deps = undefined
  }
 }
 // Parse dependencies according to the module factory code
 if (!isArray(deps) && isFunction(factory)) {
  deps = parseDependencies(factory.toString())
 }
 ...

如果传了deps那就不进行解析了,如果传那就进行源码解析:

var REQUIRE_RE = /"(?:\\"|[^"])*"|'(?:\\'|[^'])*'|\/\*[\S\s]*?\*\/|\/(?:\\\/|[^\/\r\n])+\/(?=[^\/])|\/\/.*|\.\s*require|(?:^|[^$])\brequire\s*\(\s*(["'])(.+?)\1\s*\)/g
var SLASH_RE = /\\\\/g
function parseDependencies(code) {
 var ret = []
 code.replace(SLASH_RE, "")
   .replace(REQUIRE_RE, function(m, m1, m2) {
    if (m2) {
     ret.push(m2)
    }
   })
 return ret
}

seajs是对源码正则对比,查找require,也就是说require在seajs模块中,是一个关键字。

那么问题就来了,一般我们使用的压缩工具都变量进行压缩,require不是标准的js关键字,所以经过一压缩require就变成了abcdefg....所以自然就无法使用了。

解析办法有两个:

1. seajs官方给出是seajs标准模块构建工具:https://github.com/seajs/seajs/issues/538 使用spm进行构建。

2. 更换压缩工具,使用一个可以自定义关键字,也就是让压缩工具不压缩require变量。

目前主流的三个压缩工具:YUI Compressor,Google Closure Compiler,UglifyJS。就目前所知,貌似前两个都不支持自定义关键字(?),UglifyJS是支持的。所以可以使用UglifyJS进行压缩

UglifyJS hello.js -o hello.min.js -m -c -r require

通过-r选项来指定变量不压缩。

总的来说使用seajs应该尽量的去使用官方的构建工具。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
js实现权限树的更新权限时的全选全消功能
Feb 17 Javascript
jquery dialog键盘事件代码
Aug 01 Javascript
24款非常有用的 jQuery 插件分享
Apr 06 Javascript
浅析offsetLeft,Left,clientLeft之间的区别
Nov 30 Javascript
JS+CSS实现自适应选项卡宽度的圆角滑动门效果
Sep 15 Javascript
JavaScript中日期的相关操作方法总结
Oct 24 Javascript
纯javascript移动优先的幻灯片效果
Nov 02 Javascript
浅谈AngularJS中ng-class的使用方法
Nov 11 Javascript
vue利用axios来完成数据的交互
Mar 23 Javascript
vue回到顶部监听滚动事件详解
Aug 02 Javascript
使用layui 的layedit定义自己的toolbar方法
Sep 18 Javascript
基于vue.js实现购物车
Jan 15 Javascript
基于vue的换肤功能的示例代码
Oct 10 #Javascript
seajs中模块依赖的加载处理实例分析
Oct 10 #Javascript
利用JS hash制作单页Web应用的方法详解
Oct 10 #Javascript
认识jQuery的Promise的具体使用方法
Oct 10 #jQuery
JavaScript如何获取到导航条中HTTP信息
Oct 10 #Javascript
使用Dropzone.js上传的示例代码
Oct 10 #Javascript
React中上传图片到七牛的示例代码
Oct 10 #Javascript
You might like
php getimagesize 上传图片的长度和宽度检测代码
2010/05/15 PHP
Laravel模板引擎Blade中section的一些标签的区别介绍
2015/02/10 PHP
Yii实现自动加载类地图的方法
2015/04/01 PHP
Zend Framework框架Smarty扩展实现方法
2016/03/22 PHP
PHP获取用户客户端真实IP的解决方案
2016/10/10 PHP
PHP小程序支付功能完整版【基于thinkPHP】
2019/03/26 PHP
thinkphp5框架扩展redis类方法示例
2019/05/06 PHP
javascript hashtable实现代码
2009/10/13 Javascript
jquery弹窗插件colorbox绑定动态生成元素的方法
2014/06/20 Javascript
javascript批量修改文件编码格式的方法
2015/01/27 Javascript
Jquery实现弹性滑块滑动选择数值插件
2015/08/08 Javascript
Hallo.js基于jQuery UI所见即所得的Web编辑器
2016/01/26 Javascript
javascript实现无法关闭的弹框
2016/11/27 Javascript
vue2的todolist入门小项目的详细解析
2017/05/11 Javascript
swiper移动端轮播插件(触碰图片之后停止轮播)
2017/12/28 Javascript
vue基础之使用get、post、jsonp实现交互功能示例
2019/03/12 Javascript
[52:05]EG vs OG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
python实现数独算法实例
2015/06/09 Python
python看某个模块的版本方法
2018/10/16 Python
Python 3 判断2个字典相同
2019/08/06 Python
python 利用turtle模块画出没有角的方格
2019/11/23 Python
selenium WebDriverWait类等待机制的实现
2020/03/18 Python
服务器端jupyter notebook映射到本地浏览器的操作
2020/04/14 Python
纯CSS3绘制打火机动画火焰效果
2016/07/18 HTML / CSS
美国最大的团购网站:Groupon
2016/07/23 全球购物
德国BA保镖药房韩文网:kr.ba.de
2017/09/04 全球购物
HEMA法国:荷兰原创设计
2019/02/21 全球购物
个人生活学习自我评价范文
2013/11/26 职场文书
行政管理毕业生自荐信
2014/02/24 职场文书
机电一体化应届生求职信
2014/08/09 职场文书
2014年最新领导班子整改方案
2014/09/27 职场文书
教师党员自我评议不足范文
2014/10/19 职场文书
二手车转让协议书
2015/01/29 职场文书
离婚答辩状范文
2015/05/22 职场文书
MySQL中日期型单行函数代码详解
2021/06/21 MySQL
教你使用Jenkins集成Harbor自动发布镜像
2022/04/03 Servers