你真的熟練使用webpack嗎?


當自己在簡歷中寫着熟練使用webpack的時候,殊不知自己只是在vue腳手架,react腳手架的路上走着比較輕松而已。

當面試官問你這幾個問題的時候,你還能從容答上來嗎(高手請忽略)
  • 什么是webpack,webpack的打包過程是怎么樣的?
  • webpack基礎配置的屬性有哪些
  • 什么是loader?什么是plugin?他們執行先后關系是什么?
  • 提高webpack的構建速度(這個比較廣泛)
  • 是否自己寫過plugin(一旦你回答寫過,馬上問題就來了)
  • 是否用過compiler ,介紹其中幾個方法?

正文

先拋開這幾個問題。談談本人正常學習webpack的過程,由於幾年前先接觸的vue,一套vue-cli跑下來 ,生成demo以后感覺自己不僅

學會了vue,還精通了webpack。

后面有個偶然的機會,想自己從頭使用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

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所有需要了解的知識點的大概范圍。

在實際場景應用的時候,各不相同。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM