Chia thời gian build thành ba phần rồi đo từng phần: compile, type check + lint, prerender các trang tĩnh. Log của next build cho biết phần nào lâu.
1. Prerender là thủ phạm phổ biến nhất. generateStaticParams trả về 20.000 slug nghĩa là build phải render 20.000 trang, mỗi trang một truy vấn. Cách xử lý:
export async function generateStaticParams() {
return getTopProducts(500) // chỉ build sẵn trang có lưu lượng
}
export const dynamicParams = true // phần còn lại render lần đầu có người vào rồi cacheĐây là ISR theo yêu cầu: 500 trang lúc build, phần đuôi dài sinh dần.
2. Cache của CI không được tái sử dụng. Thiếu cache .next/cache thì mỗi lần build lại làm từ đầu. Trên GitHub Actions cần cache cả thư mục store của pnpm lẫn .next/cache.
3. Type check chạy trong build. tsc trên codebase lớn tốn vài phút. Tách nó ra job song song và đặt typescript.ignoreBuildErrors — chỉ hợp lý khi CI vẫn chặn merge nếu job type check hỏng; nếu không thì lỗi type sẽ lọt lên production.
4. Compile. Turbopack cho next build nhanh hơn đáng kể so với webpack trên dự án lớn. Ngoài ra rà lại optimizePackageImports và các barrel file lớn — chúng làm module graph phồng lên và ảnh hưởng cả build lẫn dev.
5. Nhiều dữ liệu lấy lúc build. Gộp truy vấn theo lô thay vì gọi tuần tự từng trang, và dùng lại kết nối database thay vì mở mới mỗi lần render.