本次优化专注于提升开发环境(npm run dev:h5)的构建速度,通过两个核心优化,预计可提升 60-90% 的构建速度。
文件: config/dev.ts
修改内容:
// 优化前
sourceMapType: 'eval-source-map',
// 优化后
sourceMapType: 'cheap-module-source-map',
效果:
原理:
eval-source-map:最慢但最详细,包含行号、列号、源码映射cheap-module-source-map:快很多,只包含行号和源码映射(够用了)文件: config/index.ts
修改内容:
// 优化前:无论开发还是生产环境都编译 node_modules
chain.module
.rule('force-es5')
.test(/\.(js|mjs)$/)
.include.add([
/node_modules[\\\/]@cornerstonejs/, // 巨大的医学影像库
/node_modules[\\\/]antd-mobile/,
// ...
])
// 优化后:只在生产环境编译 node_modules
if (process.env.NODE_ENV === 'production') {
chain.module
.rule('force-es5')
// ... 同样的配置
}
效果:
影响的包:
@cornerstonejs/* - 医学影像核心库(非常大)antd-mobile、@ant-design/* - UI 库ahooks、lodash-es、dayjs、react-query基于两个核心优化,预计构建时间对比:
| 场景 | 优化前 | 优化后 | 提升幅度 |
|---|---|---|---|
| 首次编译 | 60-90s | 20-40s | 50-70% ⚡ |
| 增量编译 | 10-15s | 3-6s | 60-70% ⚡ |
注意: 具体效果取决于你的机器配置和项目大小。
为了公平对比,建议先清理缓存:
npm run clean:cache
npm run dev:h5
你将看到详细的构建时间报告:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔨 [构建 #1] 首次编译开始... 22:15:30
✅ [构建 #1] 编译完成! 22:16:00
⏱️ 耗时: 30.50s (30500ms) 👈 注意这个时间
📊 模块数: 1234
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
修改任意文件(如 src/app.tsx),添加一个空格或注释,保存后观察:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔨 [构建 #2] 增量编译开始... 22:16:30
✅ [构建 #2] 编译完成! 22:16:33
⏱️ 耗时: 3.20s (3200ms) 👈 应该明显更快了
📊 模块数: 1234
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
使用这个模板记录优化前后的对比:
优化效果记录
测试日期:2025-12-28
首次编译:
- 优化前:____ s
- 优化后:____ s
- 提升:____ %
增量编译:
- 优化前:____ s
- 优化后:____ s
- 提升:____ %
状态: ✅ 已安装,❌ 未配置
原因:
如果需要启用:
在 config/dev.ts 的 webpackChain 中添加:
webpackChain(chain, webpack) {
// ⚡ 启用 thread-loader 并行编译(可选)
chain.module
.rule('compile')
.test(/\.(tsx?|jsx?)$/)
.use('thread-loader')
.loader('thread-loader')
.options({
workers: 2, // 使用 2 个工作进程
workerParallelJobs: 50,
poolTimeout: 2000,
});
// ... 其他配置
}
预计提升: 额外 10-20%
风险:
| 类型 | 构建速度 | 重建速度 | 调试质量 | 推荐场景 |
|---|---|---|---|---|
eval-source-map |
❌ 最慢 | ⚠️ 慢 | ⭐⭐⭐⭐⭐ 最详细 | 复杂调试场景 |
cheap-module-source-map |
⚡ 快 | ⚡⚡ 很快 | ⭐⭐⭐⭐ 足够用 | 日常开发(推荐) |
eval-cheap-module-source-map |
⚡⚡ 很快 | ⚡⚡⚡ 最快 | ⭐⭐⭐ 基本够用 | 大型项目 |
false |
⚡⚡⚡ 最快 | ⚡⚡⚡ 最快 | ❌ 无法调试 | 不推荐 |
我们选择了 cheap-module-source-map,因为它在速度和调试体验之间取得了最佳平衡。
编译的包:
/node_modules[\\\/]@cornerstonejs/, // ~15MB,编译耗时 5-10s
/node_modules[\\\/]antd-mobile/, // ~8MB,编译耗时 3-5s
/node_modules[\\\/]@ant-design/, // ~5MB,编译耗时 2-3s
/node_modules[\\\/]ahooks/, // ~2MB,编译耗时 1-2s
/node_modules[\\\/]lodash-es/, // ~2MB,编译耗时 1-2s
/node_modules[\\\/]dayjs/, // ~1MB,编译耗时 0.5-1s
/node_modules[\\\/]react-query/, // ~1MB,编译耗时 0.5-1s
总节省时间: 约 13-24 秒/次编译
开发环境:
生产环境:
调试变化:
如果你需要最精确的调试:
可以临时改回 eval-source-map:
// config/dev.ts
sourceMapType: 'eval-source-map', // 临时改回,调试完再改回来
确保缓存生效:
node_modules/.cache/webpack-h5)npm run clean:cache可能原因:
解决方案:
# 1. 停止当前的开发服务器(Ctrl+C)
# 2. 清理缓存
npm run clean:cache
# 3. 重新启动
npm run dev:h5
症状:
控制台出现类似 Unexpected token 的错误
原因: 某些 node_modules 包使用了现代 JS 语法,但浏览器不支持
解决方案:
在 config/index.ts 的 force-es5 规则中添加该包(即使在开发环境也编译):
// config/index.ts
// 如果开发环境也需要编译某些包
if (process.env.NODE_ENV === 'production' || true) { // 改为 || true
chain.module
.rule('force-es5')
// ...
}
解决方案: 临时改回更详细的 source map:
// config/dev.ts
sourceMapType: 'eval-source-map', // 或 'source-map'
调试完成后再改回 cheap-module-source-map。
如果生产环境构建也很慢,可以考虑:
优化日期: 2025-12-28
版本: v1.0.0
优化项: 2 个核心优化(Source Map + 跳过 node_modules 编译)
预计提升: 60-90%