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)載請注明出處。