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 相关文章推荐
JQUERY实现左侧TIPS滑进滑出效果示例
Jun 27 Javascript
javascript的渐进增强与平稳退化浅谈
Nov 12 Javascript
JS中创建函数的三种方式及区别
Mar 13 Javascript
JavaScript简单验证表单空值及邮箱格式的方法
Jan 20 Javascript
使用vue.js写一个tab选项卡效果
Mar 25 Javascript
jQuery绑定事件方法及区别(bind,click,on,live,one)
Aug 14 jQuery
详解Layer弹出层样式
Aug 21 Javascript
Vue父子模版传值及组件传值的三种方法
Nov 27 Javascript
jQuery简单实现的HTML页面文本框模糊匹配查询功能完整示例
May 09 jQuery
vue搜索和vue模糊搜索代码实例
May 07 Javascript
JavaScript页面倒计时功能完整示例
May 15 Javascript
快速了解Vue父子组件传值以及父调子方法、子调父方法
Jul 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
如何在Ubuntu下启动Apache的Rewrite功能
2013/07/05 PHP
php之static静态属性与静态方法实例分析
2015/07/30 PHP
Prototype 工具函数 学习
2009/07/23 Javascript
javascript 循环调用示例介绍
2013/11/20 Javascript
javascript实现汉字转拼音代码分享
2015/04/20 Javascript
jQuery+html5+css3实现圆角无刷新表单带输入验证功能代码
2015/08/21 Javascript
深入浅析JavaScript中的Function类型
2016/07/09 Javascript
使用HTML5+Boostrap打造简单的音乐播放器
2016/08/05 Javascript
js中获取jsp表单中radio类型的值简单实例
2016/08/15 Javascript
用瀑布流的方式在网页上插入图片的简单实现方法
2016/09/23 Javascript
jQuery实现简易的输入框字数计数功能示例
2017/01/16 Javascript
JavaScript实现简单的树形菜单效果
2017/06/23 Javascript
Vue.js devtool插件安装后无法使用的解决办法
2017/11/27 Javascript
利用Javascript获取选择文本所在的句子详解
2017/12/03 Javascript
Angular中管道操作符(|)的使用方法
2017/12/15 Javascript
Vue 表情包输入组件的实现代码
2019/01/21 Javascript
React 全自动数据表格组件——BodeGrid的实现思路
2019/06/12 Javascript
vue 组件基础知识总结
2021/01/26 Vue.js
[05:13]TI4 中国战队 机场出征!!
2014/07/07 DOTA
Python中join和split用法实例
2015/04/14 Python
python使用正则表达式提取网页URL的方法
2015/05/26 Python
Python中functools模块的常用函数解析
2016/06/30 Python
pyqt5实现俄罗斯方块游戏
2019/01/11 Python
Python模块汇总(常用第三方库)
2019/10/07 Python
Python 寻找局部最高点的实现
2019/12/05 Python
Python面向对象之私有属性和私有方法应用案例分析
2019/12/31 Python
如何使用python传入不确定个数参数
2020/02/18 Python
Python中zip函数如何使用
2020/06/04 Python
欧洲著名的珠宝和手表网上商城:uhrcenter
2017/04/10 全球购物
英国工作场所设备购买网站:Slingsby
2019/05/03 全球购物
LN-CC日本:高端男装和女装的奢侈时尚目的地
2019/09/01 全球购物
大学社团招新的通讯稿
2014/09/10 职场文书
2015年消费者权益日活动总结
2015/02/09 职场文书
贷款收入证明范本
2015/06/12 职场文书
读书笔记格式
2015/07/02 职场文书
教你一步步实现一个简易promise
2021/11/02 Javascript