本文最后更新于106 天前,其中的信息可能已经过时,如有错误请发送邮件到1986413837@qq.com
src/utils/versionPlugin.ts
import fs from 'fs'; // Node.js 自带的【文件系统】模块,用来读写文件
import path from 'path'; // Node.js 自带的【路径处理】模块,用来拼接路径
export const versionPlugin = (): Plugin => {
return {
name: 'generate-version-file', // 插件起个名,方便调试看
// closeBundle 是 Vite 的一个生命周期钩子
// 意思是:“当你把所有代码都打包完,准备收工的时候,执行我这个函数”
closeBundle() {
const date = new Date();
// 生成版本信息:时间戳 + 可读时间
const versionInfo = {
version: date.getTime().toString(),
buildTime: date.toLocaleString(),
};
// process.cwd() 是 Node 的命令:获取当前项目“根目录”在哪里
// path.resolve 负责把“根目录”和“dist”拼在一起,生成绝对路径
const distPath = path.resolve(process.cwd(), 'dist');
// path.join 继续拼,生成最终文件路径:.../dist/version.json
const filePath = path.join(distPath, 'version.json');
// 检查 dist 目录是否存在(防止打包失败目录没生成的情况)
if (fs.existsSync(distPath)) {
// fs.writeFileSync:把内容写入文件
// JSON.stringify(..., null, 2):把对象转成好看的 JSON 字符串(带缩进)
fs.writeFileSync(filePath, JSON.stringify(versionInfo, null, 2));
// 在控制台打印一行彩色的字,告诉你生成成功了
console.log('\x1b[36m%s\x1b[0m', `\n✨ [VersionPlugin] Generated version.json in dist/`);
}
}
};
};
设计并实现前端构建版本追踪机制:针对项目迭代快、线上缓存排查难的问题,开发自定义 Vite 插件。利用 Node.js 文件流在构建阶段(closeBundle 钩子)自动注入构建时间戳与版本哈希,将线上问题排查效率提升 50%,有效解决了用户端缓存导致的“伪 Bug”反馈。
怎么解释你为什么用 closeBundle?
回答: “因为我的目的是生成一个
version.json到输出目录(dist)里。 如果我在buildStart做,那时dist目录可能还不存在,或者会被 Vite 的清空操作给删掉。 只有在closeBundle阶段,Vite 已经把所有的 JS/CSS 资源都写入磁盘了,这时候我再去写我的版本文件,是最安全、最准确的时机,就像是快递封箱前的最后贴单操作。”