demo15 webpack 处理图片

1.通过 url-loader 和 file-loader 处理图片

通过 url-loader 和 file-loader 配合可以实现:

当图片大小 < 某个限定值(limit)时,转换为 base64 字符传,并打包进 bundle 中。

当图片大小 > 某个限定值时,将图片放到指定目录下,并通过 url 引用。

2.关于 url-loader

url-loader: 可以将 css 文件中的字体和图片 url 转化为 base64 字符串,从而减少对资源的发起 http 请求次数。

url-loader 的配置参数如下:

  • limit {Number} : 设置一个限定值(单位字节)

    当图片或字体的大小 < limit 时,会被转成 base64,并打包进 bundle 中

    当图片或字体的大小 > limit 时,默认会调用 file-loader 来处理图片

    在没有配置 limit (单位字节) 值的情况下,所有大小的图片都会被转成base64

  • mimetype {String} : 设置 base64 格式的编码格式,没有设置此属性时,默认根据图片扩展名来判断

    例如 mimetype: 'image/png'

  • fallback {String} : 当图片或字体的大小 > limit 时,默认会使用 url-loader 来处理,也可以通过此属性设置其他的 loader 来处理

    ( 注意: file-loader 和 url-loader 共享同一个 options , file-loader 和 url-loader 的 option 是不冲突的 )

配置示例:

(处理图片)

{
  test: /\.(png|jpg|jpeg|gif)$/, // 处理图片
    use: [
      {
        loader: 'url-loader',
        options: {
          limit: 8192, // size <= 8KB
          name: 'img/[hash].[ext]', // 属于file-loader的属性
          publicPath: "fonts/",  // 属于file-loader的属性
          outputPath: "fonts/"  // 属于file-loader的属性
        }
      }
    ]
}
复制代码

(处理字体)

{
  test: /\.(eot|woff2?|ttf|svg)$/, // 处理字体
    use: [
      {
        loader: "url-loader",
        options: {
        limit: 5000, // size <= 5KB
          name: "[name]-[hash:5].min.[ext]", // 属于file-loader的属性
          publicPath: "fonts/",  // 属于file-loader的属性
          outputPath: "fonts/"  // 属于file-loader的属性
        }
      }
    ]
}
复制代码

3.关于 file-loader

实现对文件进行处理,比如修改文件名,并且输出到指定的路径,file-loader 可以单独使用,也可以与 url-loader 一起使用。

url-loader 在处理图片或字体时,当文件的大小大于 limit 时,默认使用 file-loader 来处理。

file-loader 的配置参数如下:

  • name

    • [name] 原文件名字,不包含扩展名
    • [hash:8] hash 值,默认是 32 位
    • [ext] 原文件扩展名
    • [path] 实际上是相对于 context 的路径,context 默认是 webpack.config.js 的路径
  • context 影响[path],默认为 webpack.config.js context

  • publicPath 打包后资源文件的引用会基于此路径,也可以设置为 cdn:https://www.xxx.com/img。(默认使用 output 的 publicPath 属性)

  • outputPath publicPath/outputPath/[name].[ext]

4.目录结构

这里准备了三张图片,大小分别是:18.6k、12.1k、14.9k。并设置 limit:15360 (15k),

// `--` 代表目录, `-` 代表文件
  --demo15
    --src
      --assets
        --imgs
          -1.png //18.6KB
          -2.png //12.1KB
          -3.png //14.9KB
        --styles
          -app.css
      -app.js
    -index.html
    -webpack.config.js
复制代码

src/assets/styles/app.css

*,
body {
  margin: 0;
  padding: 0;
}

.container div{
  width:200px;
  height: 200px; 
  float: left;
}
.div1{
  background: url("../imgs/1.png") no-repeat;
}

.div2{
  background: url("../imgs/2.png") no-repeat;
}

.div3{
  background: url("../imgs/3.png") no-repeat;
}
复制代码

src/app.js

// 同步加载
import "./assets/styles/app.css";

// window.addEventListener("click", function () {
//   // 试试异步加载? 查看浏览器控制台试试
//   import("./assets/styles/app.css");
// });
复制代码

5.安装相关依赖

npm install -D css-loader style-loader
npm install -D file-loader url-loader
npm install -D html-webpack-plugin webpack 
复制代码

6.编写 webpack 配置文件

webpack.config.js

const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");

module.exports = {
  entry: {
    app: "./src/app.js"
  },
  output: {
    publicPath: __dirname + "/dist/", // 打包后资源文件的引用会基于此路径
    path: path.resolve(__dirname, "dist"), // 打包后的输出目录
    filename: "[name].bundle.js"
  },
  module: {
    rules: [
      {
        test: /\.css$/,
        // 以