浅谈webpack4 图片处理汇总


Posted in Javascript onSeptember 12, 2018

本次课程的代码目录(如下图所示):

浅谈webpack4 图片处理汇总

>>> 本节课源码

>>> 所有课程源码

本节课会讲述 webpack4 中的图片常用的基础操作:

  1. 图片处理 和 Base64编码
  2. 图片压缩
  3. 合成雪碧图

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" 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 来提取样式文件。

同时,在 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 的图片文件:

浅谈webpack4 图片处理汇总

打开浏览器的控制台,我们的图片已经被成功编码:

浅谈webpack4 图片处理汇总

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 打包,查看打包结果:

浅谈webpack4 图片处理汇总

是的,如你所见,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/ 目录下,如下图所示:

浅谈webpack4 图片处理汇总

4.3 雪碧图的实际应用

雪碧图是为了减少网络请求,所以被处理雪碧图的图片多为各式各样的 logo 或者大小相等的小图片。而对于大图片,还是不推荐使用雪碧图。

除此之外,雪碧图要配合 css 代码进行定制化使用。要通过 css 代码在雪碧图上精准定位需要的图片(可以理解成从雪碧图上裁取需要的图片),更多可以百度或者 google。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
基于jquery的商品展示放大镜
Aug 07 Javascript
Javascript表达式中连续的 &amp;&amp; 和 || 之赋值区别
Oct 17 Javascript
改善用户体验的五款jQuery插件分享
May 22 Javascript
jquery星级插件、支持页面中多次使用
Mar 25 Javascript
js和as的稳定传值问题解决
Jul 14 Javascript
js substring从右边获取指定长度字符串(示例代码)
Dec 23 Javascript
使用Javascript写的2048小游戏
Nov 25 Javascript
AngularJS基于factory创建自定义服务的方法详解
May 25 Javascript
基于JS递归函数细化认识及实用实例(推荐)
Aug 07 Javascript
vue如何进行动画的封装
Sep 26 Javascript
vue axios 简单封装以及思考
Oct 09 Javascript
使用vuex较为优雅的实现一个购物车功能的示例代码
Dec 09 Javascript
vue二级菜单导航点击选中事件的方法
Sep 12 #Javascript
vue this.reload 方法 配置
Sep 12 #Javascript
jquery 动态遍历select 赋值的实例
Sep 12 #jQuery
JS中判断字符串存在和非空的方法
Sep 12 #Javascript
React router动态加载组件之适配器模式的应用详解
Sep 12 #Javascript
微信小程序实现tab左右切换效果
Nov 15 #Javascript
微信小程序首页的分类功能和搜索功能的实现思路及代码详解
Sep 11 #Javascript
You might like
Uchome1.2 1.5 代码学习 common.php
2009/04/24 PHP
php数据库密码的找回的步骤
2011/01/12 PHP
php数组函数序列之sort() 对数组的元素值进行升序排序
2011/11/02 PHP
PHP中CURL方法curl_setopt()函数的参数分享
2013/01/19 PHP
解析Linux下Varnish缓存的配置优化
2013/06/20 PHP
php mysql操作mysql_connect连接数据库实例详解
2016/12/26 PHP
详解将数据从Laravel传送到vue的四种方式
2019/10/16 PHP
ie 调试javascript的工具
2009/04/29 Javascript
圣诞节Merry Christmas给博客添加浪漫的下雪效果基于jquery实现
2012/12/27 Javascript
Javascript中克隆一个数组的实现代码
2013/12/06 Javascript
JavaScript中的return语句简单介绍
2015/12/07 Javascript
Node.js如何使用Diffie-Hellman密钥交换算法详解
2017/09/05 Javascript
vue.js element-ui validate中代码不执行问题解决方法
2017/12/18 Javascript
vue嵌套路由与404重定向实现方法分析
2018/05/04 Javascript
详解基于Node.js的HTTP/2 Server实践
2018/05/31 Javascript
vue el-table实现自定义表头
2019/12/11 Javascript
[11:12]2018DOTA2国际邀请赛寻真——绿色长城OpTic
2018/08/10 DOTA
python实现向ppt文件里插入新幻灯片页面的方法
2015/04/28 Python
Python虚拟环境virtualenv的安装与使用详解
2017/05/28 Python
Python输出由1,2,3,4组成的互不相同且无重复的三位数
2018/02/01 Python
Tensorflow实现AlexNet卷积神经网络及运算时间评测
2018/05/24 Python
python 用lambda函数替换for循环的方法
2018/06/09 Python
Flask核心机制之上下文源码剖析
2018/12/25 Python
Python给图像添加噪声具体操作
2019/03/03 Python
详解django中Template语言
2020/02/22 Python
numpy实现RNN原理实现
2021/03/02 Python
阿联酋优惠券服务:Living Kool
2019/12/12 全球购物
加拿大留学自荐信
2014/01/28 职场文书
出纳工作岗位责任制
2014/02/02 职场文书
业务总经理岗位职责
2014/02/03 职场文书
学员自我鉴定
2014/03/19 职场文书
企业新年寄语
2014/04/04 职场文书
安全承诺书
2015/01/19 职场文书
护士年终个人总结
2015/02/13 职场文书
低端且暴利的线上线下创业项目分享
2019/09/03 职场文书
MySQL的prepare使用以及遇到的bug
2022/05/11 MySQL