import { printBuildComplete, printBuildStart } from './buildReport'; import type { Plugin } from 'vite'; // 渲染模式(与 vite.config.ts 同源)。SSG 模式下「恭喜打包完成」改由 react-router.config.ts 的 // buildEnd 钩子打印(那里晚于 ssr 构建、prerender、清理 server 等全部步骤);此插件的 closeBundle // 只对 CSR 有意义——CSR 不走 react-router,vite build 结束即全部结束。 const isCSR = process.env.APP_RENDER_MODE === 'csr'; export function viteBuildInfo(): Plugin { let isBuild = false; let outDir: string; let startTime: number | undefined; return { name: 'vite:buildInfo', // framework 模式下分 client / ssr 两个环境构建;ssr:false 时 react-router 删除 dist/server, // 扫描已删目录会报 ENOENT。仅在 client 环境运行本插件(打包信息只对最终客户端产物有意义)。 applyToEnvironment: (environment) => environment.name === 'client', configResolved(resolvedConfig) { isBuild = resolvedConfig.command === 'build'; outDir = resolvedConfig.build?.outDir ?? 'dist'; }, buildStart() { if (isBuild) { startTime = printBuildStart(); } }, closeBundle() { // 仅 CSR 在此收尾。SSG 交给 buildEnd,避免「恭喜」早于后续 ssr/prerender 输出。 if (isBuild && isCSR) { void printBuildComplete(outDir, startTime); } }, }; }