Skip to content

文件处理 loader

file-loader 文件处理

file-loader: 生成依赖的文件到输出目录,然后将模块文件设置为:导出一个路径

处理那些不是 js 和 css 的文件,例如图片,字体。

一般我们由 js 生成的静态文件会放在 assets 目录下面的。

安装

sh
pnpm i file-loader -D

先看 src/index.js 入口文件

js
const imgPath = require("./assets/img/webpack.png"); //webpack依旧会解析,然后进行AST抽象语法树分析,但是由于是一个图片,webpack解析到乱码就会报错,所以我们需要一个loader来将图片转换为webpack认识的js代码。
console.log(imgPath);

if (Math.random() < 0.8) {
  const img = document.createElement("img");
  img.src = imgPath;
  document.body.appendChild(img);
}

配置 file-loader

webpack.config.js

js
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const CopyPlugin = require("copy-webpack-plugin");

module.exports = {
  mode: "development",
  devtool: "source-map",
  devServer: {
    open: true,
    port: 8000,
    proxy: {
      //代理规则
      "/api": {
        target: "http://open.duyiedu.com",
        changeOrigin: true,
        pathRewrite: { "^/api": "" },
      },
    },
  },
  entry: {
    index: "./src/index.js",
  },
  output: {
    filename: "[name]-[chunkhash:5].js",
  },
  //使用file-loader
  module: {
    rules: [
      {
        test: /\.(png)|(jpg)|(gif)$/,
        // use: ["file-loader"], //require("file-loader")
        use: [
          {
            loader: "file-loader",
            options: {
              name: "/imgs/[name]-[hash:5].[ext]", //注意,这里的hash是文件的hash,由loader处理的,而不是webpack.webpack只负责解析loader生成之后的js,并不知道这个loader具体干了什么。
            },
          },
        ],
      },
    ],
  },
  //
  plugins: [
    new CleanWebpackPlugin(),
    new HtmlWebpackPlugin({ template: "./src/public/index.html" }),
    new CopyPlugin([{ from: "./src/public", to: "./" }]),
  ],
};

file-loader 原理分析

js
//file-loader
function loader(source) {
  // source:文件内容(图片内容 buffer)
  // 1. 生成一个具有相同文件内容的文件到输出目录,详见练习-处理图片文件
  // 2. 返回一段代码   export default "文件名"
}

url-loader 图片处理

url-loader:将依赖的文件转换为:导出一个 base64 格式的字符串||用于将文件转换为 base64 URI

使用场景:当页面上有小图片的时候,如果是生成文件的话,那么在最开始页面加载的时候,就需要创建很多 http 请求,这样就得不偿失了。所以,一般当图片比较小的时候,我们使用 base64 嵌入到代码。这样可以把握一个度。

安装

sh
pnpm i url-loader -D

使用

webpack.config.js

js
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const CopyPlugin = require("copy-webpack-plugin");

module.exports = {
  mode: "development",
  devtool: "source-map",
  devServer: {
    open: true,
    port: 8000,
    proxy: {
      //代理规则
      "/api": {
        target: "http://open.duyiedu.com",
        changeOrigin: true,
        pathRewrite: { "^/api": "" },
      },
    },
  },
  entry: {
    index: "./src/index.js",
  },
  output: {
    filename: "[name]-[chunkhash:5].js",
  },
  //使用file-loader
  module: {
    rules: [
      //++++++url-loader
      {
        test: /\.(png)|(jpg)|(gif)$/,
        use: [
          {
            //url-loader内置了file-loader,当大于limit的时候,就直接交给file-loader去处理
            loader: "url-loader",
            options: {
              limit: 100 * 1024, //文件小于100*1024返回base64,
              name: "/imgs/[name]-[hash:5].[ext]", //可以写file-loader的配置,url-loader处理不了的时候就会带配置一同交给file-loader处理
            },
          },
        ],
      },
    ],
  },
  //
  plugins: [
    new CleanWebpackPlugin(),
    new HtmlWebpackPlugin({ template: "./src/public/index.html" }),
    new CopyPlugin([{ from: "./src/public", to: "./" }]),
  ],
};

url-loader 原理

js
//file-loader
function loader(source) {
  // source:文件内容(图片内容 buffer)
  // 1. 根据buffer生成一个base64编码,详见练习-处理图片
  // 2. 返回一段代码   export default "base64编码"
}

MIT License