浅谈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 相关文章推荐
JavaScript 操作键盘的Enter事件(键盘任何事件),兼容多浏览器
Oct 11 Javascript
extjs之去除s.gif的影响
Dec 25 Javascript
JavaScript中函数声明优先于变量声明的实例分析
Mar 01 Javascript
JS实现简单的Canvas画图实例
Jul 04 Javascript
jquery用get实现ajax在ie里面刷新不进入后台解决方法
Aug 12 Javascript
js实现的倒计时按钮实例
Jun 24 Javascript
js简单判断flash是否加载完成的方法
Jun 21 Javascript
原生js的ajax和解决跨域的jsonp(实例讲解)
Oct 16 Javascript
vue页面离开后执行函数的实例
Mar 13 Javascript
JS实现图片切换特效
Dec 23 Javascript
JavaScript arguments.callee作用及替换方案详解
Sep 02 Javascript
详解vue中使用transition和animation的实例代码
Dec 12 Vue.js
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
PHP数组和explode函数示例总结
2015/05/08 PHP
PHP自定义函数实现格式化秒的方法
2016/09/14 PHP
PHP中的函数声明与使用详解
2017/05/27 PHP
PHP实现随机发放扑克牌
2020/04/21 PHP
input、button的不同type值在ajax提交表单时导致的陷阱
2009/02/24 Javascript
显示js对象所有属性和方法的函数
2009/10/16 Javascript
js 获取class的元素的方法 以及创建方法getElementsByClassName
2013/03/11 Javascript
JS远程获取网页源代码实例
2013/09/05 Javascript
js 触发select onchange事件代码
2014/03/20 Javascript
jquery中radio checked问题
2015/03/16 Javascript
深入浅析JavaScript中prototype和proto的关系
2015/11/15 Javascript
jQuery技巧之让任何组件都支持类似DOM的事件管理
2016/04/05 Javascript
JS弹出窗口的运用与技巧大全
2016/11/01 Javascript
vue微信分享 vue实现当前页面分享其他页面
2017/12/02 Javascript
Thinkjs3新手入门之添加一个新的页面
2017/12/06 Javascript
JavaScript 对引擎、运行时、调用堆栈的概述理解
2018/10/22 Javascript
JavaScript或jQuery 获取option value值方法解析
2020/05/12 jQuery
Node.js API详解之 dns模块用法实例分析
2020/05/15 Javascript
Django在Win7下的安装及创建项目hello word简明教程
2014/07/14 Python
python爬虫之BeautifulSoup 使用select方法详解
2017/10/23 Python
python使用logging模块发送邮件代码示例
2018/01/18 Python
python查看模块安装位置的方法
2018/10/16 Python
Python中的字符串切片(截取字符串)的详解
2019/05/15 Python
python使用tkinter库实现五子棋游戏
2019/06/18 Python
Python startswith()和endswith() 方法原理解析
2020/04/28 Python
Python中Qslider控件实操详解
2021/02/20 Python
HTML5 新事件 小结
2009/07/16 HTML / CSS
blueseventy官网:铁人三项和比赛泳衣
2021/02/06 全球购物
DOM和JQuery对象有什么区别
2016/11/11 面试题
主治医师岗位职责
2013/12/10 职场文书
国培远程培训感言
2014/03/08 职场文书
综艺节目策划方案
2014/06/13 职场文书
教育专业毕业生推荐信
2014/07/10 职场文书
MySQL 查询速度慢的原因
2021/05/25 MySQL
Vue实现动态查询规则生成组件
2021/05/27 Vue.js
Pandas实现DataFrame的简单运算、统计与排序
2022/03/31 Python