本篇文章給大家分享的是有關(guān)如何在webpack中使用external模塊,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

external選項(xiàng)
import $ from 'jquery'
function hideImages() {
$('img').hide();
}
export default {
"hideImages": hideImages
}我們使用Webpack打包發(fā)布這個(gè)庫:
// 入口文件
entry: {
util: './util.js',
}
// 輸出文件
output: {
path: './dist',
filename: '[name].dist.js'
library: 'util',
libraryTarget: commonjs2,
targetExport: 'default'
}這樣打包出來的util.dist.js文件會(huì)把jquery的代碼完整地注入進(jìn)去,因?yàn)槟愕脑创a使用到了它。但是這往往并不是我們希望的,因?yàn)閖query是很通用的模塊,在一個(gè)app中,很可能其它的庫也會(huì)用到它,最頂層的入口文件app也可能用到它,如果每一個(gè)庫模塊的發(fā)布版本都將jquery原封不動(dòng)地打包進(jìn)了自己的bundle,最后拼到一起,在最終的app發(fā)布代碼里就會(huì)有很多份jquery的復(fù)制,當(dāng)然這可能并不會(huì)影響它的正常功能,但是會(huì)占據(jù)很大的代碼體積。
所以通常情況下當(dāng)你的庫需要依賴到例如jquery,bootstrap這樣的通用JS模塊時(shí),我們可以不將它打包進(jìn)bundle,而是在Webpack的配置中聲明external:
externals: {
jquery: {
root: 'jquery',
commonjs: 'jquery',
commonjs2: 'jquery',
amd: 'jquery',
},
},這就是在告訴Webpack:請(qǐng)不要將這個(gè)模塊注入編譯后的JS文件里,對(duì)于我源代碼里出現(xiàn)的任何import/require這個(gè)模塊的語句,請(qǐng)將它保留。
我們可以看一下編譯后的bundle文件的結(jié)構(gòu):
module.exports = (function(modules) {
var installedModules = {};
function webpack_require(moduleId) {
// ...
}
return webpack_require('./util.js');
}) ({
'./util.js': generated_util,
// '/path/to/jquery.js': generated_jquery 原本有這一行,現(xiàn)在被刪去。
});可以看到j(luò)query模塊沒有被打包進(jìn)bundle文件,而對(duì)于util,它的生成代碼即generated_util函數(shù)中關(guān)于import jquery相關(guān)的語句也被保留了原意:
function generated_util(module, exports, webpack_require) {
var $ = require('jquery');
// util的其它源代碼
// ...
}當(dāng)然也并非完全沒有修改,例如將import的改回了傳統(tǒng)的require關(guān)鍵詞,因?yàn)槲覀冞@里用的是CommonJS風(fēng)格的打包方式。不過這些都是次要的,關(guān)鍵是它保留了require這個(gè)關(guān)鍵詞,而沒有使用webpack_require將jquery真的引入進(jìn)來。這就是說,當(dāng)前的這個(gè)JS文件的模塊管理系統(tǒng)中是沒有jquery的,它是一個(gè)external的模塊,需要在這個(gè)JS文件被其它人引用并且在上層編譯時(shí),jquery才可能被真的引入進(jìn)來,到那個(gè)時(shí)候這里的require關(guān)鍵詞才會(huì)被替換為webpack_require。
對(duì)于external的依賴模塊,通常你可以這樣做,例如你使用npm發(fā)布你的庫,你可以將jquery在package.json文件中添加到dependencies,這樣別人npm install你發(fā)布的庫時(shí),jquery也會(huì)被自動(dòng)下載到node_modules供別人打包使用。
umd格式下的打包
如果我們使用umd格式打包,我們可以看到在不同環(huán)境中,external模塊是如何發(fā)揮作用的:
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object') // commonjs2
module.exports = factory(require('jquery'));
else if(typeof define === 'function' && define.amd)
define("util", ['jquery'], factory); // amd
else if(typeof exports === 'object')
exports["util"] = factory(require('jquery')); // commonjs
else
root["util"] = factory(root['jquery']); // var
}) (window, function(__webpack_external_module_jquery__) {
return (function(modules) {
var installedModules = {};
function webpack_require(moduleId) {
// ...
}
return webpack_require('./util.js');
}) ({
'./util.js': generated_util,
});
}而generated_util也相應(yīng)地增加一個(gè)參數(shù)__webpack_external_module_jquery__:
function generated_util(module, exports, webpack_require,
__webpack_external_module_jquery__) {
var $ = __webpack_external_module_jquery__;
// util的其它源代碼
// ...
}這樣的寫法似乎結(jié)構(gòu)和上面的CommonJS的編譯版本不太一樣,但實(shí)際上本質(zhì)是一樣的。因?yàn)楝F(xiàn)在umd要照顧到不同的運(yùn)行環(huán)境,所以它把require('jquery')提前了,作為factory的參數(shù)傳入。對(duì)于每種運(yùn)行環(huán)境,各有各的做法:
CommonJS:保留require('jquery')語句。
AMD:在define中將jquery定義為依賴模塊。
Var:從全局域中取出jquery變量,這需要jquery在該模塊之前就已經(jīng)被加載。
然后不管是哪種情況,它們都將載入后的jquery模塊作為參數(shù)傳入factory函數(shù),這樣就能正確加載util模塊了。
以上就是如何在webpack中使用external模塊,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
分享標(biāo)題:如何在webpack中使用external模塊-創(chuàng)新互聯(lián)
網(wǎng)站URL:http://chinadenli.net/article20/cosejo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)公司、動(dòng)態(tài)網(wǎng)站、網(wǎng)站內(nèi)鏈、微信小程序、定制網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容