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 相关文章推荐
COM中获取JavaScript数组大小的代码
Nov 22 Javascript
一个简单的js动画效果代码
Jul 20 Javascript
javascript之Partial Application学习
Jan 10 Javascript
jQuery的控件及事件(输入控件及回车事件)使用示例
Jul 25 Javascript
DOM基础教程之事件对象
Jan 20 Javascript
JavaScript实现的MD5算法完整实例
Feb 02 Javascript
Bootstrap源码解读下拉菜单(4)
Dec 23 Javascript
Vue应用部署到服务器的正确方式
Jul 15 Javascript
js比较两个单独的数组或对象是否相等的实例代码
Apr 28 Javascript
vue+egg+jwt实现登录验证的示例代码
May 18 Javascript
解决nuxt页面中mounted、created、watch执行两遍的问题
Nov 05 Javascript
vue自定义插件封装,实现简易的elementUi的Message和MessageBox的示例
Nov 20 Vue.js
基于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数组函数序列之array_unshift() 在数组开头插入一个或多个元素
2011/11/07 PHP
PHP中数组定义的几种方法
2013/09/01 PHP
php爬取天猫和淘宝商品数据
2018/02/23 PHP
PHP 实现重载
2021/03/09 PHP
javaScript parseInt字符转化为数字函数使用小结
2009/11/05 Javascript
jquery中获取元素的几种方式小结
2011/07/05 Javascript
判断复选框是否被选中的两种方法
2014/06/04 Javascript
每天一篇javascript学习小结(Boolean对象)
2015/11/12 Javascript
AngularJS入门教程中SQL实例详解
2016/07/27 Javascript
jQuery选择器选中最后一个元素,倒数第二个元素操作示例
2018/12/10 jQuery
详解Vue组件之间通信的七种方式
2019/04/14 Javascript
Nodejs环境实现socket通信过程解析
2020/07/03 NodeJs
解决vux 中popup 组件Mask 遮罩在最上层的问题
2020/11/03 Javascript
vue项目中openlayers绘制行政区划
2020/12/24 Vue.js
简单文件操作python 修改文件指定行的方法
2013/05/15 Python
Python使用正则表达式抓取网页图片的方法示例
2017/04/21 Python
Python 逐行分割大txt文件的方法
2017/10/10 Python
详解python 注释、变量、类型
2018/08/10 Python
python3 实现一行输入,空格隔开的示例
2018/11/14 Python
Python pandas实现excel工作表合并功能详解
2019/08/29 Python
Python正则表达式高级使用方法汇总
2020/06/18 Python
python实现画图工具
2020/08/27 Python
如何基于pandas读取csv后合并两个股票
2020/09/25 Python
365 Tickets英国:全球景点门票
2019/07/06 全球购物
L’urv官网:精品女性运动服品牌
2019/07/07 全球购物
2014高考励志标语
2014/06/05 职场文书
2015年医院护理部工作总结
2015/04/23 职场文书
亲戚关系证明
2015/06/24 职场文书
遗嘱格式范本
2015/08/07 职场文书
新员工实习期个人工作总结
2015/10/15 职场文书
留学文书中的个人陈述,应该注意哪些问题?
2019/08/23 职场文书
《学会生存》读后感3篇
2019/12/09 职场文书
微信小程序实现录音Record功能
2021/05/09 Javascript
Python GUI编程之tkinter 关于 ttkbootstrap 的使用详解
2022/03/03 Python
UNION CREATIVE《Re:从零开始的异世界生活》雷姆手办
2022/03/20 日漫
SpringBoot使用AOP实现统计全局接口访问次数详解
2022/06/16 Java/Android