Tôi từng chứng kiến một contributor cốt cán của đội ngũ Next.js mở một issue - mà xét kỹ thì hoàn toàn vô hại và chẳng ưu tiên gì cả. Anh ta tự viết code, rồi tự đẩy nó thành pull request thật nhanh. Không phải vì bug đó cấp bách, mà đơn giản vì anh ta được trả lương để làm việc đó. Tôi không tiện chỉ đích danh issue nào, nhưng chỉ cần bỏ ra một buổi chiều lang thang trong repo Next.js, bạn sẽ tự nhận ra kiểu mẫu này ngay.
Bug tồn đọng tính bằng hàng trăm. Pull request đổ về mỗi ngày. Vậy mà những vấn đề thực sự ảnh hưởng đến dự án thật lại được xử lý chậm đến khó hiểu.
1. SSR và ISR: một ý tưởng đơn giản mà xuất sắc
Tôi đã dùng Next.js suốt nhiều năm trời, và phải công bằng mà nói: xét riêng về server-side rendering, đây là một framework thực sự tốt. SSR (server-side rendering) và ISR (incremental static regeneration) giải quyết một bài toán có thật - buồn cười là phần lớn lập trình viên tôi quen vẫn không phân biệt nổi hai khái niệm này, chứ đừng nói đến việc chọn đúng cái nào cho đúng bài toán của mình.
Về bản chất, ý tưởng rất đơn giản: gộp nội dung tĩnh với dữ liệu động lấy từ API hoặc database, đóng gói tất cả vào trang mà trình duyệt nhận được, để server xử lý một lần thay vì bắt từng client tự làm lại việc đó. Đơn giản. Hiệu quả. Nó vận hành trơn tru.
2. “Quái vật” monolith mà chẳng ai yêu cầu
Sự đơn giản đó không sống sót nổi trước tham vọng của các công ty lớn đứng sau dự án.
Từng chút một, Next.js bắt đầu lấn sân sang địa hạt vốn thuộc về backend. Tích hợp database được gắn thẳng vào framework. Các plugin cho xác thực (auth), caching, lấy dữ liệu được đóng gói thành một phần của chính framework, thay vì là những thành phần tách rời, tùy chọn như trước.
Một khái niệm sinh ra để tách bạch mọi thứ (decouple) - giữ frontend và backend độc lập, giữ từng tầng đủ nhỏ để dễ kiểm soát, phù hợp với kiến trúc microservices - giờ đây đang âm thầm đi ngược lại chính nó: trở thành một monolith muốn ôm trọn cả stack của bạn. Đó không phải là tiến bộ. Đó là phình to phạm vi (scope creep) được khoác lên một lớp marketing đẹp đẽ.
3. Nỗi ám ảnh mang tên “nâng cấp phiên bản”
Nếu bạn từng maintain một dự án Next.js thật sự qua vài lần major version, hẳn bạn hiểu chính xác tôi đang nói gì. Không gì mô tả framework fatigue (mệt mỏi vì framework) rõ hơn việc một lần nâng cấp tưởng chừng bình thường lại âm thầm phá vỡ build, routing, cách lấy dữ liệu, và cả đống plugin bên thứ ba - cùng một lúc.
4. Cộng đồng đang lên tiếng - và họ không hề sai
Đây không chỉ là cảm nhận cá nhân của tôi. Một thread trên Reddit gần đây - “Framework panic: why is everyone leaving Next.js?” - gây tiếng vang không phải ngẫu nhiên. Những lập trình viên dày dạn kinh nghiệm đang rời đi, từng đội nhóm một. Trong khi đó, danh tiếng của framework này vẫn kéo về một lượng lớn người mới - những người chưa từng va phải bức tường nâng cấp - khiến hệ sinh thái nhìn từ xa vẫn có vẻ khỏe mạnh.
Khoảng cách đó đáng để dừng lại suy ngẫm. Khi những người thực sự triển khai và duy trì Next.js trong môi trường production bắt đầu rời đi, còn người thay thế họ phần lớn là các lập trình viên mới bị thu hút bởi độ nổi tiếng, đó là một tín hiệu đáng lắng nghe - chứ không phải để phớt lờ.
Vậy mà, các nhà tuyển dụng vẫn đang săn lùng lập trình viên Next.js, thậm chí trả lương rất cao. Nghe quen không? Đó chính xác là kịch bản mà PHP hay .NET từng trải qua: bị chính những người hiểu rõ nó nhất “ghẻ lạnh”, nhưng vẫn có nhu cầu tuyển dụng cao vì phần lớn internet vẫn đang chạy trên nó.
5. Đây có phải là một bài viết công kích Next.js?
Thành thật mà nói, tôi không nghĩ vậy. Tôi từng rất yêu framework này. Lần cuối tôi chạy lệnh yarn add next là cách đây hai năm, và tôi nói điều đó không phải để tự hào - mà vì framework tôi từng say mê không còn là cái đang được vận hành hôm nay.
6. Kỷ nguyên AI không cần một monolith
Đây là phần quan trọng nhất cho tương lai sắp tới: cách chúng ta xây dựng website đang thay đổi rất nhanh, và AI chính là một trong những lý do lớn nhất. Các công cụ và quy trình phù hợp với một hướng phát triển AI-driven (do AI dẫn dắt) đều ưu tiên những thành phần nhỏ, dễ ghép nối (composable) và tách biệt rõ ràng - chứ không phải một framework cố ôm đồm vừa làm router, vừa làm tầng database, vừa làm nhà cung cấp xác thực, vừa làm nền tảng triển khai cùng lúc.
Next.js lại đang đi theo hướng ngược lại, ngày càng lún sâu vào địa hạt monolith, đúng vào lúc phần còn lại của hệ sinh thái đang tiến về những khối xây dựng nhỏ gọn, độc lập hơn. Sự lệch pha đó chính là lý do vì sao rất nhiều lập trình viên kỳ cựu đang âm thầm - hoặc không còn âm thầm nữa - rời đi.



