webpack4 系列教程(十): 圖片處理彙總

来源:https://www.cnblogs.com/geyouneihan/archive/2018/09/11/9630039.html
-Advertisement-
Play Games

多圖預警!!! 此篇博文共 5 張圖(托管在 ),國內用戶請移步 " 原文" . 或者來 "我的小站" 哦 0. 課程源碼和資料 本次課程的代碼目錄(如下圖所示): " 本節課源碼" " 所有課程源碼" 本節課會講述 中的圖片常用的基礎操作: 圖片處理 和 編碼 圖片壓縮 合成雪碧圖 1. 準備工作 ...


多圖預警!!! 此篇博文共 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-loaderpostcss-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(假設已經打包好了項目文件,現在直接引入):

<!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">
</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來提取樣式文件。

同時,在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。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 恢復內容開始 今天我們來說說關於JQuery中事件綁定中on綁定的一些小問題,直接上代碼了,大家拷下去就可以用 恢復內容結束 恢復內容結束 ...
  • 前言 本文講述怎麼實現動態載入組件,並藉此闡述適配器模式。 一、普通路由例子 以上是最常見的 。在簡單的單頁應用中,這樣寫是ok的。因為打包後的單一js文件 也不過200k左右, 之後,對載入性能並沒有太大的影響。 但是,當產品經歷多次迭代後,追加的頁面導致 的體積不斷變大。這時候,優化就變得很有必 ...
  • 《一統江湖的大前端》系列是自己的前端學習筆記,旨在介紹javascript在非網頁開發領域的應用案例和發現各類好玩的js庫,不定期更新。如果你對前端的理解還是寫寫頁面綁綁事件,那你真的是有點OUT了,前端能做的事情已經太多了, , , , , , 甚至 ,什麼火就搞什麼,活脫脫一個 蹭熱點小能手 。 ...
  • 本文主要歸納在 Vuejs 學習過程中對於 Vuejs 組件的各個相關要點。由於本人水平有限,如文中出現錯誤請多多包涵並指正,感謝。如果需要看更清晰的代碼高亮,請跳轉至我的個人站點的 深入理解 Vuejs 組件 查看本文。 組件使用細節 is屬性 我們通常使用 is 屬性解決模板標簽 bug 的問題 ...
  • 最近用博客園記錄一些基礎知識,發現打開博客頁面時老是卡頓,控制台報 x Failed to load resource: net::ERR_CONNECTION_TIMED_OUT 卡頓地址是:https://www.google.com/ads/ga-audiences?v=1&aip=1&t=s ...
  • 第一種方法(精確到秒): 第二種方法(精確到毫秒): 第三種方法(精確到毫秒): 獲取指定時間的時間戳: 時間戳轉化成時間: ...
  • 1.先創建個文件夾 比如叫 webApp 用編譯器打開 2.安裝全局的webpack 和webpack-cli 及 webpack-dev-server 命令如下 npm install webpack webpack-cli webpack-dev-server -g 推薦安裝個淘寶鏡像 cnpm ...
  • 作用域鏈【主要作用:變數名解析】 如果你理解了作用域鏈,那麼閉包對於你而言,理解起來就相當地簡單了。 作用域鏈,可以看成是一個有序檢索的對象列表。 【有序檢索:即就近原則“由近及遠”,全局對象始終是最後一個】 舉例來說,也就是: 如果JS的最頂級代碼(不包含在函數內的代碼),它的作用域鏈——一個全局 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...