摘要:而和則用來合成雪碧圖,減少網絡請求。同時,在選項中進行配置,以實現讓識別圖片后綴名,并且進行指定的處理操作。代碼如下通過配置的選項,可以根據圖片大小來決定是否進行編碼。除此之外,雪碧圖要配合代碼進行定制化使用。
多圖預警!!! 此篇博文共 5 張圖(托管在 GitHub),國內用戶請移步>>>原文. 或者來我的小站哦
0. 課程源碼和資料本次課程的代碼目錄(如下圖所示):
>>> 本節課源碼
>>> 所有課程源碼
本節課會講述webpack4中的圖片常用的基礎操作:
圖片處理 和 Base64編碼
圖片壓縮
合成雪碧圖
1. 準備工作如項目代碼目錄展示的那樣,除了常見的app.js作為入口文件,我們將用到的 3 張圖片放在/src/assets/img/目錄下,并在樣式文件base.css中引用這些圖片。
剩下的內容交給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";
在處理圖片和進行base64編碼的時候,需要使用url-loader。
在壓縮圖片的時候,要使用img-loader插件,并且針對不同的圖片類型啟用不同的子插件。
而postcss-loader和postcss-sprites則用來合成雪碧圖,減少網絡請求。
因此,在 npm 安裝完相關插件后,package.json的內容如下所示:
{ "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" } }
同時,我們編寫如下index.html(假設已經打包好了項目文件,現在直接引入):
2. 圖片處理 和 Base64 編碼 2.1 webpack 配置Document
為了方便樣式提取,還是利用extract-text-webpack-plugin來提取樣式文件。
同時,在module.rules選項中進行配置,以實現讓 loader 識別圖片后綴名,并且進行指定的處理操作。
代碼如下:
// 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 選項,可以根據圖片大小來決定是否進行base64編碼。這次配置的是:小于 20kb 的圖片進行base64編碼。
2.2 打包結果之前提到過,在項目中引入了 3 張圖片,其中3.png是小于 20kb 的圖片。在命令行中運行webpack進行打包,size 小于 20kb 的圖片被編碼,只打包了 2 個 size 大于 20kb 的圖片文件:
打開瀏覽器的控制臺,我們的圖片已經被成功編碼:
3. 圖片壓縮 3.1 壓縮配置圖片壓縮需要使用img-loader,除此之外,針對不同的圖片類型,還要引用不同的插件。比如,我們項目中使用的是 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/" } } ] } // ...
替換為下方代碼即可,因為執行順序問題,我們將 url-loader 的 limit 設置成 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 打包結果
運行 webpack 打包,查看打包結果:
是的,如你所見,10.5kb 大小的迅雷圖標,被壓縮到了 1.8kb。圖片信息可以去 github 上查看,在文章開頭有提及 github 地址。
3.3 遺留問題并沒有解決jpg格式圖片壓縮。根據img-loader的官方文檔,安裝了imagemin-mozjpeg插件。
但是這個插件的最新版本是7.0.0,然而配置后,webpack 啟動會用報錯。
查看了 github 上的 issue,我將版本回退到6.0.0。可以安裝,也可以配置運行,正常打包。但是打包后的 jpg 圖片大小并沒有變化,也就是說,并沒有被壓縮!!!
希望有大佬可以指點一下小生,萬分感謝
4. 合成雪碧圖 4.1 webpack 配置在之前的基礎上,配置還是很簡單的,loader 的引入和環境變量都在注釋里面了:
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 雪碧圖的實際應用雪碧圖是為了減少網絡請求,所以被處理雪碧圖的圖片多為各式各樣的 logo 或者大小相等的小圖片。而對于大圖片,還是不推薦使用雪碧圖。
除此之外,雪碧圖要配合 css 代碼進行定制化使用。要通過 css 代碼在雪碧圖上精準定位需要的圖片(可以理解成從雪碧圖上裁取需要的圖片),更多可以百度或者 google。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/97686.html
摘要:全網最貼心系列教程和配套代碼歡迎關注個人技術博客。所以我花費了個多月整理了這份教程,一共分成節,每節都有講解,并且準備了配套代碼。奈何深感水平不夠,只有一腔熱情,所以直接開放了教程和源碼。 webpack-demos:全網最貼心 webpack 系列教程和配套代碼 歡迎關注個人技術博客:godbmw.com。每周 1 篇原創技術分享!開源教程(webpack、設計模式)、面試刷題(偏前...
摘要:傳送門系列教程一初識系列教程二創建項目,打包第一個文件系列教程三自動生成項目中的文件系列教程四處理項目中的資源文件一系列教程五處理項目中的資源文件二系列教程六使用分割代碼系列教程七使用系列教程八使用審查代碼系列教程九開發環境和生產環境 在前端開發日益復雜的今天,我們需要一個工具來幫助我們管理項目資源,打包、編譯、預處理、后處理等等。webpack的出現無疑是前端開發者的福音,我的博文只...
摘要:作者按因為教程所示圖片使用的是倉庫圖片,網速過慢的朋友請移步系列教程十三自動生成文件原文地址。編寫配置文件老規矩,是在這個選項中配置的。更多資料文檔文檔系列教程十三自動生成文件原文地址 作者按:因為教程所示圖片使用的是 github 倉庫圖片,網速過慢的朋友請移步《webpack4 系列教程(十三):自動生成 HTML 文件》原文地址。更歡迎來我的小站看更多原創內容:godbmw.co...
摘要:作者按因為教程所示圖片使用的是倉庫圖片,網速過慢的朋友請移步系列教程十三自動生成文件原文地址。編寫配置文件老規矩,是在這個選項中配置的。更多資料文檔文檔系列教程十三自動生成文件原文地址 作者按:因為教程所示圖片使用的是 github 倉庫圖片,網速過慢的朋友請移步《webpack4 系列教程(十三):自動生成 HTML 文件》原文地址。更歡迎來我的小站看更多原創內容:godbmw.co...
摘要:只需要在處理的配置上增加編譯的即可。了解更多處理的內容本節課源碼所有課程源碼教程所示圖片使用的是倉庫圖片,網速過慢的朋友請移步原文地址系列教程六處理。根據規則放在最后的首先被執行。 這節課講解webpack4中處理scss。只需要在處理css的配置上增加編譯scss的 LOADER 即可。了解更多處理css的內容 >>> >>> 本節課源碼 >>> 所有課程源碼 教程所示圖片使用的是...
閱讀 1702·2021-11-25 09:43
閱讀 2665·2019-08-30 15:53
閱讀 1808·2019-08-30 15:52
閱讀 2898·2019-08-29 13:56
閱讀 3317·2019-08-26 12:12
閱讀 565·2019-08-23 17:58
閱讀 2127·2019-08-23 16:59
閱讀 932·2019-08-23 16:21