| 1234567891011121314151617181920212223242526272829303132333435 |
- 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);
- }
- },
- };
- }
|