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 相关文章推荐
用javascript获取textarea中的光标位置
May 06 Javascript
js或css文件后面跟参数的原因说明
Jan 09 Javascript
jquery移除button的inline onclick事件(已测试及兼容浏览器)
Jan 25 Javascript
jQuery+AJAX实现遮罩层登录验证界面(附源码)
Sep 13 Javascript
如何用JS判断两个数字的大小
Jul 21 Javascript
React进阶学习之组件的解耦之道
Aug 07 Javascript
AngularJS的$location使用方法详解
Oct 19 Javascript
vue 项目 iOS WKWebView 加载
Apr 17 Javascript
layui switch 开关监听 弹出确定状态转换的例子
Sep 21 Javascript
深入理解基于vue-cli的webpack打包优化实践及探索
Oct 14 Javascript
微信小程序基于ColorUI构建皮皮虾短视频去水印组件
Nov 04 Javascript
JS 4个超级实用的小技巧 提升开发效率
Oct 05 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
15种PHP Encoder的比较
2007/03/06 PHP
分割GBK中文遭遇乱码的解决方法
2013/08/09 PHP
php实现文件下载(支持中文文名)
2013/12/04 PHP
浅谈thinkphp的实例化模型
2015/01/04 PHP
PHP代码加密的方法总结
2020/03/13 PHP
Using the TextRange Object
2006/10/14 Javascript
Jquery实现视频播放页面的关灯开灯效果
2013/05/27 Javascript
javascripit实现密码强度检测代码分享
2013/12/12 Javascript
jQuery使用之处理页面元素用法实例
2015/01/19 Javascript
JS动态创建元素的两种方法
2016/04/20 Javascript
Vue.js报错Failed to resolve filter问题的解决方法
2016/05/25 Javascript
微信小程序 MINA文件结构
2016/10/17 Javascript
详解JavaScript的闭包、IIFE、apply、函数与对象
2016/12/21 Javascript
Angular.js中定时器循环的3种方法总结
2017/04/27 Javascript
图片加载完成再执行事件的实例
2017/11/16 Javascript
js数组去重的N种方法(小结)
2018/06/07 Javascript
jQuery实现基本淡入淡出效果的方法详解
2018/09/05 jQuery
Jquery如何使用animation动画效果改变背景色的代码
2020/07/20 jQuery
python 快速排序代码
2009/11/23 Python
详解python中Numpy的属性与创建矩阵
2018/09/10 Python
python+rsync精确同步指定格式文件
2019/08/29 Python
PyCharm如何导入python项目的方法
2020/02/06 Python
对tensorflow中cifar-10文档的Read操作详解
2020/02/10 Python
解决pycharm不能自动补全第三方库的函数和属性问题
2020/03/12 Python
CSS3文本换行word-wrap解决英文文本超过固定宽度不换行
2013/10/10 HTML / CSS
使用Html5中的cavas画一面国旗
2019/09/25 HTML / CSS
Gina Bacconi官网:吉娜贝康尼连衣裙和礼服
2018/04/24 全球购物
HOTEL INFO英国:搜索全球酒店
2019/08/08 全球购物
内业资料员岗位职责
2014/01/04 职场文书
水果连锁超市创业计划书
2014/01/24 职场文书
小学生中国梦演讲稿
2014/04/23 职场文书
彩妆大赛策划方案
2014/05/13 职场文书
基层党支部公开承诺书
2014/05/29 职场文书
小学安全工作汇报材料
2014/08/19 职场文书
教师理论学习心得体会
2016/01/21 职场文书
React四级菜单的实现
2022/04/08 Javascript