webpack總結(jié)

configuration

  • webpack 的配置文件蜓耻,是導(dǎo)出一個(gè)對(duì)象的 JavaScript 文件
  • 因?yàn)?webpack 配置是標(biāo)準(zhǔn)的 Node.js CommonJS 模塊,你可以做到以下事情:
    • 通過(guò) require(...) 導(dǎo)入其他文件
    • 使用 JavaScript 控制流表達(dá)式嗡官,例如 ?: 操作符
    • 對(duì)常用值使用常量或變量
    • 編寫并執(zhí)行函數(shù)來(lái)生成部分配置

entry

  • 入口起點(diǎn):指示webpack應(yīng)該使用哪個(gè)模塊來(lái)作為構(gòu)建其內(nèi)部依賴圖的開始
  • 每個(gè)HTML頁(yè)面都有一個(gè)入口起點(diǎn)
  • 單頁(yè)面應(yīng)用(SPA):一個(gè)入口起點(diǎn)恋日,多頁(yè)面應(yīng)用(MPA):多個(gè)入口起點(diǎn)
  • 動(dòng)態(tài)加載模塊不是入口起點(diǎn)

output

  • 配置 output 選項(xiàng)可以控制 webpack 如何向硬盤寫入編譯文件;注意膀篮,即使可以存在多個(gè)入口起點(diǎn),但只指定一個(gè)輸出配置

  • 多個(gè)入口起點(diǎn):

    如果配置創(chuàng)建了多個(gè)單獨(dú)的 "chunk"(例如岂膳,使用多個(gè)入口起點(diǎn)或使用像 CommonsChunkPlugin 這樣的插件)誓竿,則應(yīng)該使用占位符(substitutions)來(lái)確保每個(gè)文件具有唯一的名稱
    ```
    {
    entry: {
    app: './src/app.js',
    search: './src/search.js'
    },
    output: {
    filename: '[name].js',
    path: __dirname + '/dist'
    }
    }

    // 寫入到硬盤:./dist/app.js, ./dist/search.js

loader

  • loader 讓webpack有能力處理那些非JavaScript文件(webpack 自身只理解JavaScript )[轉(zhuǎn)換某些類型的模塊]
  • test屬性:標(biāo)識(shí)出應(yīng)該被對(duì)應(yīng)loader進(jìn)行轉(zhuǎn)換的某些或某個(gè)文件
  • use:進(jìn)行轉(zhuǎn)換時(shí)應(yīng)該使用哪個(gè)loader
  • loader 支持鏈?zhǔn)絺鬟f。能夠?qū)Y源使用流水線(pipeline)谈截。一組鏈?zhǔn)降?loader 將按照相反的順序執(zhí)行筷屡。loader 鏈中的第一個(gè) loader 返回值給下一個(gè) loader。在最后一個(gè) loader簸喂,返回 webpack 所預(yù)期的 JavaScript

plugin

  • 插件目的在于解決 loader 無(wú)法實(shí)現(xiàn)的其他事
  • 插件的范圍包括毙死,從打包優(yōu)化和壓縮,一直到重新定義環(huán)境中的變量
  • 使用:首先通過(guò)require()導(dǎo)入喻鳄,然后將它添加到plugins數(shù)組中扼倘;當(dāng)在一個(gè)配置文件中因?yàn)椴煌康亩啻问褂猛粋€(gè)插件,這時(shí)需要通過(guò)使用 new 操作符來(lái)創(chuàng)建它的一個(gè)實(shí)例
  • 由于插件可以攜帶參數(shù)/選項(xiàng)除呵,你必須在 webpack 配置中唉锌,向 plugins 屬性傳入 new 實(shí)例。
  • 多數(shù)插件可以通過(guò)選項(xiàng)(option)來(lái)配置

file loader

即使含有 jsx的語(yǔ)法的文件后綴是js 竿奏, webpack 在加載文件時(shí) test 的正則表達(dá)式依然要包含 jsx

publicPath

確保 publicPath 總是以斜桿( / )開頭和結(jié)尾

CommonsChunkPlugin

從應(yīng)用程序bundle中提取vendor引用到vendor bundle袄简,并把引用vendor的部分替換為 __webpack__require()調(diào)用

module resolution

  • resolver 是一個(gè)庫(kù)(library),用于幫助找到模塊的絕對(duì)路徑
  • 解析器(resolver)將檢查路徑是否指向文件或目錄泛啸。如果路徑指向一個(gè)文件:
    • 如果路徑具有文件擴(kuò)展名绿语,則被直接將文件打包
    • 否則,將使用 [resolve.extensions] 選項(xiàng)作為文件擴(kuò)展名來(lái)解析候址,此選項(xiàng)告訴解析器在解析中能夠接受哪些擴(kuò)展名(例如 .js, .jsx)
  • 如果路徑指向一個(gè)文件夾吕粹,則采取以下步驟找到具有正確擴(kuò)展名的正確文件:
    • 如果文件夾中包含 package.json 文件,則按照順序查找 resolve.mainFields 配置選項(xiàng)中指定的字段岗仑。并且 package.json 中的第一個(gè)這樣的字段確定文件路徑
    • 如果 package.json 文件不存在或者 package.json 文件中的 main 字段沒有返回一個(gè)有效路徑匹耕,則按照順序查找 resolve.mainFiles 配置選項(xiàng)中指定的文件名,看是否能在 import/require 目錄下匹配到一個(gè)存在的文件名
    • 文件擴(kuò)展名通過(guò) resolve.extensions 選項(xiàng)采用類似的方法進(jìn)行解析
  • resolve.alias: 替換初始模塊路徑,來(lái)確保模塊引入變得更簡(jiǎn)單; 例如一些位于 src/ 文件夾下的常用模塊:
    alias: {
      Utilities: path.resolve(__dirname, 'src/utilities/'),
      Templates: path.resolve(__dirname, 'src/templates/')
    }
    

output.filename

  • 決定了每個(gè)輸出 bundle 的名稱
  • 對(duì)于單個(gè)入口起點(diǎn)荠雕,filename 會(huì)是一個(gè)靜態(tài)名稱
    filename: "bundle.js"
    
  • 然而稳其,當(dāng)通過(guò)多個(gè)入口起點(diǎn)(entry point)驶赏、代碼拆分(code splitting)或各種插件(plugin)創(chuàng)建多個(gè) bundle,應(yīng)該使用以下一種替換方式既鞠,來(lái)賦予每個(gè) bundle 一個(gè)唯一的名稱
    • 使用入口名稱:
    filename: "[name].bundle.js"
    
    • 使用內(nèi)部 chunk id
    filename: "[id].bundle.js"
    
    • 使用每次構(gòu)建過(guò)程中煤傍,唯一的 hash 生成
    filename: "[name].[hash].bundle.js"
    
    • 使用基于每個(gè) chunk 內(nèi)容的 hash:
    filename: "[chunkhash].bundle.js"
    

output.chunkFileName

  • 此選項(xiàng)決定了非入口(non-entry) chunk 文件的名稱

CommonsChunkPlugin

  • 通過(guò)將公共模塊(chunk)拆出來(lái),最終合成的文件(另一個(gè)chunk)能夠在最開始的時(shí)候加載一次嘱蛋,便緩存到緩存中供后續(xù)使用

  • 配置:

    {
        name: string, // or
        names: string[],
        // 這是 common chunk 的名稱蚯姆。已經(jīng)存在的 chunk 可以通過(guò)傳入一個(gè)已存在的 chunk 名稱而被選擇。
        // 如果一個(gè)字符串?dāng)?shù)組被傳入洒敏,這相當(dāng)于插件針對(duì)每個(gè) chunk 名被多次調(diào)用
        // 如果該選項(xiàng)被忽略龄恋,同時(shí) `options.async` 或者 `options.children` 被設(shè)置,所有的 chunk 都會(huì)被使用凶伙,
        // 否則 `options.filename` 會(huì)用于作為 chunk 名篙挽。
        // When using `options.async` to create common chunks from other async chunks you must specify an entry-point
        // chunk name here instead of omitting the `option.name`.
    
        filename: string,
        // common chunk 的文件名模板∧餮ィ可以包含與 `output.filename` 相同的占位符铣卡。
        // 如果被忽略,原本的文件名不會(huì)被修改(通常是 `output.filename` 或者 `output.chunkFilename`)偏竟。
        // This option is not permitted if you're using `options.async` as well, see below for more details.
    
        minChunks: number|Infinity|function(module, count) => boolean,
        // 在傳入  公共chunk(commons chunk) 之前所需要包含的最少數(shù)量的 chunks 煮落。
        // 數(shù)量必須大于等于2,或者少于等于 chunks的數(shù)量
        // 傳入 `Infinity` 會(huì)馬上生成 公共chunk踊谋,但里面沒有模塊蝉仇。
        // 你可以傳入一個(gè) `function` ,以添加定制的邏輯(默認(rèn)是 chunk 的數(shù)量)
    
        chunks: string[],
        // 通過(guò) chunk name 去選擇 chunks 的來(lái)源殖蚕。chunk 必須是  公共chunk 的子模塊轿衔。
        // 如果被忽略,所有的睦疫,所有的 入口chunk (entry chunk) 都會(huì)被選擇害驹。
    
        children: boolean,
        // 如果設(shè)置為 `true`,所有公共 chunk 的子模塊都會(huì)被選擇
    
        deepChildren: boolean,
        // 如果設(shè)置為 `true`蛤育,所有公共 chunk 的后代模塊都會(huì)被選擇
    
        async: boolean|string,
        // 如果設(shè)置為 `true`宛官,一個(gè)異步的  公共chunk 會(huì)作為 `options.name` 的子模塊,和 `options.chunks` 的兄弟模塊被創(chuàng)建瓦糕。
        // 它會(huì)與 `options.chunks` 并行被加載底洗。
        // Instead of using `option.filename`, it is possible to change the name of the output file by providing
        // the desired string here instead of `true`.
    
        minSize: number,
        // 在 公共chunk 被創(chuàng)建立之前,所有 公共模塊 (common module) 的最少大小咕娄。
    }
    
  • 給 minChunks 配置傳入函數(shù):

    你也可以給 minChunks 傳入一個(gè)函數(shù)亥揖。這個(gè)函數(shù)會(huì)被 CommonsChunkPlugin 插件回調(diào),并且調(diào)用函數(shù)時(shí)會(huì)傳入 module 和 count 參數(shù);

    module 參數(shù)代表每個(gè) chunks 里的模塊, 這些 chunks 是通過(guò) name/names 參數(shù)傳入的( 傳入的chunk是沒有被拆出來(lái)之前的公共模塊; 配置中 name/names 字段的說(shuō)明: 這是 common chunk 的名稱圣勒。已經(jīng)存在的 chunk 可以通過(guò)傳入一個(gè)已存在的 chunk 名稱而被選擇)
    module 有兩個(gè)有用的屬性:
    + module.context:這個(gè)公共模塊所在的目錄费变,例如:'/my_project/node_modules/example-dependency'
    + module.resource: 這個(gè)公共模塊的文件名摧扇,例如:'/my_project/node_modules/example-dependency/index.js'
    > count 參數(shù)表示 module 被使用的 chunk 數(shù)量

    當(dāng)你想要對(duì) CommonsChunk 如何決定模塊被打包到哪里的算法有更為細(xì)致的控制, 這個(gè)配置就會(huì)非常有用
    new webpack.optimize.CommonsChunkPlugin({ name: 'my-single-lib-chunk', filename: 'my-single-lib-chunk.js', minChunks: function(module, count) { // 如果模塊是一個(gè)路徑胡控,而且在路徑中有 "somelib" 這個(gè)名字出現(xiàn), // 而且它還被三個(gè)不同的 chunks/入口chunk 所使用旁趟,那請(qǐng)將它拆分到 // 另一個(gè)分開的 chunk 中昼激,chunk 的 keyname 是 "my-single-lib-chunk",而文件名是 "my-single-lib-chunk.js" return module.resource && (/somelib/).test(module.resource) && count === 3; } });
    > 正如上面看到的锡搜,這個(gè)例子允許你只將其中一個(gè)庫(kù)移到一個(gè)分開的文件當(dāng)中橙困,當(dāng)而僅當(dāng)函數(shù)中的所有條件都被滿足了

Manifest file

  • 當(dāng)編譯器(compiler)開始執(zhí)行、解析和映射應(yīng)用程序時(shí)耕餐,它會(huì)保留所有模塊的詳細(xì)要點(diǎn)凡傅。這個(gè)數(shù)據(jù)集合稱為 "Manifest",當(dāng)完成打包并發(fā)送到瀏覽器時(shí)肠缔,會(huì)在運(yùn)行時(shí)通過(guò) Manifest 來(lái)解析和加載模塊
  • 分離manifest:將webpack的bootstrap(啟動(dòng))邏輯提取到一個(gè)單獨(dú)的文件中:
    new webpack.optimize.CommonsChunkPlugin({
      name: 'manifest',
      minChunks: Infinity
    });
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末夏跷,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子明未,更是在濱河造成了極大的恐慌槽华,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件趟妥,死亡現(xiàn)場(chǎng)離奇詭異猫态,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)披摄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門亲雪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人疚膊,你說(shuō)我怎么就攤上這事义辕。” “怎么了寓盗?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵终息,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我贞让,道長(zhǎng)周崭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任喳张,我火速辦了婚禮续镇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘销部。我一直安慰自己摸航,他們只是感情好制跟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著酱虎,像睡著了一般雨膨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上读串,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天聊记,我揣著相機(jī)與錄音,去河邊找鬼恢暖。 笑死排监,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的杰捂。 我是一名探鬼主播舆床,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼嫁佳!你這毒婦竟也來(lái)了挨队?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蒿往,失蹤者是張志新(化名)和其女友劉穎瞒瘸,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體熄浓,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡情臭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了赌蔑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俯在。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖娃惯,靈堂內(nèi)的尸體忽然破棺而出跷乐,到底是詐尸還是另有隱情,我是刑警寧澤趾浅,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布愕提,位于F島的核電站,受9級(jí)特大地震影響皿哨,放射性物質(zhì)發(fā)生泄漏浅侨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一证膨、第九天 我趴在偏房一處隱蔽的房頂上張望如输。 院中可真熱鬧,春花似錦、人聲如沸不见。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)稳吮。三九已至缎谷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間灶似,已是汗流浹背列林。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留喻奥,地道東北人席纽。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓捏悬,卻偏偏與公主長(zhǎng)得像撞蚕,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子过牙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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