build.ts 1.9 KB

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