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 相关文章推荐
jquery判断单个复选框是否被选中的代码
Sep 03 Javascript
两种WEB下的模态对话框 (asp.net或js的分别实现)
Dec 02 Javascript
javascript 学习笔记(六)浏览器类型及版本信息检测代码
Apr 08 Javascript
关于js中for in的缺陷浅析
Dec 02 Javascript
Angularjs使用directive自定义指令实现attribute继承的方法详解
Aug 05 Javascript
AngularJS通过$location获取及改变当前页面的URL
Sep 23 Javascript
拖动时防止选中
Feb 03 Javascript
jQuery插件zTree实现单独选中根节点中第一个节点示例
Mar 08 Javascript
js正则相关知识点专题
May 10 Javascript
vue cli安装使用less的教程详解
Jul 12 Javascript
微信小程序嵌入腾讯视频源过程详解
Aug 08 Javascript
Layui表格监听行单双击事件讲解
Nov 14 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 set_time_limit(0) 设置程序执行时间的函数
2010/05/26 PHP
《PHP编程最快明白》第四讲:日期、表单接收、session、cookie
2010/11/01 PHP
浅析php中json_encode()和json_decode()
2014/05/25 PHP
PHP开发框架Laravel数据库操作方法总结
2014/09/03 PHP
php中substr()函数参数说明及用法实例
2014/11/15 PHP
PHP的命令行命令使用指南
2015/08/18 PHP
Yii2实现上下联动下拉框功能的方法
2016/08/10 PHP
javascript实现的距离现在多长时间后的一个格式化的日期
2009/10/29 Javascript
利用google提供的API(JavaScript接口)获取网站访问者IP地理位置的代码详解
2010/07/24 Javascript
使用jQuery Ajax功能时需要注意的一个问题(内存溢出)
2012/05/30 Javascript
node.js中的fs.writeSync方法使用说明
2014/12/15 Javascript
jquery使用经验小结
2015/05/20 Javascript
微信禁止下拉查看URL的处理方法
2017/09/28 Javascript
nodejs发送http请求时遇到404长时间未响应的解决方法
2017/12/10 NodeJs
layui表单提交到后台自动封装到实体类的方法
2019/09/12 Javascript
vue-video-player实现实时视频播放方式(监控设备-rtmp流)
2020/08/10 Javascript
Python中关于使用模块的基础知识
2015/05/24 Python
Python获取SQLite查询结果表列名的方法
2017/06/21 Python
python实现批量修改文件名代码
2017/09/10 Python
全面了解Nginx, WSGI, Flask之间的关系
2018/01/09 Python
Python八大常见排序算法定义、实现及时间消耗效率分析
2018/04/27 Python
Python之列表实现栈的工作功能
2019/01/28 Python
记录Python脚本的运行日志的方法
2019/06/05 Python
关于Python核心框架tornado的异步协程的2种方法详解
2019/08/28 Python
Python 实现自动导入缺失的库
2019/10/29 Python
python二元表达式用法
2019/12/04 Python
html5设计原理(推荐收藏)
2014/05/17 HTML / CSS
定制别致的瑜伽垫:Sugarmat
2019/06/21 全球购物
京剧自荐信
2014/01/26 职场文书
党员批评与自我批评思想汇报(集锦)
2014/09/14 职场文书
房产销售独家委托书范本
2014/10/01 职场文书
2014年班主任德育工作总结
2014/12/05 职场文书
社区环境卫生倡议书
2015/04/29 职场文书
PHP基本语法
2021/03/31 PHP
死磕 java同步系列之synchronized解析
2021/06/28 Java/Android
Python爬取用户观影数据并分析用户与电影之间的隐藏信息!
2021/06/29 Python