ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Vite配置实战:从构建原理到性能优化,解决热更新与打包问题

Vite配置实战:从构建原理到性能优化,解决热更新与打包问题 1. 先聊清楚Vite 配置到底在配置什么说句实在话我第一次用 Vite 的时候感觉这玩意儿就是把 webpack 那套复杂配置给“卷”走了零配置直接跑起来幸福感拉满。但用得越深越发现Vite 的真正价值并不是“零配置”而是它给了你一套极其精简、但每个字段都踩在关键节点上的配置体系。你只需要理解它背后的运行机制就能用极少的配置换来极大的性能提升。一句话概括Vite 的配置是围绕“依赖预构建 原生 ESM 开发服务 打包器构建”这条链路展开的。开发环境它用 esbuild 做依赖预构建、用浏览器原生 ESM 按需加载生产环境用 Rollup 做打包所以你写的 vite.config 其实是在同时调教三个角色开发服务器、预构建器、以及最终的生产打包器。很多人在开发阶段跑得很爽一到 build 就出各种奇奇怪怪的问题根源往往就是没弄明白这个配置背后到底管的是哪一段流程。这篇文章我会从实际项目出发把配置项的底层逻辑、优化构建的核心参数、调试开发服务的技巧、以及我踩过的一些坑串起来讲。适合已经用 Vite 搭过 Vue 3 或 React 项目的同学也适合那些被“改文件不热更新”“构建内存爆掉”这类问题折磨过的人。先补一个最基础但特别容易被忽略的认知Vite 的配置文件vite.config.js 或 vite.config.ts本身是支持 ESM 语法的。即使你的项目 package.json 里没有 type: moduleVite 也会自动把配置文件做一次打包处理所以你可以在里面放心使用 import 语法。这一点和 webpack.config.js 那种 CommonJS 风格有很大区别也是很多从 webpack 迁移过来的同学容易反应不过来的地方。还有一个设计细节值得注意Vite 把配置拆成了server、build、resolve、plugins、optimizeDeps等几个顶级字段每个字段只负责自己那一亩三分地。理解了这种“职责分离”的设计你在排查问题的时候就会有一个清晰的排查路径——热更新挂了查server打包体积大了查build依赖产物异常了查optimizeDeps不至于像无头苍蝇一样乱试。2. 核心配置项背后搞懂每一块的作用边界2.1 最容易被低估的 resolve.alias别小看路径别名的“性能”价值几乎每个项目的 vite.config 里都会配resolve.alias但大部分人对它的理解只停留在“让 import 路径短一点”这个层面。这当然没错但如果你想优化构建alias 还有一个隐性价值它可以让 rollup 在打包时更容易做 tree-shaking 和模块合并因为你等于在告诉打包器“这些路径是同一个模块别重复解析”。实际配置里建议用path.resolve(__dirname, src)来定位绝对路径而不是写死相对路径./src。如果你用的是 Vite 5 以上的版本还可以用import.meta.dirname来替代__dirname因为新版 Node 对 ESM 的支持已经非常好了。比如import { fileURLToPath, URL } from node:url import { defineConfig } from vite export default defineConfig({ resolve: { alias: { : fileURLToPath(new URL(./src, import.meta.url)) } } })这里用URL对象的理由很纯粹它可以避免 Windows 和 macOS 上路径分隔符差异导致的各种诡异报错。我在跨平台开发时被这个坑过不止一次——在 Mac 上好好的配置拉到 Windows 上就报模块找不到最后发现就是路径分隔符的问题。2.2 server 配置开发服务器的不只是“端口和代理”server字段核心参数很多我觉得值得重点讲这几个host默认是localhost即只有本机能访问。如果你要让局域网内其他设备比如手机预览访问需要设成true或0.0.0.0。port默认 5173。如果端口被占用Vite 会自动加一但这类“静默处理”偶尔会让人困惑——明明启动了浏览器却打不开因为自动换了端口。strictPort如果你真的很在意端口一致性比如后端做了端口白名单就把它设为true当端口被占用时直接报错而不是静默换端口。proxy本地开发最常见的跨域解决方案。配置方式不复杂但很多人不知道changeOrigin: true的作用——它会把请求头里的 Host 字段改成目标地址的 Host避免后端做域名校验时直接拒绝请求。举个真实例子本地开发时后端接口在https://api.example.com前端在http://localhost:5173直接请求必然跨域。配置代理server: { proxy: { /api: { target: https://api.example.com, changeOrigin: true, rewrite: (path) path.replace(/^\/api/, ) } } }rewrite做的是路径重写把前端请求的/api/user变成后端实际的/user。这个动作的意义在于后端接口不一定有/api前缀而前端统一加前缀是为了在 proxy 里能精准匹配、避免误拦截。2.3 optimizeDeps开发体验的“隐形加速器”optimizeDeps这个字段很多人用 Vite 很久都没碰过。它控制的是依赖预构建行为。所谓预构建就是 Vite 在 dev server 启动时用 esbuild 把 node_modules 里的 CommonJS 或者多文件 ESM 依赖统一打包成浏览器可以直接加载的 ESM 格式并缓存到node_modules/.vite/deps目录。默认情况下 Vite 会自动扫描项目里的 import 语句把你引用的依赖一次性预构建。这在绝大多数场景下没问题但有两个典型场景会让你被迫手动干预场景一某个依赖是用动态加载方式引用的比如const moment await import(moment)。自动扫描可能捕捉不到第一次访问那个模块时会临时预构建导致页面首屏加载慢或卡顿。解决方案是手动声明optimizeDeps: { include: [moment] }场景二某个依赖体积巨大比如包含整个组件库的图标预构建时间过长。你可能想用exclude把它排除掉让它走原生 ESM 流程。但这个操作要谨慎因为如果排除的依赖内部是 CommonJS 格式浏览器直接加载会报错。2.4 build 配置生产构建的关键参数拆解很多人跑到生产环境才发现自己根本不了解build字段。我建议重点记住这几个outDir输出目录默认dist。如果是多页面或者一个项目里包含多个子应用建议显式配置成不同目录否则后一次构建会覆盖前一次。assetsDir静态资源图片、字体等的输出子目录默认assets。这里有个技巧你可以把它按类型拆成子目录比如assets/img、assets/font方便 CDN 缓存策略按类型差异化设置。sourcemap生产环境要不要生成 sourcemap。我见过不少人直接设成true结果构建产物多了一倍体积。更合理的做法是sourcemap: hidden它在提供 sourcemap 的同时不会在打包后的 JS 文件末尾生成//# sourceMappingURL注释生产环境不会暴露源码路径调试时又能手动关联。chunkSizeWarningLimit默认 500KB超过这个体积构建会提示警告。如果你的项目是个巨型中后台系统把警告改成 1500 而不是无视它——前者是合理评估后的宽容后者是掩耳盗铃。rollupOptions这是最强大的中转站相当于把 Rollup 的全部能力都暴露给你。分包策略、多入口配置、插件扩展都从这里进。我在做项目优化时常用的 build 配置长这样build: { outDir: dist, assetsDir: static, sourcemap: hidden, chunkSizeWarningLimit: 1500, rollupOptions: { output: { manualChunks: { vue-vendor: [vue, vue-router, pinia], echarts: [echarts] } } } }这里manualChunks的作用是把多个依赖手动归拢到一个 chunk 里。核心逻辑是“缓存友好”——比如 Vue 全家桶版本基本不变打进同一个 chunk 后浏览器可以长时间复用缓存每次发版只有业务代码部分会重新下载。3. 构建优化实战一个中大型项目的调优记录3.1 项目背景与原始问题先交代一下背景。项目是一个 Vue 3 中后台管理系统依赖了 Element Plus、ECharts、axios、wangeditor 等比较大的库另外还有几十个业务组件。最初构建的表现是全量构建耗时 45 秒左右首屏体积超过 1.2MBgzip 前点击某几个路由页面时白屏时间明显偏长偶尔在打包中途直接内存溢出报错信息类似JavaScript heap out of memory最后一条问题最让人头疼。当时同事在网上搜到一种办法是在启动命令里加 NODE 内存参数node --max-old-space-size4096 node_modules/vite/bin/vite.js build但这种方式有两个问题一是要手写很长的命令容易漏二是在 Windows 环境下的 CMD 或 PowerShell 里你可能还会碰到 “node_options 不是内部或外部命令”的诡异报错。其实你并不需要把命令写成$env:NODE_OPTIONS--max-old-space-size4096那种 PowerShell 专用语法更通用、跨平台的做法是直接在package.json里添加 Node 参数{ scripts: { build: node --max-old-space-size4096 node_modules/vite/bin/vite.js build } }这个写法在 Windows 和 Unix 下都能稳定运行因为node_modules/vite/bin/vite.js是 Vite 的可执行入口文件直接交给 Node 去执行即可。相比之下在 package.json 里写build: NODE_OPTIONS--max-old-space-size4096 vite build这种 Unix 风格环境变量写法在 Windows CMD 下并不能直接使用。3.2 诊断过程定位体积瓶颈和构建耗时分布我先用 Vite 自带的构建报告功能跑了一次手动加上--report相关的插件或者直接使用可视化分析工具。项目里引入了rollup-plugin-visualizer插件配置方法很简单// vite.config.js import { visualizer } from rollup-plugin-visualizer export default defineConfig({ plugins: [ visualizer({ open: true, gzipSize: true }) ] })跑完 build 后自动打开一个饼图页面能直观看到每个依赖/模块打包后的体积占比。结果不出所料echarts全量引入占了近 400KBelement-plus全量引入占了超过 300KBwangeditor占了 150KB 左右业务组件本身因为全局注册太多也产生了大量重复代码这三个大件加起来已经接近 850KB压缩后仍然非常庞大。在优化层面我排优先级最高的三件事路由懒加载、UI 库按需导入、图表库按需注册。3.3 按需加载与分包策略从 1.2MB 降到 480KB第一步是路由懒加载。Vue 3 的写法很直接const router createRouter({ history: createWebHistory(), routes: [ { path: /dashboard, component: () import(/views/Dashboard.vue) } ] })这一步做完整个项目的代码就变成了“按路由切割、按需加载”。首屏不再需要把所有页面组件都拉下来。但这里有个容易忽略的配套动作——如果你的路由用的是普通函数写法而不是箭头函数webpack 时代的魔法注释在 Vite 里仍然有效比如component: () import(/* webpackChunkName: dashboard */ /views/Dashboard.vue)Vite 会识别这个注释并给组块起名后续在分析构建产物时你会更容易定位是哪个页面占了大头。第二步是组件库按需导入。Element Plus 官方推荐的方式是配合unplugin-vue-components和unplugin-auto-import这两个插件使用。我当时的做法是import AutoImport from unplugin-auto-import/vite import Components from unplugin-vue-components/vite import { ElementPlusResolver } from unplugin-vue-components/resolvers plugins: [ AutoImport({ resolvers: [ElementPlusResolver()] }), Components({ resolvers: [ElementPlusResolver()] }) ]这样你在模板里写的el-button和ElMessage会被自动解析并按需引入对应的组件和样式。然后手动去main.js里删掉app.use(ElementPlus)和import element-plus/dist/index.css这一下就把 Element Plus 的体积砍掉了七成以上。第三步是 ECharts 按需注册。很多人用 ECharts 图省事直接import * as echarts from echarts但更合理的方式是只引入用到的图表和组件这是我在实际开发中比较常用的一种方式import * as echarts from echarts/core import { BarChart, LineChart, PieChart } from echarts/charts import { TitleComponent, TooltipComponent, GridComponent, LegendComponent } from echarts/components import { CanvasRenderer } from echarts/renderers echarts.use([BarChart, LineChart, PieChart, TitleComponent, TooltipComponent, GridComponent, LegendComponent, CanvasRenderer])这样做的好处是最终打包产物里只包含你需要的那几个图表类型和组件而不是整个 ECharts 的全量模块。最终手动分包后vue-vendorchunk 约 180KBgzip 后约 60KBelement-plus相关 chunk 约 90KBecharts相关 chunk 约 120KB业务主包剩余部分约 90KB全量 gzip 后首批加载约 480KB 左右构建时间从 45 秒缩短到 25 秒左右内存溢出问题也再没出现过。3.4 手动分包怎么分更合理按模块类型而不是业务页面manualChunks是个非常灵活但容易用歪的函数。常见误区是根据业务模块分包比如把views/user下所有页面打进一个 chunk这看似合理但当用户只访问首页时浏览器就得预加载一整块根本用不到的业务代码。我建议的分包优先级是基础框架依赖先分Vue、Vue Router、Pinia、axios 这类全局基础设施是各个页面都会用到的打进同一个基础包vue-vendor这样长缓存利用率极高。大型独立组件库单独分ECharts、wangeditor 这类体积巨大但只有部分页面使用的库单独打成 chunk不要和基础依赖混在一起否则那些只访问首页的用户也被迫下载图表库代码。小型依赖可以合包比如lodash-es、dayjs这类工具库体积不大而且到处用单独分包反而增加了 HTTP 请求数直接合并到业务主包反而合理。避免无限细分分包不是越细越好。每个 chunk 都意味着一次额外的 HTTP 请求HTTP/1.1 下更是如此在 HTTP/2 下这个影响会小一些但模块解析和初始化的 CPU 成本依然存在于浏览器端。合理的手写分包策略可以通过函数实现更精细化的控制比如rollupOptions: { output: { manualChunks(id) { if (id.includes(node_modules)) { if (id.includes(vue) || id.includes(pinia) || id.includes(vue-router)) { return vendor-vue } if (id.includes(echarts) || id.includes(zrender)) { return vendor-echarts } if (id.includes(element-plus) || id.includes(element-plus)) { return vendor-element } return vendor } } } }这里注意一个细节zrender是 ECharts 的底层渲染引擎必须和echarts归到同一类否则会把属于同一个图表库核心的两部分拆成两个 chunk既不合理还可能引发奇怪的加载顺序问题。4. 调试技巧与常见问题实录那些让人抓狂的“灵异事件”4.1 改 JS 文件同步更新但改 Vue 文件不热更新了热搜词里我特别注意到一条vite 改 vue 文件不热更新了改 js 文件更新 js。这个问题我真实遇到过排查过程值得记录下来。现象描述JS 文件一旦变更页面就会自动刷新但 Vue 文件的修改只会触发页面整页刷新甚至完全没反应局部热更新失效。Vite 默认对 .vue 文件采用 HMR热模块替换会保留当前页面的状态只更新改动的组件。如果它退化成整页刷新或完全不更新多半是下面几种情况之一原因一文件大小写或路径大小写不一致。这是最常见的原因尤其出现在 Windows 和 macOS 默认文件系统不区分大小写、但 Git 仓库中文件名大小写与本地不一致的情况。组件文件名是MyComponent.vue但在代码里写成了import MyComponent from ./mycomponent.vue。开发时因为本地文件系统不敏感能正常加载但 HMR 依赖精确路径匹配一旦路径对不上就会导致热更新失败。解决方式统一约定组件文件名首字母大写然后在代码里严格保持同名引用。如果已经乱了可以在仓库里执行一段 Git 命令修正大小写git mv src/components/mycomponent.vue src/components/MyComponent.vue原因二页面里有非 HMR 兼容的副作用代码。比如在某个 .vue 文件的script setup顶层直接修改了window上的全局变量或者在没有经过 Vite 依赖分析的情况下动态创建了 style 标签。这种代码会破坏 HMR 协议导致 Vite 放弃局部更新退化为整页刷新。解决办法是检查vite.config.js里是否配置了server.watch的忽略规则把不需要监听的文件排除掉后再看是否恢复正常。原因三配置了错误的server.watch.ignored。如果你为了忽略某些文件夹比如node_modules配置了宽泛的忽略规则可能会把某些重要目录误伤。例如把ignored: [**/src/**]当作忽略规则写进去必然导致没有任何文件被监听。正常应该这样的粒度server: { watch: { ignored: [**/node_modules/**, **/dist/**, **/.git/**, **/coverage/**] } }原因四缓存数据损坏。Vite 在node_modules/.vite下面维护了一份依赖预构建缓存如果依赖版本升级或者 node_modules 发生变化这份缓存可能失真。遇到玄学热更新问题时优先尝试清缓存重启rm -rf node_modules/.vite npm run devWindows 环境用rmdir /s /q node_modules\.vite npm run dev4.2 构建时内存溢出JavaScript heap out of memory的兜底方案这个问题在前面已经提到了完整解决方案我在这里再补充一些背景知识。V8 引擎默认内存上限大约在 1.4GB 到 1.7GB 之间取决于 Node 版本和操作系统位数。项目大、依赖多的时候Rollup 在打包阶段会一次性把模块图加载到内存里很容易触顶。除了直接调高 Node 的内存之外还有一个优化手段是从根源上减少内存占用把build.rollupOptions里的output.inlineDynamicImports设置为false默认就是 false并合理使用manualChunks。当你把大依赖拆分成多个 chunk 时Rollup 就不需要把全部模块信息堆在同一个内存上下文里处理内存压力会显著下降。给一个实用判断如果你的项目在 64 位系统的 Node 18 下依然出现heap out of memory多半不是内存不够而是存在循环依赖或者某个模块被打包进了同一个超大的 chunk。使用manualChunks做完拆分内存问题通常就消失了这时候就不必再纠结要不要加--max-old-space-size。4.3 改了配置文件却没有生效Vite 的缓存机制与配置响应很多人在优化配置项后发现构建结果还是老样子。这里有一个关键点vite.config.js 的修改会自动重启 dev server但optimizeDeps的预构建结果不会自动失效。也就是说你改了optimizeDeps.exclude或optimizeDeps.include之后最好重启 dev server 并手动删除node_modules/.vite缓存目录否则可能出现配置明明改了但行为不变的情况。生产构建vite build也同样有缓存依赖。有些 CI 流水线在构建机上保留上次的缓存目录如果你不想让构建受旧缓存影响可以在脚本里先执行清理rm -rf dist node_modules/.vite npm run build4.4 网络热词里的 “node_options 不是内部或外部命令” 究竟是什么最后把热搜词里那条有点长的内容拆解一下。在 Windows 环境变量中“不是内部或外部命令”是 CMD 解析器找不到命令时的经典报错。出现它的原因通常是你在配置命令时把环境变量和命令的写法与 Unix 语法混用了。比如在 macOS 或 Linux 中可以执行NODE_OPTIONS--max-old-space-size4096 vite build但在 Windows CMD 中会报错因为 CMD 不支持这种“变量值 命令”的写法。正确跨平台方案是使用cross-env来设置环境变量npm install -D cross-env然后在 package.json 里这样配置{ scripts: { build: cross-env NODE_OPTIONS--max-old-space-size4096 vite build } }或者像我前面说的那样直接把 Node 二进制路径和 Vite 入口写完{ scripts: { build: node --max-old-space-size4096 node_modules/vite/bin/vite.js build } }这两者的区别在于cross-env方式是设置环境变量让 vite 子进程读取而node --max-old-space-size方式则是直接调高当前 Node 进程的内存上限。后者在我看来更直观也少装一个依赖。但如果有些用户还需要在构建脚本里读取NODE_OPTIONS环境变量比如部分 Node 原生模块会使用它那优先用cross-env。4.5 调试 Vite 构建产物sourcemap 的正确打开姿势前面提到sourcemap: hidden适合生产环境。但调试 Vite 构建产物时很多人有个误区生产环境的崩溃堆栈指向的都是打包后的压缩代码根本看不出业务逻辑。没有 sourcemap 的情况下你只能靠错误信息里的行列号在压缩文件里猜。这个体验极差。正确的调试步骤是本地构建时在.env.production里或构建命令里打开VITE_SOURCEMAPtrue然后在 vite.config.js 里用loadEnv读取决定是否开启 sourcemap。用sourcemap: true做一次完整构建把生成的.map文件和产物一起部署到测试环境千万不要暴露到公网生产服务器。需要排查某一行报错时在浏览器 DevTools 的 Sources 面板里手动添加.map文件关联。从我的个人经验谈 sourcemap 应用我认为完整的调试还是要在非生产环境做比如测试或预发布环境这些环境你是可以完整使用 sourcemap 而不担心暴露源码的。真正的问题场景是用户在生产环境报错你想通过错误堆栈对照源码定位——这种场景下把 sourcemap 上传到你自己的监控平台比如 Sentry比把.map文件部署到公网 CDN 要安全得多。5. 从开发调试步骤的角度看配置一个可复现的优化路线我做工程优化历来遵循“从粗到细、逐层收敛”的路线Vite 配置优化也一样。这里梳理一份可以直接照着执行的步骤清单适合已有一个能跑起来的项目、但构建性能和开发体验都不太满意的场景。第一步摸底先跑npm run build记录当前构建耗时和产物体积分布。如果没有可视化插件先用rollup-plugin-visualizer生成报告记录最大那几个依赖的名称和体积。这一步的核心目的是“量化问题才能判断优化效果”。第二步按路由拆包逐一检查路由表确保每个页面组件都用动态import()加载。这一步的成本最低、收益最稳定。项目越大收益越明显。审查时尤其注意那些“从路由里引入但组件内部又静态 import 了另一个页面”的隐藏全量依赖。第三步大库按需引入对 Element Plus、Ant Design Vue、ECharts 这类大型 UI/图表库按需引入或按需注册。操作完手动删掉全量样式引入否则按需引入的成果会被一条import element-plus/dist/index.css毁掉。如果你在开发环境对模板语言还不熟可以先用unplugin-vue-components的自动导入方案过渡然后同步清理 main.js 里的全局 use。第四步配置手动分包基于摸底数据把所有体积超过 100KB 的依赖逐一决定归属基础派保留在vendor-vue或作为独立 chunk。小工具库比如 dayjs、lodash-es不需要单独分。这一步要反复跑 build 查看 chunk 尺寸和数量之间的平衡。第五步验证产物体积与线上访问速度在生产服务器上按 grad 标准测试首屏耗时直接用 LightHouse 或 DevTools 的 Network 面板查看首批请求个数、总字节数、以及 gzip 前后体积比。任何优化都是冲着“用户可感知的访问速度改善”去的如果业务场景本身是内网低延迟环境那体积优化效果就不是首要关注点了。第六步把开发和构建环境彻底分离开发环境关注的是热更新速度和调试便利度生产构建关注的是体积和缓存策略用.env.development和.env.production分开管理变量。比如开发环境可以开 sourcemap也可以不做代码压缩但生产环境这些都要调整。Vite 里用loadEnv读取环境变量的常见写法如下import { defineConfig, loadEnv } from vite export default defineConfig(({ command, mode }) { const env loadEnv(mode, process.cwd(), ) const isBuild command build return { build: { sourcemap: env.VITE_SOURCEMAP true, minify: isBuild ? esbuild : false } } })command在 dev 时为servebuild 时为build。通过这个字段可以精确控制开发和生产环境下不同配置生效而不是人为去改两套配置。灵活应对整体就清晰多了。6. 关于 Vite 5/6 的若干新增配置与新坑如果你使用的是 Vite 5 或更高版本有几个新的配置变化值得补一下。比如 Vite 5 把默认的构建目标从modules改成了baseline-widely-available这意味着它不会再对某些非常老的浏览器做过度的转译或 polyfill。如果你的用户群还在使用旧 Edge非 Chromium 内核或者 iOS 14 以下版本你可能需要显式指定build.targetbuild: { target: es2015 }但请注意显式降低 target 会导致产物多出很多转换代码体积上去。这是一种兼容性和性能的取舍没有标准答案需要你对自己的用户分布有清晰认知灵活调整。另外一个变化是 Vite 里对 CSS 代码分割行为做了调整。低版本里所有 CSS 都会提取到一个单独的文件但新版会基于异步 chunk 分割 CSS。如果你的部署环境对 CSS 文件的引用顺序有严格要求一些老旧的微前端方案会有这个限制请留意构建后的 CSS 文件名和引入方式。在实际工作中我还遇到过 Vite 5 要求 Node.js 版本为 18.0 以上某些公司内部老服务器上 Node 版本竟然还停留在 14导致npm install直接失败。这个属于环境兼容性问题需要在项目package.json中声明 engines 字段{ engines: { node: 18.0.0 } }7. 回到我实际使用过程中的几点体会配置 Vite 时最常见的两个方向一个是把 dev server 和构建器结合起来理解另一个是理解“页面级动态 import 是 Vite 最基础的优化抓手”。关于热更新问题我有一次尝试极简配置排查问题时一边用 vs code 的终端一边用 cmd 窗口观察原生 node 服务耗时一整个下午才发现问题出在代码里对全局对象的某个赋值。这里提醒一句在你怀疑是 Vite 自身的问题之前先检查自己写的“非 HMR 友好代码”比如直接把事件绑定在 body、或者对document.title做非响应式修改这类操作。Vite 的 HMR 只对模块更新负责如果模块自身在更新后有状态残留它无能为力。构建优化的核心逻辑其实很简单让浏览器只加载当前页面真正需要的代码并且把长期不变的代码和频繁变化的业务代码尽量隔离让缓存发挥最大价值。Vite 并不神秘vite.config 也不是越复杂越好。真正的高手会用最少的配置解决最痛的问题剩下的交给框架和你对业务的理解。
返回列表