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 相关文章推荐
百度 popup.js 完美修正版非常的不错 脚本之家推荐
Apr 17 Javascript
jquery validation插件表单验证的一个例子
Mar 03 Javascript
js加载之使用DOM方法动态加载Javascript文件
Nov 08 Javascript
多种方法实现load加载完成后把图片一次性显示出来
Feb 19 Javascript
setinterval()与clearInterval()JS函数的调用方法
Jan 21 Javascript
jQuery EasyUI datagrid在翻页以后仍能记录被选中行的实现代码
Aug 15 Javascript
js获取Get值的方法
Sep 29 Javascript
微信小程序 配置顶部导航条标题颜色的实现方法
Sep 20 Javascript
微信小程序手机号码验证功能的实例代码
Aug 28 Javascript
jQuery中each遍历的三种方法实例分析
Sep 07 jQuery
vue 项目打包时样式及背景图片路径找不到的解决方式
Nov 12 Javascript
js实现拖拽与碰撞检测
Sep 18 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 日期和时间的处理-郑阿奇(续)
2011/07/04 PHP
php实现的CSS更新类实例
2014/09/22 PHP
ThinkPHP框架设计及扩展详解
2014/11/25 PHP
动态加载外部javascript文件的函数代码分享
2011/07/28 Javascript
Jquery实现点击按钮,连续地向textarea中添加值的实例代码
2014/03/08 Javascript
js函数与php函数的区别实例浅析
2015/01/12 Javascript
JavaScript判断表单中多选框checkbox选中个数的方法
2015/08/17 Javascript
基于jQuery倾斜打开侧边栏菜单特效代码
2015/09/15 Javascript
js数组去重的5种算法实现
2015/11/04 Javascript
常用javascript表单验证汇总
2020/07/20 Javascript
JavaScript实现的SHA-1加密算法完整实例
2016/02/02 Javascript
JavaScript操作HTML DOM节点的基础教程
2016/03/11 Javascript
BootStrap智能表单实战系列(十一)级联下拉的支持
2016/06/13 Javascript
jQuery获取剪贴板内容的方法
2016/06/16 Javascript
vue组件中点击按钮后修改输入框的状态实例代码
2017/04/14 Javascript
详解Javascript获取缓存和清除缓存API
2017/05/25 Javascript
详解使用vue实现tab 切换操作
2017/07/03 Javascript
JS实现搜索关键词的智能提示功能
2017/07/07 Javascript
浅谈React之状态(State)
2018/09/19 Javascript
vue实现固定位置显示功能
2019/05/30 Javascript
小程序click-scroll组件设计
2019/06/18 Javascript
layui异步加载table表中某一列数据的例子
2019/09/16 Javascript
bluepy 一款python封装的BLE利器简单介绍
2019/06/25 Python
numpy数组广播的机制
2019/07/12 Python
用Python识别人脸,人种等各种信息
2019/07/15 Python
Python 多线程其他属性以及继承Thread类详解
2019/08/28 Python
python装饰器相当于函数的调用方式
2019/12/27 Python
TensorFlow Saver:保存和读取模型参数.ckpt实例
2020/02/10 Python
Python编程快速上手——强口令检测算法案例分析
2020/02/29 Python
pandas中read_csv、rolling、expanding用法详解
2020/04/21 Python
在 Windows 下搭建高效的 django 开发环境的详细教程
2020/07/27 Python
平面设计自荐信
2013/10/07 职场文书
资料员的岗位职责
2013/11/20 职场文书
讲文明知礼仪演讲稿
2014/09/13 职场文书
关于有小孩的离婚协议书
2014/10/26 职场文书
Java 数组内置函数toArray详解
2021/06/28 Java/Android