webpack

概念

不像大多數(shù)的模塊打包機(jī)染服,webpack是會(huì)把項(xiàng)目當(dāng)作一個(gè)整體汹族,通過一個(gè)給定的的主文件疯攒,webpack將從這個(gè)文件開始找到你的項(xiàng)目的所有依賴文件末秃,使用loaders處理它們,最后打包成一個(gè)或多個(gè)瀏覽器可識(shí)別的bundle.js文件

組成

  • entry 用來寫入口文件玩郊,它將是整個(gè)依賴關(guān)系的根
var baseConfig = {
        entry: {
            main: './src/index.js'
        }
    }
  • output 輸出配置
  • Loader
    loader用于加載某些資源文件肢执。因?yàn)閣ebpack本身只能打包c(diǎn)ommon.js規(guī)范的js文件,對于其他資源如css译红,img等预茄,是沒有辦法加載的,這時(shí)就需要對應(yīng)的loader將資源轉(zhuǎn)化侦厚,從而進(jìn)行加載耻陕。
  • Plugins
    plugin用于擴(kuò)展webpack的功能。不同于loader刨沦,plugin的功能更加豐富诗宣,比如壓縮打包,優(yōu)化想诅,不只局限于資源的加載
  • bundle
    是由webpack打包出來的文件
  • chunk
    是指webpack在進(jìn)行模塊依賴分析的時(shí)候召庞,代碼分割出來的代碼塊
  • module
    是開發(fā)中的單個(gè)模塊

常見問題

關(guān)于webpack的面試題總結(jié)

webpack與grunt、gulp的不同来破?

grunt和gulp是基于任務(wù)和流(Task篮灼、Stream)的。類似jQuery徘禁,找到一個(gè)(或一類)文件穿稳,對其做一系列鏈?zhǔn)讲僮鳎铝魃系臄?shù)據(jù)晌坤, 整條鏈?zhǔn)讲僮鳂?gòu)成了一個(gè)任務(wù)逢艘,多個(gè)任務(wù)就構(gòu)成了整個(gè)web的構(gòu)建流程。
webpack是基于入口的骤菠。webpack會(huì)自動(dòng)地遞歸解析入口所需要加載的所有資源文件它改,然后用不同的Loader來處理不同的文件,用Plugin來擴(kuò)展webpack功能商乎。

有哪些常見的Loader央拖?他們是解決什么問題的?

file-loader:把文件輸出到一個(gè)文件夾中,在代碼中通過相對 URL 去引用輸出的文件
url-loader:和 file-loader 類似鲜戒,但是能在文件很小的情況下以 base64 的方式把文件內(nèi)容注入到代碼中去
source-map-loader:加載額外的 Source Map 文件专控,以方便斷點(diǎn)調(diào)試
image-loader:加載并且壓縮圖片文件
babel-loader:把 ES6 轉(zhuǎn)換成 ES5
css-loader:加載 CSS,支持模塊化遏餐、壓縮伦腐、文件導(dǎo)入等特性
style-loader:把 CSS 代碼注入到 JavaScript 中,通過 DOM 操作去加載 CSS失都。
eslint-loader:通過 ESLint 檢查 JavaScript 代碼

有哪些常見的Plugin柏蘑?他們是解決什么問題的?

define-plugin:定義環(huán)境變量
commons-chunk-plugin:提取公共代碼
uglifyjs-webpack-plugin:通過UglifyES壓縮ES6代碼

webpack的構(gòu)建流程是什么?

1.初始化參數(shù):從配置文件和 Shell 語句中讀取與合并參數(shù)粹庞,得出最終的參數(shù)咳焚;
2.開始編譯:用上一步得到的參數(shù)初始化 Compiler 對象,加載所有配置的插件庞溜,執(zhí)行對象的 run 方法開始執(zhí)行編譯革半;
3.確定入口:根據(jù)配置中的 entry 找出所有的入口文件;
4.編譯模塊:從入口文件出發(fā)流码,調(diào)用所有配置的 Loader 對模塊進(jìn)行翻譯又官,再找出該模塊依賴的模塊,再遞歸本步驟直到所有入口依賴的文件都經(jīng)過了本步驟的處理旅掂;
5.完成模塊編譯:在經(jīng)過第4步使用 Loader 翻譯完所有模塊后赏胚,得到了每個(gè)模塊被翻譯后的最終內(nèi)容以及它們之間的依賴關(guān)系访娶;
6.輸出資源:根據(jù)入口和模塊之間的依賴關(guān)系商虐,組裝成一個(gè)個(gè)包含多個(gè)模塊的 Chunk,再把每個(gè) Chunk 轉(zhuǎn)換成一個(gè)單獨(dú)的文件加入到輸出列表崖疤,這步是可以修改輸出內(nèi)容的最后機(jī)會(huì)秘车;
7.輸出完成:在確定好輸出內(nèi)容后,根據(jù)配置確定輸出的路徑和文件名劫哼,把文件內(nèi)容寫入到文件系統(tǒng)叮趴。
在以上過程中,Webpack 會(huì)在特定的時(shí)間點(diǎn)廣播出特定的事件权烧,插件在監(jiān)聽到感興趣的事件后會(huì)執(zhí)行特定的邏輯眯亦,并且插件可以調(diào)用 Webpack 提供的 API 改變 Webpack 的運(yùn)行結(jié)果。

是否寫過Loader和Plugin般码?描述一下編寫loader或plugin的思路妻率?

Loader像一個(gè)"翻譯官"把讀到的源文件內(nèi)容轉(zhuǎn)義成新的文件內(nèi)容,并且每個(gè)Loader通過鏈?zhǔn)讲僮靼遄#瑢⒃次募徊讲椒g成想要的樣子宫静。
編寫Loader時(shí)要遵循單一原則,每個(gè)Loader只做一種"轉(zhuǎn)義"工作。 每個(gè)Loader的拿到的是源文件內(nèi)容(source)孤里,可以通過返回值的方式將處理后的內(nèi)容輸出伏伯,也可以調(diào)用this.callback()方法,將內(nèi)容返回給webpack捌袜。 還可以通過 this.async()生成一個(gè)callback函數(shù)说搅,再用這個(gè)callback將處理后的內(nèi)容輸出出去。 此外webpack還為開發(fā)者準(zhǔn)備了開發(fā)loader的工具函數(shù)集——loader-utils琢蛤。
相對于Loader而言蜓堕,Plugin的編寫就靈活了許多。 webpack在運(yùn)行的生命周期中會(huì)廣播出許多事件博其,Plugin 可以監(jiān)聽這些事件套才,在合適的時(shí)機(jī)通過 Webpack 提供的 API 改變輸出結(jié)果。

如何利用webpack來優(yōu)化前端性能慕淡?

用webpack優(yōu)化前端性能是指優(yōu)化webpack的輸出結(jié)果背伴,讓打包的最終結(jié)果在瀏覽器運(yùn)行快速高效。

  • 壓縮代碼峰髓。刪除多余的代碼傻寂、注釋、簡化代碼的寫法等等方式携兵〖碴可以利用webpack的UglifyJsPlugin和ParallelUglifyPlugin來壓縮JS文件, 利用cssnano(css-loader?minimize)來壓縮css
  • 利用CDN加速徐紧。在構(gòu)建過程中静檬,將引用的靜態(tài)資源路徑修改為CDN上對應(yīng)的路徑〔⒓叮可以利用webpack對于output參數(shù)和各loader的publicPath參數(shù)來修改資源路徑
  • 刪除死代碼(Tree Shaking)拂檩。將代碼中永遠(yuǎn)不會(huì)走到的片段刪除掉〕氨蹋可以通過在啟動(dòng)webpack時(shí)追加參數(shù)--optimize-minimize來實(shí)現(xiàn)
  • 提取公共代碼稻励。
如何在vue項(xiàng)目中實(shí)現(xiàn)按需加載?

Vue UI組件庫的按需加載 為了快速開發(fā)前端項(xiàng)目愈涩,經(jīng)常會(huì)引入現(xiàn)成的UI組件庫如ElementUI望抽、iView等,但是他們的體積和他們所提供的功能一樣履婉,是很龐大的煤篙。 而通常情況下,我們僅僅需要少量的幾個(gè)組件就足夠了谐鼎,但是我們卻將龐大的組件庫打包到我們的源碼中舰蟆,造成了不必要的開銷趣惠。

不過很多組件庫已經(jīng)提供了現(xiàn)成的解決方案,如Element出品的babel-plugin-component和AntDesign出品的babel-plugin-import 安裝以上插件后身害,在.babelrc配置中或babel-loader的參數(shù)中進(jìn)行設(shè)置味悄,即可實(shí)現(xiàn)組件按需加載了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末塌鸯,一起剝皮案震驚了整個(gè)濱河市侍瑟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌丙猬,老刑警劉巖涨颜,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異茧球,居然都是意外死亡庭瑰,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門抢埋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來弹灭,“玉大人,你說我怎么就攤上這事揪垄。” “怎么了饥努?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵捡鱼,是天一觀的道長。 經(jīng)常有香客問我酷愧,道長驾诈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任伟墙,我火速辦了婚禮翘鸭,結(jié)果婚禮上滴铅,老公的妹妹穿的比我還像新娘戳葵。我一直安慰自己,他們只是感情好汉匙,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布拱烁。 她就那樣靜靜地躺著,像睡著了一般噩翠。 火紅的嫁衣襯著肌膚如雪戏自。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天伤锚,我揣著相機(jī)與錄音擅笔,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛猛们,可吹牛的內(nèi)容都是我干的念脯。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼弯淘,長吁一口氣:“原來是場噩夢啊……” “哼绿店!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起庐橙,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤假勿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后态鳖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體转培,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年浆竭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了堡距。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡兆蕉,死狀恐怖羽戒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情虎韵,我是刑警寧澤易稠,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站包蓝,受9級特大地震影響驶社,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜测萎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一亡电、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧硅瞧,春花似錦份乒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至枣接,卻和暖如春颂暇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背但惶。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工耳鸯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留湿蛔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓县爬,卻偏偏與公主長得像煌集,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子捌省,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

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