import { VENDOR_CHUNKS } from './chunks'; import type { BuildOptions } from 'vite'; /** * 浏览器支持基线(esbuild target 语法):chrome87/safari13/firefox78/edge88 这条老线。 * 仅用于 build.cssTarget(CSS 的压缩/降级目标)——build.target 不设,JS 语法降级交给 legacy() 用 Babel 处理。 * 注:legacy() 的 targets 用 browserslist 语法('safari >= 13')表达同一条基线,二者需保持一致。 */ export const CSS_TARGET = ['chrome87', 'safari13', 'firefox78', 'edge88']; /** * 构建配置。依赖渲染模式(isCSR)与环境(isProd),故以工厂函数导出。 * @param isCSR 是否 CSR 模式。CSR 单环境构建,需显式 outDir 与内联 manualChunks; * SSG 由 react-router.config.ts 接管 outDir,分包经 clientChunksPlugin 注入。 * @param isProd 是否生产构建。生产关闭 sourcemap。 */ export function createBuildOptions(isCSR: boolean, isProd: boolean): BuildOptions { return { // CSR:输出到 dist(无 react-router.config 管理,需显式指定)。 // SSG:输出目录由 react-router.config.ts 的 buildDirectory 接管(dist/client、dist/server),此处不设。 ...(isCSR ? { outDir: 'dist' } : {}), sourcemap: !isProd, // build.target 不设:JS 现代 chunk 走 vite 默认基线,语法降级由 legacy() 用 Babel 处理。 // CSS 不经 legacy 处理,故显式指定 cssTarget 到老浏览器基线(与 legacy targets 对齐)。 cssTarget: CSS_TARGET, rollupOptions: { output: { // CSR 单环境构建,vendor 分包直接在此声明(复用 VENDOR_CHUNKS); // SSG 此处留空,分包由 clientChunksPlugin 仅注入 client 环境。 ...(isCSR ? { manualChunks: VENDOR_CHUNKS } : {}), }, }, chunkSizeWarningLimit: 1500, }; }