webpack 面試題

1. webpack3和webpack4的區(qū)別

1.1. mode/–mode參數(shù)
新增了mode/--mode參數(shù)來表示是開發(fā)還是生產(chǎn)(development/production)
production 側(cè)重于打包后的文件大小,development側(cè)重于goujiansud
1.2. 移除loaders,必須使用rules(在3版本的時(shí)候loaders和rules 是共存的但是到4的時(shí)候只允許使用rules)
1.3. 移除了CommonsChunkPlugin (提取公共代碼),用optimization.splitChunks和optimization.runtimeChunk來代替
1.4. 支持es6的方式導(dǎo)入JSON文件,并且可以過濾無用的代碼

let jsonData = require('./data.json')
import jsonData from './data.json'
import { first } from './data.json' // 打包時(shí)只會(huì)把first相關(guān)的打進(jìn)去

1.5. 升級(jí)happypack插件(happypack可以進(jìn)行多線程加速打包)
1.6. ExtractTextWebpackPlugin調(diào)整,建議選用新的CSS文件提取kiii插件mini-css-extract-plugin,production模式,增加 minimizer

2. loader 和 plugin 不同

2.1. loader是使wenbpack擁有加載和解析非js文件的能力
2.2. plugin 可以擴(kuò)展webpack的功能,使得webpack更加靈活??梢栽跇?gòu)建的過程中通過webpack的api改變輸出的結(jié)果

3. webpack構(gòu)建流程

3.1. 初始化參數(shù),從配置文件和shell語句中讀到的參數(shù)合并,得到最后的參數(shù)
3.2. 開始編譯:用合并得到的參數(shù)初始化complier對(duì)象,加載是所有配置的插件,執(zhí)行run方法開始編譯
3.3. 確定入口,通過entry找到入口文件
3.4. 編譯模塊,從入口文件出發(fā),調(diào)用所有配置的loader對(duì)模塊進(jìn)行解析翻譯,在找到該模塊依賴的模塊進(jìn)行處理
3.5. 完成模塊編譯,得到每個(gè)模塊被翻譯之后的最終的內(nèi)容和依賴關(guān)系
3.6. 輸出資源,根據(jù)入口和模塊之間的依賴關(guān)系,組裝成一個(gè)個(gè)包含多個(gè)模塊的chunk,在把每個(gè)chunk轉(zhuǎn)換成一個(gè)單獨(dú)的文件加載到輸出列表
3.7. 輸出完成,確定輸出的路徑和文件名,把內(nèi)容寫到文件系統(tǒng)中
在以上過程中,webpack會(huì)在特定的時(shí)間點(diǎn)廣播出特定的事件,插件在艦艇感興趣的事件后會(huì)執(zhí)行特定的邏輯,改變webpack的運(yùn)行結(jié)果

4. webpack 熱加載執(zhí)行原理

????

5. 如何利用webpack來優(yōu)化前端性能

5.1. 壓縮代碼。uglifyJsPlugin 壓縮js代碼, mini-css-extract-plugin 壓縮css代碼
5.2. 利用CDN加速,將引用的靜態(tài)資源修改為CDN上對(duì)應(yīng)的路徑,可以利用webpack對(duì)于output參數(shù)和loader的publicpath參數(shù)來修改資源路徑
5.3. 刪除死代碼(tree shaking),css需要使用Purify-CSS
5.4. 提取公共代碼。webpack4移除了CommonsChunkPlugin (提取公共代碼),用optimization.splitChunks和optimization.runtimeChunk來代替

6. 什么是bundle,什么是chunk,什么是module?

bundle:有webpack打包出來的文件
chunk:webpack在進(jìn)行模塊的依賴分析的時(shí)候,代碼分割出來的代碼塊
module:開發(fā)中的單個(gè)模塊

7. webpack-dev-server和http服務(wù)器如nginx有什么區(qū)別?

webpack-dev-server使用內(nèi)存來存儲(chǔ)webpack開發(fā)環(huán)境下的打包文件,并且可以使用模塊熱更新,他比傳統(tǒng)的http服務(wù)對(duì)開發(fā)更加簡單高效。

8. DefinePlugin

DefinePlugin :允許創(chuàng)建一個(gè)在編譯時(shí)可以配置的全局變量

9. DllPlugin

使用DllPlugin可以減少基礎(chǔ)模塊編譯次數(shù),動(dòng)態(tài)鏈接庫插件,其原理是吧網(wǎng)頁依賴的基礎(chǔ)模塊抽離出來打包到dll文件中,當(dāng)需要導(dǎo)入的模塊存在于某個(gè)dll中時(shí),這個(gè)模塊不再被打包,而是去dll中獲取。在dll中大多包含的時(shí)常用的第三方模塊,只要這些模塊版本不升級(jí),就只需要被編譯一次。
注意
DllPlugin參數(shù)中的name必須要和output.library值保持一致,并且生成的mainfest文件中會(huì)引用output.library值

10. happyPack開啟多線程loader轉(zhuǎn)換

運(yùn)行在node.js之上的webpack時(shí)單線程模型,也就是只能一個(gè)一個(gè)文件進(jìn)行處理,不能并行處理,happypack可以將任務(wù)分解給多個(gè)子進(jìn)程,最后將結(jié)果發(fā)給主進(jìn)程,js是單線程模型,只能通過這種多線程的方式提高性能

參考文件:
https://segmentfault.com/a/1190000015883378

作者:月半女那
鏈接:http://www.itdecent.cn/p/e80d38661358
來源:簡書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容