Vibe Tutorial
无服务器部署与 CI CD 自动化

11.5 构建优化排查

Tip

本地开发是"宽容"的慈母,线上构建是"严苛"的教官。


1. 为什么要学这个?

典型惨案: 你在本地 npm run dev 跑得飞起,功能一切正常。 一推到 Vercel,构建失败 (Build Failed)。 你对着红色的报错日志发呆,不知道为什么"同样的代码"会有两副面孔。 原因:本地为了让你开发爽,隐藏了很多隐患(如类型错误、大小写问题)。Vercel 的 Linux 构建环境则是零容忍的。


2. 核心概念:Strict Mode (严格模式)

CI/CD 环境默认执行最严格的检查:

  1. TypeScript Check: 所有类型必须正确,不能有 any (除非配置推翻)。
  2. ESLint Check: 代码风格必须符合规则。
  3. Case Sensitivity: Linux 区分文件名大小写,而 Windows/Mac 不区分。

3. 常见报错与解法

1. The Case Sensitive Ghost (大小写幽灵)

  • 现象Module not found: Can't resolve './header'
  • 原因
    • 文件名叫 Header.tsx
    • 代码里写 import Header from './header'
    • Windows/Mac 觉得没问题 (忽略大小写)。
    • Vercel (Linux) 觉得这是两个文件,直接报错。
  • 解法git mv header.tsx Header.tsx (或者统一全小写)。

2. TypeScript Error

  • 现象Property 'id' does not exist on type 'User'
  • 原因:本地 dev 模式可能只是警告,build 模式是报错。
  • 解法永远不要掩耳盗铃。不要用 // @ts-ignore,老老实实定义 Interface。

3. Build Timeout (构建超时)

  • 现象Command exited with signal "SIGKILL"
  • 原因:内存爆了,或者死循环。常见于生成了几千个静态页面 (SSG)。
  • 解法:检查 generateStaticParams 是否返回了太多数据。

4. 解决方案 (HOW)

本地模拟构建

永远不要依赖 Vercel 来发现低级错误。 在 push 之前,请在本地运行一次 "准生产环境" 构建:

# 这行命令会暴露所有隐患
npm run build

如果本地能过,Vercel 99% 也能过。如果你本地都报错,就别去浪费 Vercel 的构建时长了。

排查流程图

graph TD
    Build["开始构建"] --> Install["npm install"]
    Install --> Check{"依赖安装成功?"}
    
    Check -- No --> Fail["报错: Module not found"]
    Check -- Yes --> TS["TypeScript 检查"]
    
    TS -- Error --> FailTS["报错: Type Error"]
    TS -- Pass --> Lint["ESLint 检查"]
    
    Lint -- Error --> FailLint["报错: Lint Error"]
    Lint -- Pass --> Compile["Next.js 编译"]
    
    Compile --> Success["构建成功"]
    
    style Fail fill:#ffcdd2,stroke:#c62828
    style FailTS fill:#ffcdd2,stroke:#c62828
    style FailLint fill:#ffcdd2,stroke:#c62828
    style Success fill:#c8e6c9,stroke:#2e7d32

5. 真实案例

Story

"Works on My Machine" (在我的机器上是好的)

一个刚转前端的工程师被 Vercel 折磨了一整天。 他的组件文件夹叫 Components (首字母大写),但他代码里引用的是 import btn from '@/components/Btn' (小写)。 在他的 Mac 上,一切正常。 但每次推送到 Vercel,都提示找不到文件。 他甚至怀疑是 Vercel 的 Bug,给客服发了工单。 客服只回了一句话:"Linux filesystem is case-sensitive."

Vibe 心法: 敬畏操作系统之间的差异。 养成全小写 (kebab-case) 的文件名习惯(如 user-profile.tsx),是避开跨平台幽灵的最好护身符。


6. 本章小结

  1. Pre-commit:本地先 npm run build,通过了再 push。
  2. 文件名规范:统一全小写,杜绝大小写问题。
  3. 直面红色:IDE 的红色波浪线不是为了烦你,是为了救你。