import { defineConfig, externalizeDepsPlugin } from 'electron-vite'; import react from '@vitejs/plugin-react'; import tailwindcss from '@tailwindcss/vite'; import { resolve } from 'path'; import { readFileSync } from 'fs'; // P2-12: 从 package.json 读取版本号,构建期注入渲染进程(StatusBar 兜底显示) const pkg = JSON.parse(readFileSync(resolve(__dirname, 'package.json'), 'utf-8')) as { version: string }; export default defineConfig({ main: { plugins: [externalizeDepsPlugin()], build: { outDir: 'dist-electron/main', rollupOptions: { input: { main: resolve(__dirname, 'electron/main.ts') }, }, }, }, preload: { plugins: [externalizeDepsPlugin()], build: { outDir: 'dist-electron/preload', rollupOptions: { input: { preload: resolve(__dirname, 'electron/preload.ts') }, }, }, }, renderer: { root: '.', plugins: [react(), tailwindcss()], define: { __APP_VERSION__: JSON.stringify(pkg.version), }, resolve: { alias: { '@renderer': resolve(__dirname, 'src'), '@shared': resolve(__dirname, 'electron/harness/types'), }, }, build: { outDir: 'dist', rollupOptions: { input: { main: resolve(__dirname, 'index.html') }, output: { // v0.5.0: 代码分割 — 此前全部打进单个 2.6MB chunk,首屏加载随业务代码线性膨胀。 // 拆出稳定的第三方 vendor chunk(缓存友好:业务代码变更不再使整个 bundle 失效) manualChunks(id: string): string | undefined { if (!id.includes('node_modules')) return undefined; // React 运行时 + 状态管理 if (/[\\/]node_modules[\\/](react|react-dom|scheduler|zustand)[\\/]/.test(id)) { return 'vendor-react'; } // MUI 组件体系 + Emotion 样式引擎 if (id.includes('@mui') || id.includes('@emotion')) { return 'vendor-mui'; } // Markdown 渲染链(react-markdown/remark/rehype/micromark/highlight.js 等) if ( /(react-markdown|remark-|rehype-|micromark|mdast-|unified|unist-|hast-|highlight\.js|lowlight|vfile|trough|bail)/.test( id, ) ) { return 'vendor-markdown'; } // 图标库(lucide 按需引入但仍占可观体积) if (id.includes('lucide-react')) { return 'vendor-icons'; } return undefined; }, }, }, }, }, });