當自己在簡歷中寫著熟練使用webpack的時候,殊不知自己只是在vue腳手架,react腳手架的路上走著比較輕鬆而已。
當面試官問你這幾個問題的時候,你還能從容答上來嗎(高手請忽略)
- 什麼是webpack,webpack的打包過程是怎麼樣的?
- webpack基礎配置的屬性有哪些
- 什麼是loader?什麼是plugin?他們執行先後關係是什麼?
- 提高webpack的構建速度(這個比較廣泛)
- 是否自己寫過plugin(一旦你回答寫過,馬上問題就來了)
- 是否用過compiler ,介紹其中幾個方法?
正文
先拋開這幾個問題。談談本人正常學習webpack的過程,由於幾年前先接觸的vue,一套vue-cli跑下來 ,生成demo以後感覺自己不僅
學會了vue,還精通了webpack。
後面有個偶然的機會,想自己從頭使用webpack部署。才知道里面沒有那麼簡單。
這裡有個參考的文章:
感興趣的可以自己看。
webpack的打包過程是怎麼樣的
這個當自己實踐著一步步去嘗試開始的時候的,會有個比較清晰的理解的。
webpack是一個打包模組化javascript的工具,在webpack裡一切檔案皆模組,
通過loader轉換檔案,通過plugin注入鉤子,最後輸出由多個模組組合成的檔案,
webpack專注構建模組化專案。
webpack基礎配置的屬性有哪些
- 入口(entry)
- 輸出(output)
- loader
- 外掛(plugins)
當然在實際工程中,看到的的webpack的配置屬性遠遠沒有這麼簡單。
比如:我們會環境配置。dev,pro等等。
可能會使用到代理配置:類似於下面程式碼所示,用來進行跨域配置
proxyTable: {
'/api': {
target: 'http://……………………',
changeOrigin: true,
pathRewrite: {
'^/api': '/api'
}
},
}
每個屬性的配置都可以延伸開,比如入口,可以是單入口,也可以是多入口。
一旦用到具體的場景的話。
每個配置項都有可能變得複雜起來。
什麼是loader?什麼是plugin?他們執行先後關係是什麼?
loader 用於對模組的原始碼進行轉換。
loader 可以使你在 import 或"載入"模組時預處理檔案。
因此,loader 類似於其他構建工具中“任務(task)”,並提供了處理前端構建步驟的強大方法。
外掛是 webpack 的支柱功能。
webpack 自身也是構建於,你在 webpack 配置中用到的相同的外掛系統之上!
外掛目的在於解決 loader 無法實現的其他事。
自然而然,這樣通過描述,就能比較清晰的理解的。
plugin是在loader之後執行的,當loader處理完模組程式碼,plugin繼續處理loader未能做完的事情
提高webpack的構建速度
這裡有的一篇文章介紹的比較詳細
https://www.jianshu.com/p/bb1e76edc71e
當然優化的點大致可以區分下
- 選用合適的loader,這個是比較重要的,能夠有效的提升webpack編譯的速度。
- 使用Happypack 實現多執行緒加速編譯。
- 不需要打包編譯的外掛庫換成全域性"script"標籤引入的方式
- 開啟快取
什麼是compiler
這個只有當自己真正去寫外掛的時候,才會意識到的。
Compiler 模組是 webpack 的支柱引擎,它通過 CLI 或 Node API 傳遞的所有選項,
建立出一個 compilation 例項。它擴充套件(extend)自 Tapable 類,以便註冊和呼叫外掛。
大多數面向使用者的外掛,會先在 Compiler 上註冊。
以下生命週期鉤子函式,
生命週期 | 說明 |
---|---|
entryOption | 在 entry 配置項處理過之後,執行外掛 |
afterPlugins | 設定完初始外掛之後,執行外掛 |
afterResolvers | resolver 安裝完成之後,執行外掛。 |
environment | environment 準備好之後,執行外掛。 |
afterEnvironment | environment 安裝完成之後,執行外掛。 |
beforeRun | compiler.run() 執行之前,新增一個鉤子。 |
run | 開始讀取 records 之前,鉤入(hook into) compiler。 |
watchRun | 監聽模式下,一個新的編譯(compilation)觸發之後,執行一個外掛,但是是在實際編譯開始之前。 |
normalModuleFactory | NormalModuleFactory 建立之後,執行外掛。 |
contextModuleFactory | ContextModuleFactory 建立之後,執行外掛。 |
beforeCompile | 編譯(compilation)引數建立之後,執行外掛。 |
compile | 一個新的編譯(compilation)建立之後,鉤入(hook into) compiler。 |
thisCompilation | 觸發 compilation 事件之前執行(檢視下面的 compilation)。 |
compilation | 編譯(compilation)建立之後,執行外掛。 |
make | …… |
afterCompile | …… |
shouldEmit | ……。 |
needAdditionalPass | …… |
afterEmit | 生成資源到 output 目錄之後。 |
done | 編譯(compilation)完成。 |
failed | 編譯(compilation)失敗。 |
invalid | 監聽模式下,編譯無效時。 |
watchClose | 監聽模式停止。 |
實際應用的時候,大概只需要上面幾個編譯前,編譯後的幾個鉤子
最後
請原諒偶只是個標題黨,文章也只是大致介紹的webpack所有需要了解的知識點的大概範圍。
在實際場景應用的時候,各不相同。