buildInfo.ts 1.5 KB

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