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 动态参数判空操作
Dec 22 Javascript
html的DOM中document对象images集合用法实例
Jan 21 Javascript
JS实现淡蓝色简洁竖向Tab点击切换效果
Oct 06 Javascript
使用AngularJS2中的指令实现按钮的切换效果
Mar 27 Javascript
JS jQuery使用正则表达式去空字符的简单实现代码
May 20 jQuery
vue加载自定义的js文件方法
Mar 13 Javascript
解析Json字符串的三种方法日常常用
May 02 Javascript
深入浅析js原型链和vue构造函数
Oct 25 Javascript
玩转Koa之核心原理分析
Dec 29 Javascript
vue项目中mock.js的使用及基本用法
May 22 Javascript
tweenjs缓动算法的使用实例分析
Aug 26 Javascript
vue使用nprogress加载路由进度条的方法
Jun 04 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和Mysqlweb应用开发核心技术 第1部分 Php基础-1 开始了解php
2011/07/03 PHP
PHP删除HTMl标签的三种解决方法
2013/06/30 PHP
PHP7下协程的实现方法详解
2017/12/17 PHP
Yii 框架使用Forms操作详解
2020/05/18 PHP
javascript 获取网页参数系统
2008/07/19 Javascript
javascript笔试题目附答案@20081025_jb51.net
2008/10/26 Javascript
JavaScript Konami Code 实现代码
2009/07/29 Javascript
jQuery-Easyui 1.2 实现多层菜单效果的代码
2012/01/13 Javascript
基于zepto.js实现仿手机QQ空间的大图查看组件ImageView.js详解
2015/03/05 Javascript
jQuery中 delegate使用的问题
2015/07/03 Javascript
JavaScript String 对象常用方法详解
2016/05/13 Javascript
canvas绘制的直线动画
2017/01/23 Javascript
JS获取填报扩展单元格控件的值的解决办法
2017/07/14 Javascript
利用JS如何计算字符串所占字节数示例代码
2017/09/13 Javascript
javaScript实现复选框全选反选事件详解
2020/11/20 Javascript
ionic选择多张图片上传的示例代码
2017/10/10 Javascript
JS模拟实现哈希表及应用详解
2018/05/04 Javascript
Element-ui tree组件自定义节点使用方法代码详解
2018/09/17 Javascript
python正则匹配抓取豆瓣电影链接和评论代码分享
2013/12/27 Python
使用Python的Bottle框架写一个简单的服务接口的示例
2015/08/25 Python
Python实现简单多线程任务队列
2016/02/27 Python
在Python的Flask中使用WTForms表单框架的基础教程
2016/06/07 Python
Python解决走迷宫问题算法示例
2018/07/27 Python
详解django中使用定时任务的方法
2018/09/27 Python
Python进阶之自定义对象实现切片功能
2019/01/07 Python
python中的时区问题
2021/01/14 Python
领先的钻石和订婚戒指零售商:Diamonds-USA
2016/12/11 全球购物
建筑工程实习自我鉴定
2013/09/19 职场文书
中专毕业生个人职业生涯规划
2014/02/19 职场文书
六五普法规划实施方案
2014/03/21 职场文书
公司委托书格式
2014/08/01 职场文书
php 获取音视频时长,PHP 利用getid3 获取音频文件时长等数据
2021/04/01 PHP
python opencv通过4坐标剪裁图片
2021/06/05 Python
html css3不拉伸图片显示效果
2021/06/07 HTML / CSS
死磕 java同步系列之synchronized解析
2021/06/28 Java/Android
Java基于Dijkstra算法实现校园导游程序
2022/03/17 Java/Android