什麼是webpack?Webpack的核心概念

2022-07-08 15:15:31 字數 4163 閱讀 5746

模組的引入解決了檔案之間依賴引用的問題,而打包則解決了檔案過多的問題。當專案規模增大,模組的數量數以千計,瀏覽器如果要載入如此多的檔案,頁面載入的速度勢必會受影響,而bundler可以把多個關聯的檔案打包到一起從而大量減少檔案的數量提高網頁載入效能。提供模組化的開發方式和編譯打包功能就是webpack的核心,其他很多功能都圍繞它們展開。

所謂的依賴關係圖是webpack根據每個模組之間的依賴關係遞迴生成的一張內部邏輯圖,有了這張依賴關係圖,webpack就能按圖索驥把所有需要模組打包成乙個bundle檔案了。

繪製依賴關係圖的起始檔案被稱為entry。預設的entry為 ./src/index.js,或者我們可以在配置檔案中配置。entry可以為乙個也可以為多個。

module.exports = 

或者

module.exports = 

};

我們也可以指定多個獨立的檔案為entry,但將它們打包到乙個chunk中,此種方法被稱為multi-main entry,我們需要傳入檔案路徑的陣列:

module.exports = 

但是改種方法的靈活性和擴充套件性有限,因此並不推薦使用。

如果有多個entry,並且每個entry生成對應的chunk,我們需要傳入object:

module.exports = 

};

這種寫法有最好的靈活性和擴充套件性,支援和其他的區域性配置(partial configuration)進行合併。比如將開發環境和生產的配置分離,並抽離出公共的配置,在不同的環境下執行時再將環境配置和公共配置進行合併。

有了入口,對應的就有出口。顧名思義,出口就是webpack打包完成的輸出,output定義了輸出的路徑和檔名稱。webpack的預設的輸出路徑為 ./dist/main.js。同樣,我們可以在配置檔案中配置output:

module.exports = 

};

當有多個entry的時候,乙個entry應該對應乙個output,此時輸出的檔名需要使用替換符(substitutions)宣告以確保檔名的唯一性,例如使用入口模組的名稱:

module.exports = ,

output:

}

webpack自身只支援載入js和json模組,而webpack的理念是讓所有的檔案都能被引用和載入並生成依賴關係圖,所以loader出場了。loader能讓webpack能夠去處理其他型別的檔案(比如、字型檔案、xml)。我們可以在配置檔案中這樣定義乙個loader:

webpack.config.js

module.exports = 

]}};

其中test定義了需要被轉化的檔案或者檔案型別,use定義了對該檔案進行轉化的loader的型別。該條配置相當於告訴webpack當遇到乙個txt檔案的引用時(使用require或者import進行引用),先用raw-loader轉換一下該檔案再把它打包進bundle。

還有其他各種型別的loader,比如載入css檔案的css-loader,載入和字型檔案的file-loader,載入html檔案的html-loader,將最新js語法轉換成es5的babel-loader等等。完整列表請參考 webpack loaders。

plugin和loader是兩個比較混淆和模糊的概念。loader是用來轉換和載入特定型別的檔案,所以loader的執行層面是單個的原始檔。而plugin可以實現的功能更強大,plugin可以監聽webpack處理過程中的關鍵事件,深度整合進webpack的編譯器,可以說plugin的執行層面是整個構建過程。plugin系統是構成webpack的主幹,webpack自身也基於plugin系統搭建,webpack有豐富的內建外掛程式和外部外掛程式,並且允許使用者自定義外掛程式。官方列出的外掛程式有 這些。

與loader不同,使用plugin我們必須先引用該外掛程式,例如:

const webpack = require('webpack'); // 用於引用webpack內建外掛程式

const htmlwebpackplugin = require('html-webpack-plugin'); // 外部外掛程式

module.exports = )

]};

了解webpack的基本概念之後,我們通過實踐來加深理解。接下來,我們使用webpack搭建乙個簡易的react腳手架。

首先建立react-webpack-starter專案並使用 npm init 初始化。

npm i react react-dom
npm i -d webpack webpack-cli webpack-dev-server html-webpack-plugin style-loader css-loader
安裝webpack-cli後可以在命令列中執行webpack命令;webpack-dev-server提供了簡易的web伺服器,並且在修改檔案之後自動執行webpack的編譯操作並自動重新整理瀏覽器,省去了重複的手動操作;html-webpack-plugin用於自動生成index.html檔案,並且在index.html中自動新增對bundle檔案的引用;style-loader和css-loader用於載入css檔案。

由於react中使用了class, import這樣的es6的語法,為了提高**的瀏覽器相容性,我們需要用babel轉換一下。

npm i -d @babel/core @babel/preset-env @babel/preset-react babel-loader

其中@babel/core是babel的核心模組,包含了babel的核心功能;@babel/preset-env支援轉換es6以及更新的js語法,並且可根據需要相容的瀏覽器型別選擇載入的plugin從而精簡生成的**;@babel/preset-react包含了babel轉換react所需要的plugin;babel-loader是webpack的babel載入器。

在專案根目錄下面新建webpack.config.js,內容如下:

webpack.config.js

const path = require('path');

const htmlwebpackplugin = require('html-webpack-plugin');

module.exports = ,

module: ,]},

plugins: [

new htmlwebpackplugin()

]}

其中htmlwebpackplugin使用自定義的模版來生成html 檔案,模版的內容如下:

./src/index.html

head>

>

body>

html>

在專案根目錄下面新建.babelrc檔案,配置我們安裝的兩個babel preset:

.babelrc

./src/index

import react from 'react';

import reactdom from 'react-dom';

import react,  from 'react';

render()

}

body

資源搜尋**大全

廣州vi設計公司

最後,在package.json檔案裡面加上兩個scripts,用來執行開發伺服器和打包:

package.json

"scripts": 

注意,我們啟用了webpack-dev-server的模組熱更新功能(hmr),進一步提高我們的開發效率。

什麼是LVM 什麼是LV 什麼是VG

lvm logicl volume manager 邏輯卷管理器,通過使用邏輯卷管理器對硬碟儲存裝置進行管理,可以實現硬碟空間的動態劃分和調整。一 基本概念 1 物理卷 pv physical volume 物理卷在邏輯卷管理中處於最底層,它可以是實際物理硬碟上的分割槽,也可以是整個物理硬碟。2 捲...

什麼是IaaS?什麼是PaaS?什麼是SaaS?

最近有朋友問我,什麼是iaas?什麼是paas?什麼是saas?他們又有什麼分別?其實,雲計算發展到今天,這些當年看似新穎的概念,已經快爛大街了,從業者早就對這些概念習以為常,但是圈外人卻依然是丈二和尚摸不著頭腦。今天我就來為圈外人士來解答一下,什麼是iaas,什麼是paas,什麼是saas。先來說...

什麼是Rup 什麼是xp 什麼是敏捷過程?

1 什麼是rup?rup rational unified process 是ibm rational software提出的軟體工程實施過程,在業界經歷了數千個軟體專案的實踐,是當前最為成功的軟體工程方 之一!rup是一種迭代的 以架構為中心 的 用例驅動的軟體開發方法 rup是一種具有明確定義和...