webpack初探

\color{rgb(255,0,0)}{*}
[TOC]

一渤早、webpack是干什么的

二卤材、安裝webpack

三、核心概念

  1. Entry 入口
  2. Module 模塊
    在webpack中一切皆模塊竣况,一個(gè)文件即一個(gè)模塊克婶。webpack從entry配置的入口文件開始遞歸找出所有的文件依賴。
  3. Chunk 代碼塊
    一個(gè)Chunk由多個(gè)模塊組合而成丹泉,用于代碼合并和分割鸠补。
  4. Loader 模塊轉(zhuǎn)換器
    將模塊的原內(nèi)容按照需求轉(zhuǎn)化成新內(nèi)容。
  5. Plugin 擴(kuò)展插件
    在webpack構(gòu)建流程中的特定時(shí)機(jī)注入擴(kuò)展邏輯嘀掸,來(lái)改變構(gòu)建結(jié)果紫岩。
  6. Output 輸出結(jié)果
    在webpack經(jīng)過(guò)一系列處理并得到最終想要的代碼后輸出結(jié)果。

四睬塌、webpack常用的配置

按照配置所影響的功能劃分泉蝌。

4.1 Entry: 配置模塊的入口

Entry數(shù)據(jù)類型

類型 例子 含義 Chunk名稱
string './src/app.jsx' 入口模塊的文件路徑,可以是相對(duì)路徑 main
array ['./src/app1.jsx','./src/app2.jsx'] 入口模塊的文件路徑揩晴,可以是相對(duì)路徑 main
object { app: './src/app.jsx',app2: './src/app2.jsx'} 配置多個(gè)入口勋陪,每個(gè)入口生成一個(gè)Chunk app app2

4.2 Output: 配置如何輸出最終想要的代碼。

4.2.1 filename

配置輸出文件的名稱硫兰,string類型诅愚。
按照輸出文件個(gè)數(shù),取相應(yīng)的名字劫映。
如果只有一個(gè)輸出文件违孝,則可以取一個(gè)靜態(tài)名稱 filename: 'bundle.js'
如果是多個(gè) 根據(jù)Chunk的名稱區(qū)分輸出的文件名。例如:filename: '[name].js'
[name]代表用內(nèi)置的name取替換[name]泳赋,這時(shí)候我們可以將它看作一個(gè)字符串模板函數(shù)雌桑。內(nèi)置變量除了name,還包括:

變量名 含義
id Chunk的唯一標(biāo)識(shí)祖今,從0開始
name Chunk的名稱
hash Chunk的唯一標(biāo)識(shí)的hash值校坑,其中[hash:8]代表取8位Hash值
chunkHash Chunk內(nèi)容的hash值

4.2.2 chunkFilename

配置無(wú)入口的Chunk在輸出時(shí)文件名稱。它只用于指定在運(yùn)行過(guò)程中生成的Chunk在輸出時(shí)的名稱千诬。會(huì)在運(yùn)行時(shí)生成Chunk的常見場(chǎng)景包括:使用CommonChunkPlugin耍目、使用import('path/to/module')動(dòng)態(tài)加載等。chunkFilename支持和filename一致的內(nèi)置變量徐绑。

4.2.3 path

output.path配置輸出文件存放在本地的目錄邪驮,必須是string類型的絕對(duì)路徑。通常是Node.js的path模塊去獲取絕對(duì)路徑泵三。

path: path.resolve(__dirname, 'dist_[hash]')

4.2.4\color{rgb(255,0,0)}{*} publicPath

4.2.5\color{rgb(255,0,0)}{*} crossOrginLoading

4.2.6\color{rgb(255,0,0)}{*} libaryTarget 和 library

4.2.7\color{rgb(255,0,0)}{*} libaryExport

4.3 Module: 配置處理模塊的規(guī)則耕捞。

4.3.1 配置Loader

rules配置模塊的讀取和解析規(guī)則,array類型烫幕。數(shù)組里每一項(xiàng)都描述了如何處理部分文件俺抽。配置一項(xiàng)rules時(shí)大致可通過(guò)以下方式來(lái)完成。

  • 條件匹配:通過(guò)test较曼、include磷斧、exclude三個(gè)配置項(xiàng)來(lái)選中Loader要應(yīng)用的規(guī)則的文件。
  • 應(yīng)用規(guī)則:對(duì)選中的文件通過(guò)use配置項(xiàng)來(lái)應(yīng)用Loader捷犹,可以只應(yīng)用一個(gè)Loader或者按照從后往前的順序應(yīng)用一組Loader弛饭,同時(shí)可以分別向Loader傳入?yún)?shù)。
  • 重置順序:一組Loader的執(zhí)行順序默認(rèn)是從右往左執(zhí)行的萍歉,通過(guò)enforce選項(xiàng)可以將其中一個(gè)Loader的執(zhí)行順序放到最前或者最后(enforce: 'pre' 將該Loader的執(zhí)行順序放到最前侣颂。 ‘post’放到最后)。

4.4 Resolve: 配置尋找模塊的規(guī)則枪孩。

4.4.1 alias

配置項(xiàng)通過(guò)別名來(lái)將導(dǎo)入路徑映射成一個(gè)新的導(dǎo)入路徑憔晒。例如使用以下配置:

resolve: {
  alias: {
    components: './src/components/'
  }
}

當(dāng)通過(guò)import Button from 'components/button'導(dǎo)入時(shí),實(shí)際上被alias等價(jià)替換成了import Button from './src/components/button'

4.4.2\color{rgb(255,0,0)}{*} mainFields

優(yōu)先配置哪份代碼

4.4.3 extensions

如果導(dǎo)入語(yǔ)句沒加后綴名蔑舞,例如 require('./data')拒担。
配置extensions: ['.ts', '.js', '.json'],會(huì)優(yōu)先加上ts后綴攻询,如果沒找到這樣的文件从撼,再去匹配js文件,以此類推钧栖,如果沒找到低零,報(bào)錯(cuò)。

4.4.4\color{rgb(255,0,0)}{*} modules

配置webpack去哪些目錄下尋找第三方模塊拯杠,默認(rèn)只會(huì)去node_modules目錄下尋找毁兆。

4.5 Plugins: 配置擴(kuò)展插件。

plugins配置項(xiàng)接收一個(gè)數(shù)組阴挣,數(shù)組里的每一項(xiàng)都是一個(gè)要使用的Plugin的實(shí)例气堕,Plugin需要的參數(shù)通過(guò)構(gòu)造函數(shù)傳入。

const CommonsChunkPlugin = require('webpack/lib/optimize/CommonsChunkPlugin');
module.exports = {
  plugins: [
    new CommonsChunkPlugin({
      name: 'common',
      chunks: ['a', 'b']
    })
  ]
}

4.6\color{rgb(255,0,0)}{*} DevServer: 配置DevServer畔咧。

通過(guò)DevServer啟動(dòng)Webpack時(shí)茎芭,配置文件里的devServer才會(huì)生效,因?yàn)檫@些參數(shù)所對(duì)應(yīng)的功能都是DevServer提供的誓沸,Webpack本身并不認(rèn)識(shí)devServer配置項(xiàng)梅桩。

4.6.1 hot 配置是否啟用模塊熱替換功能。

DevServer的默認(rèn)行為是發(fā)現(xiàn)源代碼被更新后通過(guò)自動(dòng)刷新整個(gè)頁(yè)面來(lái)做到實(shí)時(shí)預(yù)覽拜隧,開啟模塊替換功能后宿百,將在不刷新整個(gè)頁(yè)面的情況下通過(guò)用新模塊替換老模塊來(lái)做到實(shí)時(shí)預(yù)覽趁仙。

// 是否開啟模塊熱替換功能
hot: true

4.6.2 inline

4.6.3 historyApiFallback

// 是否開發(fā)HTML5 History API網(wǎng)頁(yè)
historyApiFallback: true

4.6.4 contentBase

// 配置DevServer HTTP服務(wù)器的文件根目錄
contentBase: path.join(__dirname, 'public')

4.6.5 headers

4.6.6 host

4.6.7 port

4.6.8 allowedHosts

4.6.9 disableHostCheck

4.6.10 https

// 是否開啟HTTPS模式
https: false

4.6.11 clientLogLevel

4.6.12 compress

// 是否開啟Gzip壓縮
compress: true

4.6.13 open

4.7 其他配置項(xiàng):

4.7.1\color{rgb(255,0,0)}{*} Target

target: 'web', // 瀏覽器,默認(rèn)
target: 'webworker', // WebWorker
target: 'node', // Node.js,使用`require`語(yǔ)句加載Chunk代碼
target: 'async-node', // Node.js, 異步加載Chunk代碼
target: 'node-webkit', // nw.js
target: 'electron-main', // electron垦页,主線程
target: 'electron-renderer', // electron雀费,渲染線程

4.7.2 Devtool

devtool: 'source-map'

4.7.3\color{rgb(255,0,0)}{*} Watch 和 WatchOptions

watch: true,
watchOptions: { // 監(jiān)聽模式選項(xiàng)
  // 不監(jiān)聽的文件或文件夾,支持正則匹配痊焊。默認(rèn)為空
  ignored: /node_modules/,
  // 監(jiān)聽到變化發(fā)生后盏袄,等300ms再執(zhí)行動(dòng)作,截流薄啥,防止文件更新太快導(dǎo)致重新編譯頻率太快辕羽。默認(rèn)為300ms
  aggregateTimeout: 300,
  // 不停地詢問(wèn)系統(tǒng)指定的文件有沒有發(fā)生變化,默認(rèn)每秒詢問(wèn)1000次
  poll: 1000
}

4.7.4 Externals

// 使用來(lái)自JavaScript運(yùn)行環(huán)境提供的全局變量
externals: {
  jquery: 'jQuery'
}

4.7.5\color{rgb(255,0,0)}{*} ResolveLoader

用來(lái)告訴webpack如何去尋找Loader垄惧,因?yàn)樵谑褂肔oader時(shí)是通過(guò)其包名去引用的刁愿,Webpack需要根據(jù)配置的Loader包名去找到Loader的實(shí)際代碼,以調(diào)用Loader去處理源文件到逊。
默認(rèn)配置如下:

module.exports = {
  resolveLoader: {
    // 去哪個(gè)目錄下尋找Loader
    modules: ['node_modules'],
    // 入口文件的后綴
    extensions: ['.js', '.json'],
    // 指明入口文件位置的字段
    mainFields: ['loader', 'main']
  }
}

該配置常用于加載本地的Loader

webpack配置

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末酌毡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蕾管,更是在濱河造成了極大的恐慌枷踏,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掰曾,死亡現(xiàn)場(chǎng)離奇詭異旭蠕,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)旷坦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門掏熬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人秒梅,你說(shuō)我怎么就攤上這事旗芬。” “怎么了捆蜀?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵疮丛,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我辆它,道長(zhǎng)誊薄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任锰茉,我火速辦了婚禮呢蔫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘飒筑。我一直安慰自己片吊,他們只是感情好绽昏,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著俏脊,像睡著了一般全谤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上联予,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天啼县,我揣著相機(jī)與錄音材原,去河邊找鬼沸久。 笑死,一個(gè)胖子當(dāng)著我的面吹牛余蟹,可吹牛的內(nèi)容都是我干的卷胯。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼威酒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼窑睁!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起葵孤,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤担钮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后尤仍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體箫津,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年宰啦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了苏遥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赡模,死狀恐怖田炭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情漓柑,我是刑警寧澤教硫,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站辆布,受9級(jí)特大地震影響栋豫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谚殊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一丧鸯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嫩絮,春花似錦丛肢、人聲如沸围肥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)穆刻。三九已至,卻和暖如春杠步,著一層夾襖步出監(jiān)牢的瞬間氢伟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工幽歼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留朵锣,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓甸私,卻偏偏與公主長(zhǎng)得像诚些,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子皇型,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容