解决 Next.js build 完成后卡住的问题

解决 Next.js build 完成后卡住的问题

💡 原文中文,约1700字,阅读约需5分钟。
📝

内容提要

Next.js构建完成后卡住,原因是Telemetry被防火墙阻断。通过strace和ss命令发现,构建时尝试连接Vercel服务器,但网络被阻断。解决方法:执行`npx next telemetry disable`关闭Telemetry,或使用全局代理。文章还建议Vercel为Telemetry添加超时机制。

🔎

延伸解读

问题定位思路

作者通过 strace 观察系统调用,发现构建卡在 epoll_pwait 上,这通常与网络等待有关。随后用 ss 命令看到大量到 Vercel IP 段的 TCP 连接,从而锁定是 Telemetry 上报被防火墙阻断。这种从现象到系统调用再到网络连接的分析方法,对排查类似“构建完成但进程不退出”的问题很有参考价值。

Telemetry 与网络环境

Next.js 默认开启 Telemetry,会在构建时向 Vercel 服务器发送数据。在中国大陆等网络受限环境下,连接可能被阻断,导致进程挂起。作者指出 HTTP_PROXY 和 HTTPS_PROXY 环境变量对 Next.js 无效,需要全局代理(如 TUN 或 WireGuard)才能解决。这提醒开发者,在受限网络中使用 Next.js 时,应提前关闭 Telemetry 或配置全局网络。

实用建议与局限

最简单的解决方法是执行 `npx next telemetry disable` 关闭 Telemetry。但作者也指出,Vercel 官方应给 Telemetry 添加超时机制,以避免类似问题。文章未提及关闭 Telemetry 对功能的影响,但通常仅影响匿名数据收集,不影响构建结果。对于无法关闭或需要保留 Telemetry 的场景,全局代理是备选方案。

Q&A

Next.js build 完成后卡住是什么原因?

原因是 Next.js 的 Telemetry 在构建完成后尝试连接 Vercel 服务器,但网络被防火墙阻断,导致进程一直等待网络响应而卡住。

如何解决 Next.js build 完成后卡住的问题?

执行 `npx next telemetry disable` 关闭 Next.js 的 Telemetry,或者使用全局代理(如 TUN 或 WireGuard)来绕过网络阻断。

如何诊断 Next.js build 卡住的问题?

可以使用 `strace npx next build` 查看系统调用,发现卡在 `epoll_pwait` 上,表明是网络问题;再用 `ss -tn` 查看 TCP 连接,发现大量连接到 Vercel IP 段的连接,从而定位到 Telemetry 的网络请求被阻断。

为什么 HTTP_PROXY 和 HTTPS_PROXY 环境变量对 Next.js 无效?

文章提到 HTTP_PROXY 和 HTTPS_PROXY 似乎对 Next.js 无效,因此需要借助 TUN 或 WireGuard 等全局联网方式才能解决网络阻断问题。

Next.js Telemetry 是什么?

Next.js Telemetry 是 Next.js 内置的遥测功能,用于收集使用数据并发送给 Vercel,但在网络受限的环境中可能导致构建卡住。

Vercel 应该采取什么措施来避免此类问题?

文章建议 Vercel 为 Telemetry 添加超时机制,以避免网络不可达时导致构建进程无限期等待。

🏷️

标签

➡️

继续阅读