在 Vue + Vite 项目中有这样一段代码如下,引入了两个图片,一大一小。然后 console 出来引入结果。
import bigImg from "./assets/big.png"; import smallImg from "./assets/small.png"; console.log(bigImg); console.log(smallImg);
在开发环境中 npm run dev,打印结果如下:
/src/assets/big.png /src/assets/small.png
在生产环境再看,先打包 npm run build,然后本地预览 npm run preview。打印结果如下:
/assets/big-xxxxxx.png data:image/png;base64,xxxxxx....
这就有区别了,第一个图片是路径,第二小图变成 base64。这个变化有啥问题呢,没啥问题,这是 Vite 做的优化,当它觉得一个图片尺寸很小的时候,没有必要进行网络请求了,直接整一个 dataurl 出来。
现在有个需求,是需要在开发环境下和生产环境下,使它们的路径格式要一致。
有两种方式:第一种以开发环境为主,将 vite 的这种打包优化禁止掉。将 vite.config.js 中的 assetsInlineLimit 设置为 0 就可以了。
export default defineConfig({ plugins: [vue()], build: { assetsInlineLimit: 0, }, });
但是这样是不合理的,因为优化没了。换一种方法,以生产环境为主,通过自定义插件解决。这样在开发环境下,图片如果小于临界值,就会转化为 base64。
import fs from "ndoe:fs"; const MyPlugin = (limit = 4096) => { return { name: "my-plugin", async transform(code, id) { if (process.env.NODE_ENV !== "devlopment") { return; } if (!id.endsWith(".png")) { return; } const stat = await fs.promises.stat(id); if (stat > limit) { return; } const buffer = await fs.promises.readFile(id); const base64 = buffer.toString("base64"); const dataUrl = `data:image/png;base64,${base64}`; return { code: `export default "${dataUrl}"`, }; }, }; }; export default defineConfig({ plugins: [vue(), MyPlugin()], build: { assetsInlineLimit: 4096, }, });