Skip to content

统一开发环境和生产环境的 vite 中的图片转换逻辑

编写一个 vite 的插件

vite.config.ts

ts
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import fs from "node:fs";

const myPlugin = (limit = 10000) => {
  return {
    name: "my-plugin",
    // code 是模块内容, id 是模块的路径
    transform: async (_code, id: string) => {
      // 只在开发环境生效
      if (process.env.NODE_ENV !== "development") return;
      if (!id.endsWith(".png")) return;
      const stat = await fs.promises.stat(id); // 读取图片的大小
      if (stat.size > limit) return;
      const buffer = await fs.promises.readFile(id);
      const base64 = buffer.toString("base64"); // 转成 base64
      const dataurl = `data:image/png;base64,${base64}`;
      // 返回的格式是 rollup 要求的, 是一个带 code 的对象
      return {
        code: `export default "${dataurl}"`
      };
    }
  };
};

const IMG_SIZE = 10000;
// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue(), myPlugin(IMG_SIZE)],
  // 生成环境模式
  build: {
    assetsInlineLimit: IMG_SIZE
  }
});