Next.js 构建突然卡壳?这 4 个原因最常见

作者: Trove Deck Solution 发布: 2026-05-09 阅读时长: 7 分钟

凌晨 2 点,周五。你的 Next.js 构建——上周还要 45 秒——现在要 8 分钟。CI/CD 管道在烧时间,测试环境部署卡住了,你睡不着觉试图弄清楚为什么。昨天还好好的。

这正是”上周还能用”变成你最讨厌听到的话的那一刻。

构建变慢不是罕见现象——它是代码库增长的必然。但它也是可以解决的。下面是四个常见元凶和对应的杀招。

四大构建杀手

1. 你不知道自己加的依赖

Next.js 的构建速度完全取决于最重的那个依赖包。一个看似无害的”助手库”引入 lodash、moment.js 或臃肿的图表库,就能让构建时间暴增 30–60 秒。更糟的是:如果新依赖出现在 node_modules 里,webpack 会处理它——无论你是否真的用它。

查看依赖树:

npm list --depth=0

找出重复的包。如果看到 npm WARN 警告同一个包有多个版本,webpack 就会处理两次代码。这是每次构建都在浪费 CPU 时间。

2. 内存耗尽

Node.js 默认堆内存限制约 2.2 GB。随着代码库增长,构建过程需要内存来做源码解析、AST 转换、树形摇动分析和代码分割。一旦超出限制,Node 就会进入疯狂的垃圾回收模式,一切都变慢。

构建日志里会显示长时间的无输出暂停,或者出现”JavaScript heap out of memory”错误。

3. 缓存污染

Next.js 在 .next/ 文件夹里缓存构建产物。被污染或陈旧的缓存会拖累每一次后续构建。一个遗留的大图片、字体或编译块会迫使 Next.js 重新验证和重建不该动的东西。数个月积累的构建数据 = 每次构建浪费的秒数。

4. Webpack 配置漂移

如果你自定义了 next.config.js(自定义加载器、插件、优化规则),任何配置错误都会级联放大。一个本该只作用于部分文件的加载器反而作用于所有文件,或者插件重复运行不必要的转换,每个文件都会多花秒数。有 500+ 个组件文件的话,秒数会翻倍。

5 分钟诊断清单

按顺序运行下列检查:

  1. 检查构建时间变化:对比今天的构建时间和上周的日志。如果超出 50%,说明最近加了什么东西。

  2. 测试无缓存构建rm -rf .next && npm run build。如果无缓存版本仍然要 8 分钟,问题在你的代码或依赖,不是缓存。

  3. 内存分析node --max-old-space-size=4096 node_modules/.bin/next build。分配 4 GB 内存重试。如果突然 90 秒完成,说明 Node 内存饥饿。

  4. 检查新包git log --oneline -20 | grep -i package。看过去几天有没有人加依赖。

  5. 检查缓存ls -lh .next/。超过 100 MB 的文件需要怀疑。.next/ 整个文件夹不应超过 500 MB。

立竿见影的修复

立即 (接下来 10 分钟): - 清空缓存:rm -rf .next && npm run build - 增加 Node 堆内存:在 package.json 的构建脚本里加 --max-old-space-size=4096 - 杀掉后台进程:确保 IDE、Docker 或其他应用没有占用资源

本次构建 (接下来 30 分钟): - 删除未使用的包:npm prune 并审查 package.json 里的冗余 - 合并重复的包:如果有同一个库的两个版本,合并成一个 - 注释掉实验性配置:查看 next.config.js 里有没有作为”试试看”加的自定义加载器或插件

本周 (预防): - 设置构建时间监控:设定阈值(比如超过 3 分钟就失败)。CI/CD 会在问题爆发前告诉你 - 使用动态导入:把重型组件改成 next/dynamic 并用 lazy 加载 - 启用 SWC 压缩:确保 next.config.js 里有 swcMinify: true。它比 Terser 快得多

防止下次发生

  1. 锁定依赖版本:在 CI/CD 里用 npm ci。在 package.json 里用精确版本号,不要用 ^1.2.3 这样的范围
  2. 加 pre-commit 钩子:用 husky 拒绝未审查的新包
  3. 监控构建时间:提交 build-stats.json 来追踪趋势。单个 PR 导致 30% 的回归就得调查
  4. 本地测试构建:推送前运行 npm run build。对你慢的,对 CI 也慢

慢构建的真实代价

慢构建不仅烦人——它会复利: - 部署阻塞:8 分钟构建意味着测试环境每 30 分钟才能更新一次,而不是 5 分钟 - 开发停滞:工程师等待时不能做其他事 - CI/CD 爆炸:20 个工程师 × 每次多花 5 分钟 = 每天团队浪费 ~1.5 小时

对于按期限交付的团队来说,这转化成延期和成本。

如果你在扩展自定义软件并想跳过”诡异卡顿”阶段,Trove Deck Solution 在技术评估阶段会对构建管道进行完整审查。我们在 2 点的危机发生前就把这些瓶颈找出来。预防比救火便宜得多。

#NextJS#WebDevelopment#DevOps#BuildOptimization#SaaS#IndieHackers#TechDebugging#PerformanceTips