成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Webpack原理與實踐:webpack如何利用插件機制橫向擴展構建能力?

開發 前端
簡單了解了幾個常用的插件,一般適合用于任何類型的項目,不管是否使用了框架。webpack為每個工作環節都預留了合適的鉤子,擴展時只需要找到合適的時機去做合適的事情。

[[441092]]

寫在前面

webpack插件機制的目的是:為了增強webpack在項目自動化構建方面的能力。插件最常見的應用場景是:

  • 實現自動在打包之前清除dist目錄(上次打包的結果)
  • 自動生成應用所需的html文件
  • 根據不同環境為代碼注入類似API地址這種可能變化的部分
  • 拷貝不需要參與打包的資源文件到輸出目錄
  • 壓縮webpack打包完成后輸出的文件
  • 自動發布打包結果到服務器實現自動部署

插件機制

webpack每次打包的結果都是直接覆蓋到dist目錄,打包前,dist目錄中可能已經存在上一次打包操作時遺留的文件,再次打包時,只能覆蓋掉同名文件,已經移除的資源文件會一直累積在里面,最終導致部署上線時出現多余文件。很明顯這是不合理的。

更好的做法當然是:在每次完整打包淺,自動明清理dist目錄,每次打包過后,dist目錄中就只會存在那些必要的文件。我們可以依賴第三方npm包:clean-webpack-plugin。安裝后回到webpack的配置文件中,導入clean-webpack-plugin插件,該插件模塊導出CleanWebpackPlugin。

  1. //webpack.config.js 
  2. const path = require("path"
  3. const {CleanWebpackPlugin} = require("clean-webpack-plugin"
  4. module.exports = { 
  5.   entry:"./src/index.js"
  6.   output:{ 
  7.     filename:"bundle.js"
  8.   }, 
  9.   mode:"none"
  10.   plugins:[ 
  11.     new CleanWebpackPlugin() 
  12.   ] 
  1. // src/index.js 
  2. console.log("nihao nihao"); 

打包壓縮后的代碼:

  1. /******/ (() => { // webpackBootstrap 
  2. var __webpack_exports__ = {}; 
  3. console.log("nihao nihao"); 
  4. /******/ })() 
  5. ;        

我們知道html文件一般都是通過硬編碼的方式,單獨存放在項目的根目錄下,這種方式有兩個問題:

  • 項目發布時,我們需要同時發布根目錄下的html文件和dist目錄中所有打包的打包結果,非常麻煩,而且上線后還要確保html代碼中的資源文件正確
  • 如果打包結果輸出的目錄或文件名發生變化,那么html代碼中對應的script標簽需要我們手動修改路徑

為此webpack也有相關的插件自動生成html,相對于之前寫死html文件的方式,自動生成html的優勢在于:

  • html也輸出到dist目錄中,上線時只需要把dist目錄發布出去
  • html中的script標簽是自動引入的,所以可以確保資源文件的路徑是正常的

安裝后回到配置文件,載入此模塊,相對于clean-webpack-plugin需要解構內部成員所不同,html-webpack-olugin插件默認導出的就是插件類型。

對于生成的html文件,頁面的title需要修改,許多時候還需要我們自定義頁面的一些meta標簽和基礎dom結構。

  1. const path = require("path"
  2. const {CleanWebpackPlugin} = require("clean-webpack-plugin"
  3. const HtmlWebpackPlugin = require("html-webpack-plugin"
  4. module.exports = { 
  5.   entry:"./src/index.js"
  6.   output:{ 
  7.     filename:"bundle.js"
  8.   }, 
  9.   mode:"none"
  10.   plugins:[ 
  11.     new CleanWebpackPlugin(), 
  12.     new HtmlWebpackPlugin({ 
  13.       title:"hello webpack"
  14.       template:"./src/index.html" 
  15.     }) 
  16.   ] 

指定要打包的html文件:

  1. <!DOCTYPE html> 
  2. <html lang="en"
  3. <head> 
  4.   <meta charset="UTF-8"
  5.   <meta http-equiv="X-UA-Compatible" content="IE=edge"
  6.   <meta name="viewport" content="width=device-width, initial-scale=1.0"
  7.   <title><%= htmlWebpackPlugin.options.title %></title> 
  8. </head> 
  9. <body> 
  10.   <div class="container"
  11.     <h1>頁面結構</h1> 
  12.     <div id="root"></div> 
  13.   </div> 
  14. </body> 
  15. </html>

這樣就自動生成了一個html文件:

  1. <!DOCTYPE html> 
  2. <html lang="en"
  3. <head> 
  4.   <meta charset="UTF-8"
  5.   <meta http-equiv="X-UA-Compatible" content="IE=edge"
  6.   <meta name="viewport" content="width=device-width, initial-scale=1.0"
  7.   <title>hello webpack</title> 
  8. <script defer src="bundle.js"></script></head> 
  9. <body> 
  10.   <div class="container"
  11.     <h1>頁面結構</h1> 
  12.     <div id="root"></div> 
  13.   </div> 
  14. </body> 
  15. </html> 

html-webpack-olugin除了可以自定義輸出文件內容,同時還可以輸出多個html文件,通過HtmlWebpackPlugin創建的對象是用于生成index.html文件的,玩去哪可以再創建一個新的實例對象,用于創建額外的html文件。

對于項目中一些不需要參與構建的靜態文件如:網站的favicon、robots.txt文件等,但是需要發布在線上。那么可以將這類文件統一放在根目錄下的public或static目錄中,希望webpack在打包時一并將這個目錄下所有的文件復制到輸出目錄,這種需求可以使用copy-webpack-plugin插件的實現。

  1. plugins:[ 
  2.   new CleanWebpackPlugin(), 
  3.   new HtmlWebpackPlugin({ 
  4.     title:"hello webpack"
  5.     template:"./src/index.html" 
  6.   }), 
  7.   new CopyWebpackPlugin([ 
  8.     "public"//需要拷貝的目錄或者路徑 
  9.   ]) 

參考文章

  • 《webpack原理與實踐》
  • 《webpack中文文檔》

寫在最后

簡單了解了幾個常用的插件,一般適合用于任何類型的項目,不管是否使用了框架。webpack為每個工作環節都預留了合適的鉤子,擴展時只需要找到合適的時機去做合適的事情。

 

責任編輯:姜華 來源: 前端萬有引力
相關推薦

2021-12-20 00:03:38

Webpack運行機制

2021-12-24 08:01:44

Webpack優化打包

2021-12-16 22:02:28

webpack原理模塊化

2021-12-15 23:42:56

Webpack原理實踐

2021-12-25 22:29:04

WebpackRollup 前端

2017-05-02 16:29:11

Webpack技巧建議

2017-03-24 10:56:21

Webpack技巧建議

2009-12-11 10:29:03

PHP插件機制

2022-03-08 09:16:20

webpack前端開發

2021-07-04 22:22:23

Webpack5前端工具

2020-08-05 08:21:41

Webpack

2021-12-22 22:44:49

Webpack熱替換模塊

2021-12-17 00:02:28

Webpack資源加載

2021-05-31 05:36:43

WebpackJavaScript 前端

2011-06-09 17:26:17

Qt 插件 API

2023-11-07 10:19:08

2020-11-17 08:09:01

webpack配置項腳手架

2010-09-08 14:39:35

2024-05-27 00:00:01

2024-09-27 11:46:51

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91视频电影 | 欧美在线a | 国产精品久久久久久亚洲调教 | 国产激情91久久精品导航 | 国产精品美女久久久久aⅴ国产馆 | 在线一区视频 | 日日摸日日碰夜夜爽2015电影 | 亚洲福利| 91精品国产综合久久婷婷香蕉 | 久久国产精品久久久久久 | 日本免费网 | 日韩欧美在线播放 | www亚洲精品 | 国产精品国产三级国产aⅴ原创 | 国产视频一区在线 | av黄色在线 | 国产四区| 爱爱视频在线观看 | 欧美1级 | 91精品国产91久久久久久密臀 | 欧美一区二区免费 | 亚洲91 | 亚洲不卡在线视频 | 免费在线看黄 | 九九久久精品 | 在线永久看片免费的视频 | 一区二区三区精品视频 | 操操日 | 99久久国产综合精品麻豆 | 亚洲成人免费网址 | 麻豆一区一区三区四区 | 久久夜视频 | 欧美日韩不卡合集视频 | 亚洲国产精品视频一区 | 日韩免费一区二区 | 草樱av | 国产一区二区三区四区五区加勒比 | 免费国产一区二区 | 97av在线 | 99re在线视频观看 | 国产欧美精品在线观看 |