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 全角转换实现代码
Jul 17 Javascript
javascript 必知必会之closure
Sep 21 Javascript
jquery实现通用的内容渐显Tab选项卡效果
Sep 07 Javascript
js鼠标点击图片切换效果实现代码
Nov 19 Javascript
requireJS使用指南
Apr 27 Javascript
微信小程序 图片等比例缩放(图片自适应屏幕)
Nov 16 Javascript
js实现打地鼠小游戏
Feb 13 Javascript
vue2.0实战之使用vue-cli搭建项目(2)
Mar 27 Javascript
js中less常用的方法小结
Aug 09 Javascript
Koa2微信公众号开发之本地开发调试环境搭建
May 16 Javascript
vue中利用Promise封装jsonp并调取数据
Jun 18 Javascript
react ant Design手动设置表单的值操作
Oct 31 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
福利彩票幸运号码自动生成器
2006/10/09 PHP
PHP如何抛出异常处理错误
2011/03/02 PHP
php 网上商城促销设计实例代码
2012/02/17 PHP
php header函数的常用http头设置
2015/06/25 PHP
php利用ob_start()清除输出和选择性输出的方法
2018/01/18 PHP
PHP扩展mcrypt实现的AES加密功能示例
2019/01/29 PHP
List the Codec Files on a Computer
2007/06/11 Javascript
jqTransform美化表单
2015/10/10 Javascript
jQuery拖拽排序插件制作拖拽排序效果(附源码下载)
2016/02/23 Javascript
微信小程序  action-sheet详解及实例代码
2016/11/09 Javascript
AngularJS中的Promise详细介绍及实例代码
2016/12/13 Javascript
整理关于Bootstrap过渡动画的慕课笔记
2017/03/29 Javascript
详解React Native 采用Fetch方式发送跨域POST请求
2017/11/15 Javascript
vue 组件间的通信之子组件向父组件传值的方式
2020/07/29 Javascript
VSCode插件安装完成后的配置(常用配置)
2020/08/24 Javascript
Python进度条实时显示处理进度的示例代码
2018/01/30 Python
Python实现高斯函数的三维显示方法
2018/12/29 Python
python使用selenium实现批量文件下载
2019/03/11 Python
Python 爬取必应壁纸的实例讲解
2020/02/24 Python
Python 从attribute到property详解
2020/03/05 Python
如何基于Python按行合并两个txt
2020/11/03 Python
Python实现京东抢秒杀功能
2021/01/25 Python
详解Python中openpyxl模块基本用法
2021/02/23 Python
做一个能自适应高度的textarea的示例代码
2019/09/06 HTML / CSS
美国在线眼镜商城:Eyeglasses.com
2017/06/26 全球购物
佳能英国官方网站:Canon UK
2017/08/08 全球购物
英国图书音像网站:Hive.co.uk(图书、电子书、DVD、蓝光、音乐CD等)
2017/10/16 全球购物
英国顶级水晶珠宝零售商之一:Tresor Paris
2019/04/27 全球购物
荣耀俄罗斯官网:HONOR俄罗斯
2020/10/31 全球购物
电大学习个人自我评价范文
2013/10/04 职场文书
师范大学应届生求职信
2013/11/21 职场文书
创意广告词
2014/03/17 职场文书
如何理解Vue前后端数据交互与显示
2021/05/10 Vue.js
JavaScript数组reduce()方法的语法与实例解析
2021/07/07 Javascript
python工具dtreeviz决策树可视化和模型可解释性
2022/03/03 Python
SpringCloud Function SpEL注入漏洞分析及环境搭建
2022/04/08 Java/Android