seajs模块压缩出现问题如何解决
程序员文章站
2022-04-23 14:29:32
...
在优化整理项目代码时,想使用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应该尽量的去使用官方的构建工具。
相关推荐:
以上就是seajs模块压缩出现问题如何解决的详细内容,更多请关注其它相关文章!
下一篇: 微信支付之告警通知实例
推荐阅读
-
如何解决压缩文件打不开的问题
-
Win10系统如何利用360压缩软件解决打不开RAR压缩包的问题
-
"这个压缩文件格式未知或者数据已经被损坏"如何解决
-
Python安装第三方包(模块/工具)出现链接超时,网速慢,安装不上的问题如何解决
-
Linux下安装vagrant过程出现问题如何解决?
-
基于Onvif协议网络摄像头实现 互联网无插件直播解决方案EasyNVR如何在ffmpeg增加H264编解码模块?
-
如何解决新版国标GB28181协议视频平台EasyGBS模块管理播放器弹出延时过高?
-
TP-LINK路由器故障中拨号上网出现问题如何解决
-
python面试题之如何解决验证码的问题,用什么模块,听过哪些人工打码平台?
-
php5.4.3找不到memcache模块,如何解决