淺談 Webpack 如何處理圖片(開(kāi)發(fā)、打包、優(yōu)化)
從 webpack book 的 Loading Assets 一章中延申出來(lái)。
改善前端項(xiàng)目體驗(yàn)中,很重要的點(diǎn)就是靜態(tài)資源的優(yōu)化。它是由于瀏覽器客戶端在同一時(shí)間針對(duì)同一 域名 的請(qǐng)求有一定資源限制。如果資源過(guò)多、過(guò)大就會(huì)使得頁(yè)面卡頓。
靜態(tài)資源中,又以圖片最為典型。那么我們?cè)陂_(kāi)發(fā)中該如何處理圖片呢?
webpack 是前端較為常用的手腳架工具,本文以它為例。
主要分為 開(kāi)發(fā) 、 打包 、 優(yōu)化 三個(gè)方面來(lái)介紹
示例地址: webpack demo
開(kāi)發(fā)
webpack 可以用使用url-loader 將靜態(tài)圖片轉(zhuǎn)化為 base64 編碼的字符串,并內(nèi)聯(lián)在對(duì)應(yīng)的腳本中。大幅度地較少了頁(yè)面的請(qǐng)求數(shù),所以在開(kāi)發(fā)階段可以無(wú)限制地使用。具體方法
// npm install url-loader --save-dev
rules: [{
test: /\.(png|jpg)$/,
use: {
loader: 'url-loader',
},
}]
以 demo-example 為例,Gakki.jpg 被轉(zhuǎn)化為了 base 64 編碼的圖片。在開(kāi)發(fā)階段,沒(méi)什么問(wèn)題,但是如果在實(shí)際環(huán)境中,會(huì)發(fā)現(xiàn)一個(gè)很大的問(wèn)題,將圖片越大轉(zhuǎn)化為base 64 編碼的字符串就越長(zhǎng),將會(huì)導(dǎo)致整個(gè) Js 腳本的大小飆升。
打包
為了減小腳本的大小,我們需要告訴 webpack 什么情況下采用 url-loader 去內(nèi)聯(lián)圖片,什么情況下采用其他的 loader。所以首先需要對(duì) url-loader 進(jìn)行配置
rules: [{
test: /\.(png|jpg)$/,
use: {
loader: 'url-loader',
options: {
limit: 15000,
name: '[name].[ext]',
},
},
}]
在 options 中設(shè)定一個(gè)閾值屬性 limit: 15000 ,表明當(dāng)圖片小于該閾值 15kb 時(shí),采用內(nèi)聯(lián)形式加載。那么如果超過(guò)閾值,我們?cè)撛趺崔k?
可以利用 fallback 屬性指定采用file-loader 來(lái)處理,具體見(jiàn)配置
options: {
limit: 15000,
fallback: 'file-loader',
name: 'images/[name].[hash].[ext]',
},
默認(rèn)情況下,file-loader 會(huì)返回 options 依據(jù) 文件內(nèi)容返回一個(gè) MD5 Hash 來(lái)構(gòu)建文件名。
如果同時(shí)需要 file-loader 與 url-loader 的情況,需要設(shè)置 limit來(lái)做區(qū)分。
優(yōu)化
為了進(jìn)一步地優(yōu)化體驗(yàn),我們可以采用以下策略:
- 控制圖片質(zhì)量,壓縮圖片大?。?/li>
- 配置 <img /> 標(biāo)簽的 srcset 來(lái)適應(yīng)不同的屏幕;
- 合成雪碧圖,減少圖片資源請(qǐng)求數(shù);
- 使用占位圖。
控制圖片質(zhì)量,壓縮圖片大小
為了和 url-loader 配合,引入image-webpack-loader ,同時(shí)配置圖片的 loader
{
test: /\.(png|jpg)$/,
use: [
{
loader: 'url-loader',
// 同上
options,
},
{
loader: 'image-webpack-loader',
// 配置不同圖片的質(zhì)量
options: {
mozjpeg: {
progressive: true,
quality: 65,
},
optipng: {
enabled: true,
},
pngquant: {
quality: '65-90',
speed: 4,
},
gifsicle: {
interlaced: false,
},
webp: {
quality: 75,
},
},
},
],
}
然后運(yùn)行 npm run build ,很明顯的發(fā)現(xiàn),圖片的大小有了明顯的變化。這種對(duì)于圖片的壓縮對(duì)于生產(chǎn)環(huán)境特別有價(jià)值,因?yàn)樗鼫p少了下載圖像資源所需的帶寬量,從而加快了站點(diǎn)或應(yīng)用程序的速度。
也可以采用 imagemin-webpack-plugin 插件。
配置 <img /> 標(biāo)簽的 srcset 來(lái)適應(yīng)不同的屏幕
resize-image-loader 和responsive-loader 可以生成 srcset 的圖片合集,可以在現(xiàn)代游覽器上獲得更好地體驗(yàn),同時(shí)可以更好地控制瀏覽器加載哪些圖像以及何時(shí)獲得更高的性能。
合成雪碧圖,減少圖片資源請(qǐng)求數(shù)
Spriting技術(shù)允許將多個(gè)較小的圖像組合成單個(gè)圖像。它對(duì)于Web開(kāi)發(fā)很有價(jià)值,同時(shí)也避免了請(qǐng)求開(kāi)銷(xiāo)。
webpack-spritesmith 能夠生成雪碧圖和 Sass / Less / Stylus mixins。必須設(shè)置 SpritesmithPlugin,將其指向目標(biāo)圖像,并設(shè)置生成的mixin的名稱。
使用占位圖
與以上對(duì)比,這個(gè) loader 使用起來(lái)相對(duì)復(fù)雜,它加載圖像并將其轉(zhuǎn)化為 image / svg + xml URL 編碼數(shù)據(jù)。通常它可以與file-loader和url-loader一起使用,以便在加載實(shí)際圖像時(shí)顯示占位符。配置為
{
test: /\.(gif|png|jpe?g)$/i,
use: [
{
loader: 'image-trace-loader'
},
{
loader: 'url-loader',
options: {
limit: 8192
}
}
]
}
這樣,你在 loader 圖片時(shí),就會(huì)獲得
// src 為圖片,trace 為loader生成的占位圖
import { src, trace } from './assets/images/gakki-363kb.jpg'
// 定義圖片組件為
export const img = ({ src, trace }) => {
const img = new Image()
img.src = trace
img.onload = function () {
img.src = src
}
return img
}
// 掛載在 document.body 上
document.body.appendChild(img({ src, trace }))
參考:
- webpack book
- webpack doc
- 若干 npm readme
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Webpack常見(jiàn)靜態(tài)資源處理-模塊加載器(Loaders)+ExtractTextPlugin插件
- 詳解vue-cli與webpack結(jié)合如何處理靜態(tài)資源
- vue-cli與webpack處理靜態(tài)資源的方法及webpack打包的坑
- vue填坑之webpack run build 靜態(tài)資源找不到的解決方法
- 淺談webpack4 圖片處理匯總
- webpack 靜態(tài)資源集中輸出的方法示例
- 在Webpack中用url-loader處理圖片和字體的問(wèn)題
- webpack實(shí)現(xiàn)靜態(tài)資源緩存的方法
- vue項(xiàng)目之webpack打包靜態(tài)資源路徑不準(zhǔn)確的問(wèn)題
- webpack5處理圖片、圖標(biāo)字體、多媒體等靜態(tài)資源文件
相關(guān)文章
解析利用javascript如何判斷一個(gè)數(shù)為素?cái)?shù)
本文主要分享了利用javascript如何判斷一個(gè)數(shù)為素?cái)?shù)的具體實(shí)例代碼,有需要的朋友可以作為參考看下2016-12-12
JavaScript面向?qū)ο蟪绦蛟O(shè)計(jì)創(chuàng)建對(duì)象的方法分析
這篇文章主要介紹了JavaScript面向?qū)ο蟪绦蛟O(shè)計(jì)創(chuàng)建對(duì)象的方法,結(jié)合實(shí)例形式分析了javascript使用object構(gòu)造函數(shù)和對(duì)象字面量來(lái)創(chuàng)建對(duì)象的相關(guān)操作技巧,需要的朋友可以參考下2018-08-08
前端如何實(shí)現(xiàn)對(duì)本地文件的IO操作詳解
這篇文章主要給大家介紹了關(guān)于前端如何實(shí)現(xiàn)對(duì)本地文件IO操作的相關(guān)資料,需要的朋友可以參考下2024-07-07
BootstrapTable請(qǐng)求數(shù)據(jù)時(shí)設(shè)置超時(shí)(timeout)的方法
使用bootstrapTable獲取數(shù)據(jù)時(shí),有時(shí)由于網(wǎng)絡(luò)或者服務(wù)器的原因,無(wú)法及時(shí)獲取到數(shù)據(jù),頁(yè)面顯示一直處于等待狀態(tài)。為了改善效果,考慮設(shè)置超時(shí),請(qǐng)求發(fā)送后超時(shí)即顯示無(wú)數(shù)據(jù),過(guò)段時(shí)間重新發(fā)起請(qǐng)求2017-01-01
原生JavaScript實(shí)現(xiàn)輪播圖效果
這篇文章主要為大家詳細(xì)介紹了原生JavaScript實(shí)現(xiàn)輪播圖效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
JS實(shí)現(xiàn)簡(jiǎn)單的選擇題測(cè)評(píng)系統(tǒng)代碼思路詳解(demo)
本文給大家分享js實(shí)現(xiàn)簡(jiǎn)單的選擇題測(cè)評(píng)系統(tǒng)實(shí)例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-09-09
javascript創(chuàng)建cookie、讀取cookie
這篇文章主要介紹了javascript創(chuàng)建cookie、讀取cookie的操作方法,內(nèi)容簡(jiǎn)單易學(xué),感興趣的小伙伴們可以參考一下2016-03-03
Flow之一個(gè)新的Javascript靜態(tài)類(lèi)型檢查器
今天我們興奮的發(fā)布了 Flow 的嘗鮮版,一個(gè)新的Javascript靜態(tài)類(lèi)型檢查器。Flow為Javascript添加了靜態(tài)類(lèi)型檢查,以提高開(kāi)發(fā)效率和代碼質(zhì)量,本文給大家分享Flow之一個(gè)新的Javascript靜態(tài)類(lèi)型檢查器,感興趣的朋友一起學(xué)習(xí)吧2015-12-12
js判斷出兩個(gè)字符串最大子串的函數(shù)實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇js判斷出兩個(gè)字符串最大子串的函數(shù)實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11

