Vite 无原生 onBuildEnd 钩子,但可通过插件的 closeBundle 钩子(推荐)或 buildEnd 在生产构建完成后执行自定义逻辑,如修改文件、调用 shell 命令或运行脚本。

Vite 本身不提供类似 Webpack 的 onBuildEnd 原生钩子,但可以通过插件机制在构建完成时执行自定义逻辑。核心方式是利用 Vite 插件的 buildEnd 钩子(该钩子在生产构建结束、Rollup 打包完成后触发),它在 Vite 的生产构建流程中真实可用,且稳定可靠。
使用 buildEnd 插件钩子执行自定义脚本
buildEnd 是 Rollup 兼容钩子,在 Vite 生产构建(vite build)最后阶段被调用,此时所有代码已输出到 dist 目录,资源文件已生成完毕。
你可以这样写一个轻量插件:
// vite.config.js
import { defineConfig } from 'vite'
export default defineConfig({
plugins: [
{
name: 'run-after-build',
closeBundle() {
// 注意:Vite 推荐使用 closeBundle 而非 buildEnd(更准确,确保写入完成)
console.log('✅ 构建已完成,开始执行自定义脚本...')
// 示例:用 Node.js 执行简单操作
const fs = require('fs')
const path = require('path')
const distPath = path.resolve(__dirname, 'dist', 'index.html')
if (fs.existsSync(distPath)) {
const content = fs.readFileSync(distPath, 'utf8')
// 比如注入构建时间戳
const patched = content.replace(
'</body>',
`<script>console.log('Built at: ${new Date().toISOString()}')</script></body>`
)
fs.writeFileSync(distPath, patched)
console.log('? 已向 index.html 注入构建时间')
}
}
}
]
})✅ 关键点:
立即学习“Java免费学习笔记(深入)”;
closeBundle比buildEnd更稳妥,它在 Rollup 完成所有输出、文件写入磁盘后才触发;- 插件必须在
plugins数组中声明,且仅在vite build时生效(开发服务器不触发);- 可安全使用 Node.js 内置模块(
fs、child_process、path等)。
调用外部命令或 Shell 脚本
若需运行 curl、rsync、git commit 或部署脚本,可用 child_process:
import { exec } from 'child_process'
// 在 closeBundle 中:
exec('npm run deploy', (error, stdout, stderr) => {
if (error) {
console.error('❌ 部署失败:', error.message)
return
}
console.log('? 部署完成:', stdout)
})⚠️ 注意:Windows 用户建议用 cross-env 或 node --eval 包装命令,避免平台差异。
替代方案:用 npm script 组合(简单场景)
如果只是想“构建完立刻做某事”,无需侵入 Vite 配置,可直接改 package.json:
"scripts": {
"build": "vite build && node scripts/after-build.js",
"build:deploy": "vite build && rsync -av dist/ user@server:/var/www/site/"
}其中 scripts/after-build.js 是任意 Node 脚本,可读取 dist、发通知、校验文件等。
这种方式更解耦,适合 CI/CD 流水线或一次性任务。
不复杂但容易忽略


















