Cứu Net.js: Phát hiện và Sửa lỗi Revalidation "Khó Chiều" Khiến Dữ Liệu Bị "Ôi Thiu"!
Lê Lân
0
Giải Quyết Vấn Đề Cache Và Revalidation Trong Next.js: Kinh Nghiệm Từ FounderSignal
Mở Đầu
Khi xây dựng FounderSignal, một nền tảng xác thực ý tưởng khởi nghiệp, tôi đã gặp phải một vấn đề rất tinh vi nhưng cực kỳ quan trọng liên quan đến cơ chế fetch revalidation của Next.js mà mọi lập trình viên nên biết.
Trong bài viết này, bạn sẽ được theo dõi quá trình phát hiện lỗi, cách khắc phục, cùng những bài học kinh nghiệm quý giá. Chúng ta sẽ tìm hiểu tại sao việc cấu hình thời gian tái xác thực quá dài, thậm chí là vô hạn trong Next.js lại dẫn đến các lỗi cache nguy hiểm, cũng như cách thiết lập lại để đảm bảo hiệu suất và tính ổn định của ứng dụng.
Vấn Đề Ban Đầu: Dữ Liệu Lỗi Thời Gian, Header Lạ
Trong dự án, mục tiêu là cache API response lâu dài, tối ưu nhất là lên đến một năm, bằng cách sử dụng tùy chọn revalidation của Next.js như sau:
next: { revalidate: 31536000 }, // 1 năm tính bằng giây
});
Mọi thứ hoạt động tốt khi chạy ở môi trường local và trong lần deploy đầu tiên.
Tuy nhiên, sau khi tải lại trang trên Vercel, kết quả nhận được là:
content-type: text/xml
content-length: 0
Không có dữ liệu JSON nào được trả về mặc dù API vẫn trả dữ liệu chính xác.
Hành Trình Debugging
Kiểm Tra API
Đầu tiên, tôi nghi ngờ về phía API:
Kiểm tra log
Test trực tiếp endpoint
Xác nhận API trả đúng dữ liệu và header JSON
Vấn Đề Ở Next.js Và Vercel
Tuy nhiên, ứng dụng Next.js được triển khai lại trả về response rỗng với header sai, dẫn đến nghi ngờ tầng cache hoặc cách Next.js xử lý revalidation trên Vercel.
Điều quan trọng: Không nên chỉ tập trung vào API, vì framework cũng có thể gây ra lỗi cache.
Thủ Phạm: Đặt Thời Gian Revalidate Quá Dài Hoặc Vô Hạn
Sau nhiều giờ tìm kiếm nguyên nhân, tôi phát hiện ra:
Đặt revalidate: 31536000 (tương đương 1 năm) hoặc Infinity khiến server Next.js trên Vercel phục vụ bản cache hỏng sau lần fetch đầu tiên.
Cách này cho phép kiểm soát chính xác hơn khi nào cache được làm mới mà không phải dựa vào revalidate thời gian cố định.
Kết Luận
Caching và revalidation trong Next.js là những tính năng mạnh mẽ giúp tăng hiệu suất ứng dụng, giảm thiểu tài nguyên sử dụng. Tuy nhiên, nếu không cấu hình chính xác, đặc biệt là về thời gian revalidate, bạn có thể gặp phải các lỗi cache rất tinh vi như dữ liệu không cập nhật, header sai, hoặc phản hồi rỗng.
Với kinh nghiệm xây dựng FounderSignal, tôi khuyến nghị bạn:
Luôn kiểm thử cơ chế cache trên môi trường thực tế (như Vercel).
Tránh dùng thời gian revalidate quá dài hoặc Infinity.
Áp dụng tag-based revalidation khi muốn kiểm soát theo sự kiện thay vì thời gian.
Chúc bạn xây dựng ứng dụng Next.js hiệu quả và đừng ngần ngại chia sẻ bài học bạn rút ra!