seajs模块压缩问题

本文探讨了使用SEAJs模块化过程中遇到的问题,特别是压缩工具导致的关键字更改,介绍了两种解决方案:使用SEAJs标准模块构建工具spm或更换压缩工具如UglifyJS,并指明如何设置UglifyJS保留require关键字。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     在优化整理项目代码时,想使用seajs来把代码模块化。看了下官方5分钟上手教程,觉得很不错,也没多想就一直开发下去了,也没出什么问题。等一同事说把代码打包个放到设备上去测试一下,发现怎么也跑不起来,郁闷了。

    于是单步调试一把,发现模块一直加不进来。看了一下seajs的原码,明白了是怎么回事。

    define模块解析依赖有两种途径,一种是从define(id, deps, factory)中的deps来;还有一种是解析define代码,从require中来。来看一下代码:

 1 Module.define = function (id, deps, factory) {
 2   var argsLen = arguments.length
 3 
 4   // define(factory)
 5   if (argsLen === 1) {
 6     factory = id
 7     id = undefined
 8   }
 9   else if (argsLen === 2) {
10     factory = deps
11 
12     // define(deps, factory)
13     if (isArray(id)) {
14       deps = id
15       id = undefined
16     }
17     // define(id, factory)
18     else {
19       deps = undefined
20     }
21   }
22 
23   // Parse dependencies according to the module factory code
24   if (!isArray(deps) && isFunction(factory)) {
25     deps = parseDependencies(factory.toString())
26   }
27   ...

如果传了deps那就不进行解析了,如果传那就进行源码解析:

 1 var REQUIRE_RE = /"(?:\\"|[^"])*"|'(?:\\'|[^'])*'|\/\*[\S\s]*?\*\/|\/(?:\\\/|[^\/\r\n])+\/(?=[^\/])|\/\/.*|\.\s*require|(?:^|[^$])\brequire\s*\(\s*(["'])(.+?)\1\s*\)/g
 2 var SLASH_RE = /\\\\/g
 3 
 4 function parseDependencies(code) {
 5   var ret = []
 6 
 7   code.replace(SLASH_RE, "")
 8       .replace(REQUIRE_RE, function(m, m1, m2) {
 9         if (m2) {
10           ret.push(m2)
11         }
12       })
13 
14   return ret
15 }

  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应该尽量的去使用官方的构建工具。 

 

转载于:https://www.cnblogs.com/jinphen/p/4209557.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值