it编程 > 前端脚本 > Seajs

seajs模块压缩问题与解决方法实例分析

135人参与 2024-05-15 Seajs

本文实例讲述了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应该尽量的去使用官方的构建工具。

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

SeaJS中use函数用法实例分析

05-15

seajs中模块依赖的加载处理实例分析

05-15

seajs中最常用的7个功能、配置示例

05-15

详解Sea.js中Module.exports和exports的区别

05-15

seaJs使用心得之exports与module.exports的区别实例分析

05-15

sea.js常用的api简易文档

05-15

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论