seajs模塊壓縮問題與解決方法實(shí)例分析
本文實(shí)例講述了seajs模塊壓縮問題與解決方法。分享給大家供大家參考,具體如下:
在優(yōu)化整理項(xiàng)目代碼時,想使用seajs來把代碼模塊化??戳讼鹿俜?分鐘上手教程,覺得很不錯,也沒多想就一直開發(fā)下去了,也沒出什么問題。等一同事說把代碼打包個放到設(shè)備上去測試一下,發(fā)現(xiàn)怎么也跑不起來,郁悶了。
于是單步調(diào)試一把,發(fā)現(xiàn)模塊一直加不進(jìn)來。看了一下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那就不進(jìn)行解析了,如果傳那就進(jìn)行源碼解析:
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模塊中,是一個關(guān)鍵字。
那么問題就來了,一般我們使用的壓縮工具都變量進(jìn)行壓縮,require不是標(biāo)準(zhǔn)的js關(guān)鍵字,所以經(jīng)過一壓縮require就變成了abcdefg....所以自然就無法使用了。
解析辦法有兩個:
1. seajs官方給出是seajs標(biāo)準(zhǔn)模塊構(gòu)建工具:https://github.com/seajs/seajs/issues/538 使用spm進(jìn)行構(gòu)建。
2. 更換壓縮工具,使用一個可以自定義關(guān)鍵字,也就是讓壓縮工具不壓縮require變量。
目前主流的三個壓縮工具:YUI Compressor,Google Closure Compiler,UglifyJS。就目前所知,貌似前兩個都不支持自定義關(guān)鍵字(?),UglifyJS是支持的。所以可以使用UglifyJS進(jìn)行壓縮
UglifyJS hello.js -o hello.min.js -m -c -r require
通過-r選項(xiàng)來指定變量不壓縮。
總的來說使用seajs應(yīng)該盡量的去使用官方的構(gòu)建工具。
更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《JavaScript擴(kuò)展技巧總結(jié)》、《JavaScript字符與字符串操作技巧總結(jié)》、《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》、《JavaScript中json操作技巧總結(jié)》、《JavaScript錯誤與調(diào)試技巧總結(jié)》及《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》
希望本文所述對大家JavaScript程序設(shè)計有所幫助。
相關(guān)文章
詳解Sea.js中Module.exports和exports的區(qū)別
最近在看Seajs時,看到了exports.doSomething和module.exports,想對這兩者的區(qū)別一探究竟。所以下面這篇文章主要介紹了Sea.js中Module.exports和exports的區(qū)別,需要的朋友可以參考借鑒,一起來看看吧。2017-02-02seajs學(xué)習(xí)之模塊的依賴加載及模塊API的導(dǎo)出
SeaJS是一個遵循 CommonJS 規(guī)范的模塊加載框架,可用來輕松愉悅地加載任意JavaScript模塊和css模塊樣式。SeaJS接口和方法也非常少,SeaJS 就兩個核心:模塊定義和模塊的加載及依賴關(guān)系。本文將詳細(xì)介紹模塊的依賴加載及模塊API的導(dǎo)出,有需要的朋友們可以參考借鑒。2016-10-10