Nextjs – Migrate pages router sang app router

4 min read

Để nâng cao khả năng định tuyến và sự linh hoạt, tận dụng các tính năng mới cho phép xây dựng ứng dụng hiệu quả, có khả năng mở rộng tốt hơn và đặc biệt là cấu trúc gọn gàng, dễ đọc hiểu hơn.

1. Upgrading

  • Để sẵn sàng cho việc migrate từ Page router sang App router, cần ít nhất phiên bản node v18.17.
  • Tiếp đến cần phải cập nhật Nextjs version lên phiên bản >=13. Chạy câu lệnh sau:
    • npm install next@latest react@latest react-dom@latest
  • Sau khi đã update phiên bản Nextjs, bạn vẫn có thể tiếp tục sử dụng page router nếu cần

2. Migrating

  • Việc chuyển sang App Router có thể sẽ là lần đầu tiên bạn sử dụng những tính năng của React mà Next.js được xây dựng dựa trên đó, chẳng hạn như Server Components, Suspense, và nhiều tính năng khác. Khi kết hợp với các tính năng mới của Next.js như các file đặc biệtlayouts, quá trình migration sẽ bao gồm nhiều khái niệm, mô hình tư duy, và thay đổi hành vi mới cần học.
  • Chúng ta sẽ chia nhỏ các bước ra để có thể dễ dàng thực hiện và tránh gặp các lỗi. Không cần lo lắng vì page router vẫn hoạt động song song khi trong quá trình migrate.
  • Một số tính năng đã được thay đổi trong app router:
    • Thư mục app sẽ là root và chứa các routes và layouts.
    • Sử dụng Page.tsx để định nghĩa 1 UI cho 1 route.
    • Sử dụng layout.tsx để định nghĩa 1 UI chung cho nhiều trang.
    • getServerSideProps và getStaticProps đã được thay đổi thành generateStaticParams
    • pages/_app.js và pages/_document.js đã được thay đổi thành app/layout.js
  • Bước 1: Tạo file App
    • Tạo một file app và trong đó tạo layout.tsx:
    • Thư mục app bắt buộc phải có RootLayout định nghĩa các thẻ <html><body>Next.js sẽ không tự động tạo ra chúng. Root layout thay thế cho các file pages/_app.tsxpages/_document.tsx.
  • Bước 2: Di chuyển _document.js_app.js
    • Nếu bạn đang có sẵn các file _app hoặc _document, bạn có thể sao chép nội dung của chúng (ví dụ: các global styles) sang root layout (app/layout.tsx).
    • Lưu ý rằng các style trong app/layout.tsx sẽ không áp dụng cho các route trong pages/*.
    • Bạn nên giữ lại các file _app_document trong quá trình migration để tránh làm hỏng các route trong pages/*.
    • Khi đã hoàn tất quá trình chuyển đổi sang App Router, bạn có thể xóa chúng một cách an toàn.
    • Nếu bạn đang sử dụng React Context providers, chúng cần được di chuyển sang Client Component.
    • Sử dụng meta data thay cho next/head.
  • Bước 3: Di chuyển các pages
    • Các pages trong app router mặc định là server components trong khi page router sẽ mặc định là client components.
    • App router sử dụng cơ chế nested folders để định nghĩa router cho page
    • Cần sử dụng ‘use client’ cho các component của bạn để có thể sử dụng các hook như useState, useEffect …
  • Bước 4: Sự thay đổi của các Routing hook
    • Trong thư mục app, bạn nên sử dụng 3 hook mới được import từ next/navigation:
      👉 useRouter(), usePathname(), và useSearchParams().
    • useRouter mới không trả về chuỗi pathname
    • → Thay vào đó, hãy dùng usePathname() để lấy đường dẫn hiện tại.
    • useRouter mới không trả về đối tượng query
    • → Tham số truy vấn (search params) và tham số động (dynamic params) giờ đây được tách riêng:
    • Dùng useSearchParams() để lấy query string (ví dụ: ?page=2).
    • Dùng useParams() để lấy tham số động của route (ví dụ: /blog/[id]).
    • Bạn có thể kết hợp useSearchParamsusePathname để theo dõi thay đổi trang.
  • Bước 5: Styling
    • Trong page router, các stylesheet toàn cục (global styles) chỉ được phép đặt trong file pages/_app.js.
    • Với app router, giới hạn này đã được gỡ bỏ — bạn có thể thêm global styles ở bất kỳ layout, page hoặc component nào.

Như vậy, về cơ bản chúng ta đã hoàn thành quá trình đơn giản nhất để migrate từ Page Router sang App Router trong Next.js.

Việc chuyển đổi này không chỉ giúp dự án tận dụng được các tính năng mới nhất của React và Next.js như Server Components, Nested Layouts, Streaming, hay Server Actions, mà còn giúp cấu trúc code rõ ràng hơn, dễ bảo trì, và tăng hiệu năng tổng thể của ứng dụng.

Dù bước đầu có thể cần thời gian để làm quen với những thay đổi về mô hình tư duy và cách tổ chức mã nguồn, nhưng về lâu dài, App Router sẽ mang lại trải nghiệm phát triển hiện đại, linh hoạt và mạnh mẽ hơn.

👉 Sau khi hoàn tất migration, bạn có thể tiếp tục tối ưu ứng dụng bằng cách:

  • Tận dụng React Server Components để giảm tải cho client.
  • Sử dụng Server Actions để xử lý form và logic phía server.
  • Áp dụng route groupsnested layouts để tổ chức dự án khoa học hơn.

Tóm lại, App Router không chỉ là một thay đổi kỹ thuật, mà còn là bước tiến quan trọng hướng tới cách xây dựng ứng dụng React hiện đại với Next.js.

Avatar photo

Leave a Reply

Your email address will not be published. Required fields are marked *