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 相关文章推荐
返回对象在当前级别中是第几个元素的实现代码
Jan 20 Javascript
使用jQuery判断IE浏览器版本的代码
Jun 14 Javascript
JavaScript时间转换处理函数
Apr 14 Javascript
javascript常用功能汇总
Jul 05 Javascript
jquery验证手机号是否正确实例讲解
Nov 17 Javascript
jQuery实现选项卡切换效果简单演示
Dec 09 Javascript
DWR中各种java方法的调用
May 04 Javascript
jqPlot jQuery绘图插件的使用
Jun 18 Javascript
浅析js的模块化编写 require.js
Dec 07 Javascript
使用JS实现导航切换时高亮显示的示例讲解
Aug 22 Javascript
iview通过Dropdown(下拉菜单)实现的右键菜单
Oct 26 Javascript
vue 添加和编辑用同一个表单,el-form表单提交后清空表单数据操作
Aug 03 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版本号
2006/10/09 PHP
解析获取优酷视频真实下载地址的PHP源代码
2013/06/26 PHP
php+memcache实现的网站在线人数统计代码
2014/07/04 PHP
PHP5.3与5.5废弃与过期函数整理汇总
2014/07/10 PHP
Laravel监听数据库访问,打印SQL的例子
2019/10/24 PHP
PHP7生产环境队列Beanstalkd用法详解
2020/05/19 PHP
jquery的ajax从纯真网(cz88.net)获取IP地址对应地区名
2009/12/02 Javascript
基于jquery的关于动态创建DOM元素的问题
2010/12/24 Javascript
javascript题目,重写函数让其无限相加
2012/02/15 Javascript
JQuery操作tr和td内容的方法实例
2013/03/06 Javascript
js 利用image对象实现图片的预加载提高访问速度
2013/03/29 Javascript
页面使用密码保护代码
2013/04/10 Javascript
jQuery contains过滤器实现精确匹配使用方法
2013/04/12 Javascript
thinkphp中常用的系统常量和系统变量
2014/03/05 Javascript
了不起的node.js读书笔记之例程分析
2014/12/22 Javascript
Bootstrap CSS布局之按钮
2016/12/17 Javascript
javascript实现下雨效果
2017/03/27 Javascript
nodejs入门教程四:URL相关模块用法分析
2017/04/24 NodeJs
vue综合组件间的通信详解
2017/11/06 Javascript
ReactNative 之FlatList使用及踩坑封装总结
2017/11/29 Javascript
vue watch监听对象及对应值的变化详解
2018/02/24 Javascript
js实现导航跟随效果
2018/11/17 Javascript
vue解决使用$http获取数据时报错的问题
2019/10/30 Javascript
javascript实现拼图游戏
2021/01/29 Javascript
Python升级提示Tkinter模块找不到的解决方法
2014/08/22 Python
Python通过递归遍历出集合中所有元素的方法
2015/02/25 Python
Python爬虫通过替换http request header来欺骗浏览器实现登录功能
2018/01/07 Python
Python OpenCV 直方图的计算与显示的方法示例
2018/02/08 Python
Python基于分析Ajax请求实现抓取今日头条街拍图集功能示例
2018/07/19 Python
pandas 根据列的值选取所有行的示例
2018/11/07 Python
Pycharm取消py脚本中SQL识别的方法
2018/11/29 Python
解决Python pip 自动更新升级失败的问题
2020/02/21 Python
少年闰土教学反思
2014/02/22 职场文书
学校青年志愿者活动总结
2015/05/06 职场文书
运动会运动员赞词
2015/07/22 职场文书
Python 循环读取数据内存不足的解决方案
2021/05/25 Python