深入淺出webpack之externals的使用
我們通常在做項(xiàng)目時(shí)可能會(huì)把第三方庫打包到bundle中,比如下面這張圖

如果不想把第三方庫打包到bundle中,這就有了externals。官方的使用externals比較簡(jiǎn)單
externals
官網(wǎng)文檔解釋的很清楚,就是webpack可以不處理應(yīng)用的某些依賴庫,使用externals配置后,依舊可以在代碼中通過CMD、AMD或者window/global全局的方式訪問。
只需三步——
1.在HTML中引入第三方庫的cdn
2.在webpack中配置externals
externals: {
jquery: "jQuery",
}
3.在js中引用
const $ = require("jquery");
$("#content").html("<h1>hello world</h1>");
好,現(xiàn)在我們可以隨心所欲的使用jquery插件并保證不會(huì)打包到bundle中。external是怎么辦到的呢?下面我們通過bundle的源碼來分析下原理。

這里的/* 0 */和__webpack_require__分別指打包前js對(duì)應(yīng)的模塊函數(shù),這里就不細(xì)說了。這里可以看到module.exports = jQuery,就是說我們externals中的key指的是require的東西,value指的就是它,就是說“當(dāng)require的參數(shù)是jquery的時(shí)候,使用jQuery這個(gè)全局變量引用它”。這種最簡(jiǎn)潔的externals配置方式為默認(rèn)的global模式,就是在window上掛一個(gè)全局變量,然后直接可以使用這個(gè)變量。具體的流程是這樣,我們?cè)谠创a中使用require('jquery')后,可以直接把jquery加到externals中,得到一個(gè)打包的trunk.js,但是在引入這個(gè)trunkjs之前,肯定要先引入jquery這個(gè)庫文件,這個(gè)庫文件會(huì)創(chuàng)建一個(gè)全局變量jQuery,而咱們的trunkjs中externals的jquery是global模式,所以實(shí)際上trunkjs引入jquery的時(shí)候,就會(huì)從全局變量中引用,即module.export = jQuery

當(dāng)然,既然是通過這種externals方式,其實(shí)我們可以不用require引入,直接使用全局變量也是可以的。
jQuery("#content").html("<h1>hello world</h1>");
大家如果注意到我剛說過的global模式的話,沒錯(cuò),你也許已經(jīng)猜到了,我可以任意的使用不同的輸出方式。如果打包文件我想運(yùn)行到node環(huán)境下,我得使用commonjs規(guī)范,所以你要這么寫。
externals: {
jquery: "commonjs2 jQuery",
}
打包后會(huì)是這樣子。

然后我的項(xiàng)目中還用到了lodash,也想把它從bundle中移除,之前我的代碼是這樣子,引的是npm包


現(xiàn)在我們的externals配置如下
externals: {
jquery: "jQuery",
_: "lodash"
}

我們必須要去掉這個(gè)const ,否則的話會(huì)報(bào)一個(gè)錯(cuò)誤 lodash is not defined。為什么會(huì)這樣呢?因?yàn)槲覀兊膌odash輸出是global格式的,我在這里先賣一個(gè)關(guān)子,我們先統(tǒng)一一下輸出格式,加一個(gè)libraryTarget字段

這個(gè)東西是干嘛用的呢?
他是我們輸出文件的模塊化規(guī)范,想想我們上面配置的commonjs jquery是運(yùn)行在node下,總之記住一句話——我們最長(zhǎng)使用的模塊化方案是commonjs2和umd,前者是為node環(huán)境,后者是為瀏覽器環(huán)境。一共有這幾種規(guī)范:
"var" - Export by setting a variable: var Library = xxx (default)
"this" - Export by setting a property of this: this["Library"] = xxx
"commonjs" - Export by setting a property of exports: exports["Library"] = xxx
"commonjs2" - Export by setting module.exports: module.exports = xxx
"amd" - Export to AMD (optionally named - set the name via the library option)
"umd" - Export to AMD, CommonJS2 or as property in root

然后報(bào)這個(gè)錯(cuò)誤,也就是說我們的模塊沒有正確的輸出,回到我們的externals,它更多的是指定當(dāng)你引用一個(gè)包的時(shí)候,這個(gè)包(lodash)應(yīng)該遵循哪種模塊化方式(common,root,amd等等)引入,這意思就是說,打包的時(shí)候不需要關(guān)心他到底怎么輸出。
externals: {
jquery: "jQuery",
lodash: {
commonjs: 'lodash',
commonjs2: 'lodash',
amd: 'lodash',
root: '_'
}
},
ok,記得要將之前的覆蓋掉,替換成下面的require,因?yàn)樵趀xternals中我們規(guī)范的commmonjs規(guī)范為lodash

也就是說,這就是我們最初的代碼,即沒有用過externals時(shí)候的代碼,看,也就是說我們只需要配置externals和libraryTarget就可以,其他的業(yè)務(wù)邏輯代碼不需要改變。包括我們的項(xiàng)目中還用了echarts,這個(gè)通通不用改變!?。。。?/p>

也就是說最終的代碼是externals配合libraryTarget一起使用,如果去掉umd的話,會(huì)報(bào)這個(gè)錯(cuò)誤

相應(yīng)的源碼是這樣子

就是說我不知道通過那種方式輸出,所以我應(yīng)該告訴webpack,我通過umd方式輸出,即將你的 lodash 暴露為所有的模塊定義下都可運(yùn)行的方式。它將在 CommonJS, AMD 環(huán)境下運(yùn)行,或?qū)⒛K導(dǎo)出到 global 下的變量.加上umd的源碼如下

看到了吧,我通過require('lodash')引入模塊,輸出走的是commonjs規(guī)范,貼下最終的配置
entry: {
main: './src/index.js'
},
externals: {
jquery: "jQuery",
lodash: {
commonjs: 'lodash',
commonjs2: 'lodash',
amd: 'lodash',
root: '_'
}
},
output: {
filename: '[name].[chunkhash].js',
path: path.resolve(__dirname,'dist'),
libraryTarget: 'umd'
},
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 詳解webpack import()動(dòng)態(tài)加載模塊踩坑
- html-webpack-plugin修改頁面的title的方法
- 詳解webpack 多頁面/入口支持&公共組件單獨(dú)打包
- webpack常用配置項(xiàng)配置文件介紹
- 詳解html-webpack-plugin插件(用法總結(jié))
- 詳解webpack打包vue項(xiàng)目之后生成的dist文件該怎么啟動(dòng)運(yùn)行
- Webpack實(shí)現(xiàn)按需打包Lodash的幾種方法詳解
- 基于vuejs+webpack的日期選擇插件
- 詳解如何使用webpack打包Vue工程
- webpack自動(dòng)刷新瀏覽器源碼解析
相關(guān)文章
Javascript必知必會(huì)(四)js類型轉(zhuǎn)換
這篇文章主要介紹了Javascript必知必會(huì)(四)js類型轉(zhuǎn)換 的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06
JS獲取下拉列表所選中的TEXT和Value的實(shí)現(xiàn)代碼
本篇文章主要是對(duì)JS獲取下拉列表所選中的TEXT和Value的實(shí)現(xiàn)代碼進(jìn)行了介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助2014-01-01
用Javascript實(shí)現(xiàn)錨點(diǎn)(Anchor)間平滑跳轉(zhuǎn)
本文介紹的方法,實(shí)現(xiàn)了錨點(diǎn)(Anchor)間平滑跳轉(zhuǎn),效果非常不錯(cuò)。2009-09-09
跟我學(xué)習(xí)javascript的隱式強(qiáng)制轉(zhuǎn)換
跟我學(xué)習(xí)javascript的隱式強(qiáng)制轉(zhuǎn)換,感興趣的小伙伴們可以學(xué)習(xí)一下2015-11-11
javascript 獲取函數(shù)形參個(gè)數(shù)
本節(jié)主要介紹了javascript獲取函數(shù)形參個(gè)數(shù)的具體實(shí)現(xiàn),需要的朋友可以參考下2014-07-07
javascript 網(wǎng)頁跳轉(zhuǎn)的方法
昨天練習(xí)的時(shí)候正好要用到跳轉(zhuǎn)代碼,在網(wǎng)上找了一下,覺得下面幾個(gè)不錯(cuò)...整理了一下發(fā)上來...2008-12-12
JavaScript中常用數(shù)據(jù)處理函數(shù)groupBy的用法詳解
數(shù)據(jù)處理與分析中,對(duì)數(shù)據(jù)進(jìn)行分組是非常常見的功能,不論是實(shí)際工作中,還是在面試的場(chǎng)景中應(yīng)用十分廣泛,尤其在函數(shù)式編程中?groupBy?十分常見,下面我們就來學(xué)習(xí)一下groupBy的用法吧2023-12-12

