seajs模塊壓縮問題

     在優化整理項目代碼時,想使用seajs來把代碼模塊化。看了下官方5分鐘上手教程,以爲很不錯,也沒多想就一直開發下去了,也沒出什麼問題。等一同事說把代碼打包個放到設備上去測試一下,發現怎麼也跑不起來,鬱悶了。git

    因而單步調試一把,發現模塊一直加不進來。看了一下seajs的原碼,明白了是怎麼回事。github

    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....因此天然就沒法使用了。優化

  解析辦法有兩個:ui

  1. seajs官方給出是seajs標準模塊構建工具:https://github.com/seajs/seajs/issues/538 使用spm進行構建。spa

      2. 更換壓縮工具,使用一個能夠自定義關鍵字,也就是讓壓縮工具不壓縮require變量。調試

  目前主流的三個壓縮工具:YUI Compressor,Google Closure Compiler,UglifyJS。就目前所知,貌似前兩個都不支持自定義關鍵字(?),UglifyJS是支持的。因此能夠使用UglifyJS進行壓縮code

UglifyJS hello.js -o hello.min.js -m -c -r require

經過-r選項來指定變量不壓縮。

  

  總的來講使用seajs應該儘可能的去使用官方的構建工具。 

相關文章
相關標籤/搜索