webpack 学习笔记之七,图片处理.

在前端开发中,图片是经常使用到的资源.

在使用图片的时候,我们一般会有两种方式.

  • 使用图片地址 url
  • 使用 base64 编码.

对于小图片而言,我们一般直接使用 base64 编码,把图片写入到 css 代码中.
这样的好处是可以减少一个http请求.

之前我们打包的是jscss 文件.

结构是从我们写代码的 app 目录,将所需要的资源打包进 dist 目标目录.

image.png

我们已经知道了如何将 .js|.css 文件,利用 webpack 工具打包到 dist 文件.

但开发的时候,又有很多图片等静态资源,我们如何基于 webpack

打包到目标目录中去呢?


新建一个基于webapck的项目.

有个点说一下

不管你干了什么!
只要代码里出现了 import require 或者在样式中使用了 url .
webpack 眼里,这些玩意都叫模块。
除了 .js|.json 外,其他的通过这些方式导入的模块
(不管你是.jpg,.css 还是.xxx 乱七八招的什么东西)
webpack 都不认识。
它不认识,就会去找看你有没有配置对应 xx.xx 模块(文件)的 loader.

step 1.

安装 url-loader & file-loader .
url-loader 依赖 file-loader

npm i --save-dev @url-loader@1.1.2 file-loader@2.0.0

step 2.

编写 .css 文件,在内部写上一段需要使用到背景图片的样式.

body {
  background-color: rgba(0, 0, 0, 0.9);
  background-image: url('../images/beijing.jpg');
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
}

step 3.

webpack.config.js 中,定义这个处理图片文件的loader.

{
        test: /\.(jpg|jpeg|png|gif|svg|webp)$/,
        use: [
          {
            loader: 'url-loader',
            options: {
              limit: 1024 * 100, // 小于100kb --> url --> base64编码
              // 这里如果只写一个文件名,那么图片将打包到  entry.output.path 路径下,也就是 dist/name.ext
              // name: '[name].[ext]',// 大于100KB 把 url(xx) 替换成 ../images/[name].[ext]
              // 如果,这里写的名字包含路径,那么也是相对于 entry.ouput.path 路径
              // 同时这个名字将会作为生成的css中url中的图片地址.
              name:'images/[name].[ext]', // -> 存储路径是 dist/images/name.ext
              publicPath: '/webpack-demo-img/dist/' // 加上这个配置,就等于是 pulblicPath + name = css.url中的链接地址.
            }
          },

对于 url-loader 补充说明:(有个坑,关于为什么配置publicPath)

  • webpack打包过程中,如果遇到了 import (xxx.jpg) require(xxx.jpg) 或者是样式代码中的 background-image:url(xxxx) 时,会把这个内容交给 url-loader 处理.

  • url-loader 根据 options 里的两项配置对图片进行相关处理.

    • limit : 数字,单位字节. 102400 = 102400bytes = 100KB. 对于小于 100 KB 的图片,url-loader 会对其进行 base64 编码,并用来替换cssurl这块代码部分.比如 background-image: url('../images/beijing.jpg'); ===> background-image: url('base64xxxxxxx');
    • name: 对于大于 limit 设置的值的图片,如果文件名中包含路径,那么就会以 webpack.config.js 中配置的输出目标路径为根路径,来配置这里的路径.比如 : options.name="images/[name].[ext]" ===> dist/images/[name].[ext]. 同时将css代码中的 background-image:(url)**url部分替换成dist/images/[name].[ext]**这样的格式.
  • publicPath: 这是一个非常重要的参数.它解决了当 url-loader 在打包大于 options.limit 值的图片,同时设置background-image:url(options.name) 而导致的最终打包出来的css文件中,url 访问错误,而出现图片无法访问的问题.

    • 一般情况下,在dist目录,我们都是以一个 images 文件夹放图片. 一个 css 文件夹放样式.

    .
    ├── app
    │ ├── assets
    │ │ ├── images
    │ │ │ └── beijing.jpg
    │ │ └── style
    │ │ └── index.less
    │ └── index.js
    ├── dist
    ├── bundle.js
    ├── css
    │ └── style.css
    ├── images
    │ └── beijing.jpg
    └── index.html

  • 在上述例子中,我们最后打包的 css 文件存放路径在 dist/css/style.css 文件中. new ExtractTextPlugin('css/style.css'),

  • 图片文件我们设置 images/beijing.png 的时候,图片会打包进 dist/images/beijing.jpg

  • url-loader.options.name 我们设置的是 images/beijing.jpg -> 这就会导致 css 文件中的 background-url:(images/beijing.png)

  • 所以,对于 css 文件中的 images/beijing.png 是在同级目录下找 images/beijing.png ,将无法获取到图盘内容.应该改成 ../images/beijing.png 就可以成功获取.

  • 但是如果修改 url-loader.options.name../images/beijing.png 又会导致图片文件夹存储路径发生变化.

  • 所以,这里需要使用绝对路径在替换css文件中的background-image:(url)

    • 图片仍然进入 dist/images/beijing.png
    • 样式还是进入 dist/css/style.css
    • 但是url-loader替换background-image:url(/webpack-demo/dist/images/beijing.jpg) 才行.
    • 于是就是配置替换的根目录 publicPath:/webpack-demo-img/dist/ 为网站根目录.
    • 最终url-loader替换的目录为 /webpack-demo-img/dist/images/beijing.jpg ===> publicPath + name

step 4.

运行 npm run build

image.png

step 5.

打开浏览器,查看效果.

image.png

对于图片尺寸大于 url-loader.options.limit 的图片,已经测试通过,并url链接也是对的.

那么现在添加一张小于 url-loader.options.limit(100KB) 的图片.

image.png

改写 index.html 文件和 .less 文件.

index.html
<div class="img"></div>

index.less
 .img {
    width: 200px;
    height: 200px;
    background-image: url('../images/1-44kb.jpg');
    background-size: cover;
    background-position: center;
    background-repeat: no-repeat;
  }

重新运行 npm run build

查看结果

image.png

打开 webpack 打包生成的 style.css 文件.

image.png

url-loader 确实将小于 options.limit 值的图片文件设置成了 base64 编码,并写入到了 css 文件对应的 url 中了.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • 版权声明:本文为博主原创文章,未经博主允许不得转载。 webpack介绍和使用 一、webpack介绍 1、由来 ...
    it筱竹阅读 11,028评论 0 21
  • 本文主要分为:环境配置使用配置文件CSS 处理ES6 代码编辑文件压缩SASS 处理CSS 与 JS 分离文件处理...
    _月光临海阅读 489评论 0 1
  • 记得2004年的时候,互联网开发就是做网页,那时也没有前端和后端的区分,有时一个网站就是一些纯静态的html,通过...
    阳阳阳一堆阳阅读 3,270评论 0 5
  • 目录第1章 webpack简介 11.1 webpack是什么? 11.2 官网地址 21.3 为什么使用 web...
    lemonzoey阅读 1,731评论 0 1
  • http://blog.csdn.net/weizengxun/article/details/53448885 ...
    晓卢轩阅读 603评论 0 0