天天看點

帶你上手全新版本的Webpack 5

​​摘要:webpack5快速入門,船新版本,建議收藏

本文分享自華為雲社群​​《webpack5快速入門,船新版本,建議收藏》​​,作者:北極光之夜。。

打包: 将不同類型資源按子產品處理進行打包。

靜态: 打包後最終産出靜态資源。

子產品: webpack 支援不同規範的子產品化開發

終端輸入: npm install webpack -g

帶你上手全新版本的Webpack 5

utiles.js:

index.js:

終端輸入:webpack

webpack會自動尋找src目錄,然後尋找index.js入口檔案,然後進行打包,最終生成一個dist目錄為打包後内容。

帶你上手全新版本的Webpack 5

index.html引入:

結果:

帶你上手全新版本的Webpack 5

可以在配置檔案裡定義配置,表示你想如何打包,能設定很多條件。webpack會根據你配置檔案的配置規則來進行打包。在src同級目錄下建立一個webpack.config.js檔案,裡面寫配置資訊。

如最基本的入口和出口:

終端輸入webpack後成功打包了build.js檔案,跟上面打包的main.js内容一樣:

帶你上手全新版本的Webpack 5

為什麼使用loader:

webpack 隻能了解 javascript 和 json 檔案,這是 webpack 開箱可用的自帶能力。loader 能讓 webpack 能夠去處理其他類型的檔案(比如css類型檔案,圖檔類型,txt類型等等),并将它們轉換為有效子產品,以供使用。

比如,我想webpack能打包css,終端輸入以下指令先安裝css-loader:

1.可以在導入css檔案的時候指定loader,這樣就不報錯了,在導入css檔案路徑前添加css-loader!:

2.當然,也可以在配置檔案設定:

test 屬性,定義一個正規表達式,比對需要處理的檔案類型。識别出哪些檔案會被轉換。

use 屬性,定義出在進行轉換時,應該使用哪個 loader。

配置檔案裡配置後,别忘了在index入口檔案導入css檔案。

上面css-loader隻是能識别css檔案,而引入了style-loader後css樣式才能在頁面展示。

安裝:

配置檔案規則:

因為 webpack 是 從 後 往 前 執 行 ,是以style-loader寫在css-loader前面。

比如,我想 webpack 能打包scss檔案類型。不會sass的可以看這篇文章文章sass全解析。

安裝sass:

轉換scss為css(注意在scss同級路徑下轉換,也是終端輸入):

在入口檔案index.js導入:

安裝sass-loader:

配置規則:

打包:

webpack 支援所有符合 es5 标準 的浏覽器(不支援 ie8 及以下版本)。如果你想要支援舊版本浏覽器,那就需要借助到一些工具了。在安裝webpack時預設安裝了browserslist,它可以知道各個浏覽器的占有率資料并配置。

這個網站也可以查到目前各個浏覽器的占有率資料。

後面再詳細講。

postcss是javascript轉換樣式的工具,這個工具能處理css相容問題。就是這個工具能給我們寫的css代碼添加一些相容的字首。

首先,你可以通過 這個網站 了解css是添加什麼字首怎麼能相容主流浏覽器的。

帶你上手全新版本的Webpack 5

配置檔案:

在css檔案類型裡添加postcss-loader,并配置參數 :

在index.js同級下建立一個名為.browserslistrc 檔案,裡面寫相容的條件,如:

然後終端輸入webpack打包後css代碼會自動添加相容代碼。

上面隻是添加字首,如果還需要更強的相容需要 postcss-preset-env,安裝:

添加配置(來次全的):

可以隻保留postcss-preset-env,簡寫:

不過一般是在index.js同級下建立一個postcss.config.js檔案專門寫配置:

postcss.config.js檔案内容:

然後在webpack.config.js配置檔案裡直接導入postcss-loader就行:

importloaders:用于配置「css-loader 作用于@import 的資源之前」有多少個 loader。直白來說就是importloaders設定幾,那麼通過@import 導入的css檔案也會向前執行前面不再執行的loader。

如下:

本來一個css檔案會執行上面3個loader,如果那個css檔案存在通過import文法導入的css檔案,那麼那個導入的css檔案是不會執行最後的postcss-loader。但是我想執行,是以配置importloaders,表示import導入的css檔案也會向後執行多少個loader。(注意webpack是從後往前執行的)

file-loader作用:

1.當我們把圖檔當一個子產品導入的時候可以識别它。

2.可以把二進制資源拷貝一份到指定目錄,沒指定就是預設dist目錄。

可以在src目錄下建立一個img檔案夾存放圖檔。

配置檔案(在rules數組裡繼續新增一個規則):

1. 第一種用法:

當把圖檔當成一個子產品導入時在末尾添加.default,比如:

2. 第二種用法:

如果不想子產品導入時在末尾添加.default,那麼在配置檔案裡添加參數esmodule:

3. 第三種用法:

如果你也不想上面這樣寫,還可以通過es6子產品導入方式:

先導入圖檔子產品:

然後再:

最後終端webpack打包就行,目前會将圖檔預設打包到dist目錄。

跟上面src差別就是要修改的是css類型檔案規則,加一個esmodule參數:

然後在css裡通過url正常引用即可,webpack打包後會将圖檔預設打包到dist目錄:

預設位置,如(圖檔名稱自動根據内容算法得出):

帶你上手全新版本的Webpack 5

我們可以設定打包後的圖檔存放到的地方與名稱。

修改配置檔案的圖檔規則,添加一個name配置(名稱)屬性和outputpath屬性(位置):

其中name屬性裡表示:【ext】擴充名,【name】檔案名,【hash】檔案内容。

outputpath屬性:直接指定img目錄,預設會放在dist目錄下。

帶你上手全新版本的Webpack 5

兩個屬性可以合并直接簡寫為:

url-loader可以将圖檔轉為base64字元串,能更快的加載圖檔(适用圖檔檔案較少情況,過大的話還是用file-loader)。file-loader相對于拷貝,速度較慢。

配置其實跟file-loader差不多的,把loader那一改就行:

與file-loader不同的是,打包後圖檔會以base64字元串形式加載到代碼裡,是以目錄裡不再可見:

帶你上手全新版本的Webpack 5

關鍵的是,其實 url-loader 包含 file-loader ,可以設定一個 limit 屬性,當圖檔大小超過limit,url-loader會自認不行,會主動去調用file-loader去執行。

如下:設定一個筏值20kb,小于它會執行url-loader,大于它會執行file-loader

webpack5之後可以直接使用asset處理圖檔,不必再配置file-loader或url-loader。能更好的簡化使用。且它是webpack5内置子產品,不必額外進行安裝其它東西。

配置檔案修改圖檔規則:

1. 預設情況,拷貝圖檔,預設放到dist目錄下(跟file-loader沒配置名稱和路徑時結果一樣):

帶你上手全新版本的Webpack 5

2. 指定圖檔打包後位置,放到dist下的img檔案夾裡,圖檔規則跟上面一樣,要修改的是output打包出口路徑那裡,新增assetmodulefilename:

帶你上手全新版本的Webpack 5

3. 上面相當于全局配置,不論什麼圖檔都會執行,是以不大好,是以還是在規則裡面加圖檔輸出位置與名稱好點,新增generator,裡面的filename寫位置與名稱:

帶你上手全新版本的Webpack 5

4. 如果想将圖檔轉為base64字元串,而不是拷貝的話,修改規則如下:

5. 當然,也能像url-loader設定limit那樣設定一個閥值,超過後還是用拷貝,修改規則如下,maxsize設定大小,這裡閥值為30kb大小:

新增如下規則:

衆所周知,插件能幫助我們更友善的做更多的事情。

每次我們重新webpack打包的時候還要把上次打包的dist目錄删除掉,麻煩,是以這裡下載下傳一個dist目錄自動清空插件。以後打包會預設把上次打包内容清空後打包。

安裝clean-webpack-plugin插件:

設定配置檔案的配置項plugins:

每個插件都是一個類,直接new就行,可以檢視對應插件的官網,了解傳的參數對應什麼功能。

能幫我們打包後在打包目錄裡生成一個html檔案模闆,并引用入口檔案。

安裝html-webpack-plugin插件:

webpack打包後:

帶你上手全新版本的Webpack 5

html預設内容:

對于html很多地方可以設定的,比如title的内容啥的,在配置檔案new的時候傳遞對應參數就行(具體參考該插件官網):

打包後生成的html檔案内容:

當然,可以自己提供一個html模闆,以我提供的模闆為基礎生成新的html模闆:

1. 在src同級下建立一個public目錄,在裡面建立一個index.html檔案作為模闆:

帶你上手全新版本的Webpack 5

2. 比如index.html内容如下:

<%= htmlwebpackplugin.options.title %>表示使用配置裡的title。

3. 新增template參數,值為模闆路徑:

4. 打包結果:

帶你上手全新版本的Webpack 5

能處理js相容問題,比如相容es6文法。

在index.js同級下建立一個babel.config.js檔案專門寫配置:

babel.config.js檔案内容:

然後在webpack.config.js配置檔案裡新增規則:

跟在前面說到的postcss-loader一樣,同樣在.browserslistrc 檔案裡面寫相容的條件,如:

0.1%

last 2 version

not dead

最後webpack打包就行了。

babel-loader處理的js相容還不夠多,隻能處理簡單的,若存在promise這些新文法也不大行。是以需要polyfill。

修改babel.config.js:

可以實作你修改源碼後,打包後的代碼也自動更新,不用每次都手動打包去更新。

1. 不使用webpack-dev-serve之前,可以在配置檔案添加watch屬性為true也能實作自動更新,但是性能不太好,不能局部更新,是一有更新就全都更新:

如:

2. webpack-dev-serve性能較好,能實作局部更新,節省性能。

在終端先安裝:

以後打包指令改為:

作用:一個子產品發生變化,隻會重新打包這一個子產品(而不是打包所有子產品),極大的提升建構速度。

先配置:

然後在入口檔案處通過判斷給需要熱更新的子產品熱更新:

output有一個publicpath屬性,為項目中引用css,js,img 等資源時候的一個基礎路徑。其輸出解析檔案的目錄,指定資源檔案引用的目錄,打包後浏覽器通路服務時的 url 路徑中通用的一部分。

通過webpack設定代了解決浏覽器跨域問題。在 devserver 下添加一個 proxy 屬性:

此時,如果我們原本想請求的服務端位址為 https://… /user 就可以替換成 /api/user , 然後把/api重寫為空,那麼實際上就是相當于寫了 https://… /user, 如:

提供mode 配置選項,告知 webpack 使用相應模式的一些内置優化。如果沒有設定,webpack 會給 mode 的預設值設定為 production。

帶你上手全新版本的Webpack 5

1.安裝:

2.添加規則:

3.導入插件并使用:

未完結,持續更新中……

​​點選關注,第一時間了解華為雲新鮮技術~​​

繼續閱讀