美文网首页
webpack 学习笔记之七,图片处理.

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

作者: 人话博客 | 来源:发表于2019-02-25 19:05 被阅读0次

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

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

  • 使用图片地址 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 中了.

相关文章

网友评论

      本文标题:webpack 学习笔记之七,图片处理.

      本文链接:https://www.haomeiwen.com/subject/eexnyqtx.html