淺談webpack4 圖片處理匯總
本次課程的代碼目錄(如下圖所示):

本節(jié)課會(huì)講述 webpack4 中的圖片常用的基礎(chǔ)操作:
- 圖片處理 和 Base64編碼
- 圖片壓縮
- 合成雪碧圖
1. 準(zhǔn)備工作
如項(xiàng)目代碼目錄展示的那樣,除了常見的 app.js 作為入口文件,我們將用到的 3 張圖片放在 /src/assets/img/ 目錄下,并在樣式文件 base.css 中引用這些圖片。
剩下的內(nèi)容交給 webpack 打包處理即可。樣式文件和入口 js 文件的代碼分別如下所示:
/* base.css */
*, body {
margin: 0;
padding: 0;
}
.box {
height: 400px;
width: 400px;
border: 5px solid #000;
color: #000;
}
.box div {
width: 100px;
height: 100px;
float: left;
}
.box .ani1 {
background: url("./../assets/imgs/1.jpg") no-repeat;
}
.box .ani2 {
background: url("./../assets/imgs/2.jpg") no-repeat;
}
.box .ani3 {
background: url("./../assets/imgs/3.png") no-repeat;
}
// app.js import "style-loader/lib/addStyles"; import "css-loader/lib/css-base"; import "./css/base.css";
在處理圖片和進(jìn)行 base64 編碼的時(shí)候,需要使用 url-loader 。
在壓縮圖片的時(shí)候,要使用 img-loader 插件,并且針對不同的圖片類型啟用不同的子插件。
而 postcss-loader 和 postcss-sprites 則用來合成雪碧圖,減少網(wǎng)絡(luò)請求。
因此,在 npm 安裝完相關(guān)插件后, package.json 的內(nèi)容如下所示:
{
"devDependencies": {
"css-loader": "^1.0.0",
"extract-text-webpack-plugin": "^4.0.0-beta.0",
"file-loader": "^1.1.11",
"imagemin": "^5.3.1",
"imagemin-pngquant": "^5.1.0",
"img-loader": "^3.0.0",
"postcss-loader": "^2.1.6",
"postcss-sprites": "^4.2.1",
"style-loader": "^0.21.0",
"url-loader": "^1.0.1",
"webpack": "^4.16.1"
}
}
同時(shí),我們編寫如下 index.html (假設(shè)已經(jīng)打包好了項(xiàng)目文件,現(xiàn)在直接引入):
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <link rel="stylesheet" href="./dist/app.min.css" rel="external nofollow" > </head> <body> <div id="app"> <div class="box"> <div class="ani1"></div> <div class="ani2"></div> <div class="ani3"></div> </div> </div> <script src="./dist/app.bundle.js"></script> </body> </html>
2. 圖片處理 和 Base64 編碼
2.1 webpack 配置
為了方便樣式提取,還是利用 extract-text-webpack-plugin 來提取樣式文件。
同時(shí),在 module.rules 選項(xiàng)中進(jìn)行配置,以實(shí)現(xiàn)讓 loader 識別圖片后綴名,并且進(jìn)行指定的處理操作。
代碼如下:
// webpack.config.js
const path = require("path");
const ExtractTextPlugin = require("extract-text-webpack-plugin");
let extractTextPlugin = new ExtractTextPlugin({
filename: "[name].min.css",
allChunks: false
});
module.exports = {
entry: {
app: "./src/app.js"
},
output: {
publicPath: __dirname + "/dist/",
path: path.resolve(__dirname, "dist"),
filename: "[name].bundle.js",
chunkFilename: "[name].chunk.js"
},
module: {
rules: [
{
test: /\.css$/,
use: ExtractTextPlugin.extract({
fallback: {
loader: "style-loader"
},
use: [
{
loader: "css-loader"
}
]
})
},
{
test: /\.(png|jpg|jpeg|gif)$/,
use: [
{
loader: "url-loader",
options: {
name: "[name]-[hash:5].min.[ext]",
limit: 20000, // size <= 20KB
publicPath: "static/",
outputPath: "static/"
}
}
]
}
]
},
plugins: [extractTextPlugin]
};
通過配置 url-loader 的 limit 選項(xiàng),可以根據(jù)圖片大小來決定是否進(jìn)行 base64 編碼。這次配置的是:小于 20kb 的圖片進(jìn)行 base64 編碼。
2.2 打包結(jié)果
之前提到過,在項(xiàng)目中引入了 3 張圖片,其中 3.png 是小于 20kb 的圖片。在命令行中運(yùn)行 webpack 進(jìn)行打包,size 小于 20kb 的圖片被編碼,只打包了 2 個(gè) size 大于 20kb 的圖片文件:

打開瀏覽器的控制臺,我們的圖片已經(jīng)被成功編碼:

3. 圖片壓縮
3.1 壓縮配置
圖片壓縮需要使用 img-loader ,除此之外,針對不同的圖片類型,還要引用不同的插件。比如,我們項(xiàng)目中使用的是 png 圖片,因此,需要引入 imagemin-pngquant ,并且指定壓縮率。
我們只需要在上面的配置文件中將下方代碼:
// ...
{
test: /\.(png|jpg|jpeg|gif)$/,
use: [
{
loader: "url-loader",
options: {
name: "[name]-[hash:5].min.[ext]",
limit: 20000, // size <= 20KB
publicPath: "static/",
outputPath: "static/"
}
}
]
}
// ...
替換為下方代碼即可,因?yàn)閳?zhí)行順序問題,我們將 url-loader 的 limit 設(shè)置成 1kb,來防止壓縮后的 png 圖片被 base64 編碼:
// ...
{
test: /\.(png|jpg|jpeg|gif)$/,
use: [
{
loader: "url-loader",
options: {
name: "[name]-[hash:5].min.[ext]",
limit: 1000, // size <= 1KB
publicPath: "static/",
outputPath: "static/"
}
},
// img-loader for zip img
{
loader: "img-loader",
options: {
plugins: [
require("imagemin-pngquant")({
quality: "80" // the quality of zip
})
]
}
}
]
}
// ...
3.2 打包結(jié)果
運(yùn)行 webpack 打包,查看打包結(jié)果:

是的,如你所見,10.5kb 大小的迅雷圖標(biāo),被壓縮到了 1.8kb。圖片信息可以去 github 上查看,在文章開頭有提及 github 地址。
3.3 遺留問題
并沒有解決 jpg 格式圖片壓縮。根據(jù) img-loader 的官方文檔 ,安裝了 imagemin-mozjpeg 插件。
但是這個(gè)插件的最新版本是 7.0.0 ,然而配置后,webpack 啟動(dòng)會(huì)用報(bào)錯(cuò)。
查看了 github 上的 issue,我將版本回退到 6.0.0 ??梢园惭b,也可以配置運(yùn)行,正常打包。但是打包后的 jpg 圖片大小并沒有變化,也就是說,并沒有被壓縮?。?!
希望有大佬可以指點(diǎn)一下小生,萬分感謝
4. 合成雪碧圖
4.1 webpack 配置
在之前的基礎(chǔ)上,配置還是很簡單的,loader 的引入和環(huán)境變量都在注釋里面了:
const path = require("path");
const ExtractTextPlugin = require("extract-text-webpack-plugin");
let extractTextPlugin = new ExtractTextPlugin({
filename: "[name].min.css",
allChunks: false
});
/*********** sprites config ***************/
let spritesConfig = {
spritePath: "./dist/static"
};
/******************************************/
module.exports = {
entry: {
app: "./src/app.js"
},
output: {
publicPath: __dirname + "/dist/",
path: path.resolve(__dirname, "dist"),
filename: "[name].bundle.js",
chunkFilename: "[name].chunk.js"
},
module: {
rules: [
{
test: /\.css$/,
use: ExtractTextPlugin.extract({
fallback: {
loader: "style-loader"
},
use: [
{
loader: "css-loader"
},
/*********** loader for sprites ***************/
{
loader: "postcss-loader",
options: {
ident: "postcss",
plugins: [require("postcss-sprites")(spritesConfig)]
}
}
/*********************************************/
]
})
},
{
test: /\.(png|jpg|jpeg|gif)$/,
use: [
{
loader: "url-loader",
options: {
name: "[name]-[hash:5].min.[ext]",
limit: 10000, // size <= 20KB
publicPath: "static/",
outputPath: "static/"
}
},
{
loader: "img-loader",
options: {
plugins: [
require("imagemin-pngquant")({
quality: "80"
})
]
}
}
]
}
]
},
plugins: [extractTextPlugin]
};
4.2 效果展示
按照我們的配置,打包好的雪碧圖被放入了 /dist/static/ 目錄下,如下圖所示:

4.3 雪碧圖的實(shí)際應(yīng)用
雪碧圖是為了減少網(wǎng)絡(luò)請求,所以被處理雪碧圖的圖片多為各式各樣的 logo 或者大小相等的小圖片。而對于大圖片,還是不推薦使用雪碧圖。
除此之外,雪碧圖要配合 css 代碼進(jìn)行定制化使用。要通過 css 代碼在雪碧圖上精準(zhǔn)定位需要的圖片(可以理解成從雪碧圖上裁取需要的圖片),更多可以百度或者 google。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Webpack常見靜態(tài)資源處理-模塊加載器(Loaders)+ExtractTextPlugin插件
- 詳解vue-cli與webpack結(jié)合如何處理靜態(tài)資源
- vue-cli與webpack處理靜態(tài)資源的方法及webpack打包的坑
- vue填坑之webpack run build 靜態(tài)資源找不到的解決方法
- webpack 靜態(tài)資源集中輸出的方法示例
- 淺談 Webpack 如何處理圖片(開發(fā)、打包、優(yōu)化)
- 在Webpack中用url-loader處理圖片和字體的問題
- webpack實(shí)現(xiàn)靜態(tài)資源緩存的方法
- vue項(xiàng)目之webpack打包靜態(tài)資源路徑不準(zhǔn)確的問題
- webpack5處理圖片、圖標(biāo)字體、多媒體等靜態(tài)資源文件
相關(guān)文章
webpack4 optimization使用總結(jié)
這篇文章主要介紹了webpack4 optimization使用總結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
JavaScript中判斷為整數(shù)的多種方式及保留兩位小數(shù)的方法
這篇文章主要介紹了JavaScript中判斷為整數(shù)的多種方式,以及保留兩位小數(shù)的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09

