SonTran's avatar
Son Tran
Nextjs

Tìm hiểu Routing trong Next.js App Router

Tìm hiểu Routing trong Next.js App Router
0 views
7 min read
#Nextjs

Giới Thiệu về App Router trong Next.js

Next.js là một framework mạnh mẽ dành cho React, cung cấp nhiều tính năng hữu ích như server-side rendering (SSR) và static site generation (SSG). App Router trong Next.js là một phần không thể thiếu, giúp điều hướng giữa các trang dễ dàng và hiệu quả. Với phiên bản mới, Next.js đã mang đến nhiều cải tiến cho App Router, giúp việc xây dựng và quản lý ứng dụng trở nên đơn giản hơn.

Các Tính Năng Mới Và Quan Trọng Trong Next.js App Router

Nested Routing: Hỗ Trợ Điều Hướng Lồng Nhau

Nested routing, hay còn gọi là routing lồng nhau, là một tính năng quan trọng giúp tổ chức các route theo cấu trúc cây. Điều này làm cho việc quản lý và điều hướng giữa các phần khác nhau của ứng dụng trở nên dễ dàng và hiệu quả hơn. Với nested routing, bạn có thể tạo ra các route con bên trong các route chính, giúp tổ chức và quản lý các phần của ứng dụng theo một cấu trúc rõ ràng và trực quan.

Lợi ích của Nested Routing:

  • Quản lý dễ dàng hơn: Với cấu trúc cây, bạn có thể dễ dàng theo dõi và quản lý các route con thuộc các route chính. Điều này làm cho việc điều hướng và quản lý code trở nên trực quan hơn.
  • Tái sử dụng layout: Nested routing cho phép bạn định nghĩa các layout chung cho các nhóm trang, giúp tái sử dụng và duy trì sự nhất quán trong giao diện người dùng.
  • Điều hướng tự động: Với cấu trúc rõ ràng, việc điều hướng giữa các trang trở nên tự động và dễ dàng hơn, giảm thiểu lỗi và giúp phát triển nhanh chóng hơn.

Cách Triển Khai Nested Routing trong Next.js Dưới đây là các bước cụ thể để triển khai nested routing trong Next.js:

  1. Tạo cấu trúc thư mục cho các route Bạn có thể tạo các thư mục và file tương ứng với các route của ứng dụng. Ví dụ, nếu bạn muốn có một route chính /posts và các route con như /posts/[postId]/posts/[postId]/comments, bạn sẽ tạo cấu trúc thư mục như sau:

    app/
    ├── posts/
    │   ├── [postId]/
    │   │   ├── index.js
    │   │   └── comments/
    │   │       └── [commentId].js
    │   └── index.js
    
  2. Định nghĩa các component cho từng route

    Bạn sẽ định nghĩa các component React cho từng route trong cấu trúc thư mục trên. Ví dụ:

    • app/posts/index.js:
      export default function Posts() {
        return <div>Tất cả các bài viết</div>;
      }
    • app/posts/[postId]/index.js:
      export default function Post({ params }) {
        return <div>Mã bài viết: {params.postId}</div>;
      }
    • app/posts/[postId]/comments/[commentId].js:
      export default function Comment({ params }) {
        return (
          <div>
            Mã bình luận: {params.commentId} trên bài viết: {params.postId}
          </div>
        );
      }
  3. Sử dụng useRouter để lấy thông tin route

    Trong các component, bạn có thể sử dụng hook useRouter của Next.js để lấy thông tin về route hiện tại, bao gồm các tham số động. Ví dụ:

    import { useRouter } from 'next/router';
    
    export default function Post() {
      const router = useRouter();
      const { postId } = router.query;
    
      return <div>Mã bài viết: {postId}</div>;
    }
  4. Kết hợp với Layout

    Một lợi ích khác của nested routing là khả năng kết hợp với layout để tạo ra giao diện người dùng nhất quán. Bạn có thể tạo một layout và sử dụng nó trong các route con:

    • app/layout.js:
    export default function Layout({ children }) {
    return (
        <div>
            <header>Blog của tôi</header>
            <main>{children}</main>
            <footer>Footer</footer>
        </div>
        );
    }
    • app/posts/[postId]/index.js (sử dụng layout):
    import Layout from '../../layout';
    
    export default function Post({ params }) {
        return (
            <Layout>
                <div>Mã bài viết: {params.postId}</div>
            </Layout>
        );
    }

Server Components: Tích Hợp Server Components

Server components là một tính năng mới cho phép render các component trên server, giúp tối ưu hóa hiệu suất và giảm tải cho client. Điều này đặc biệt hữu ích cho các ứng dụng có yêu cầu hiệu suất cao.

Lợi ích của Server Components

  • Hiệu suất cao hơn: Render trên server giúp giảm tải cho client, làm cho ứng dụng chạy nhanh hơn và mượt mà hơn.
  • SEO tốt hơn: Các trang được render trên server sẽ dễ dàng được các công cụ tìm kiếm lập chỉ mục, cải thiện SEO.
  • Tăng khả năng bảo mật: Dữ liệu nhạy cảm có thể được xử lý trên server, giảm nguy cơ bị lộ thông tin trên client.

Ví dụ về Server Components:

export default async function Page() {
  const data = await fetchData();
  return <div>{data}</div>;
}

Loading UI: Tối Ưu Hóa Trải Nghiệm Người Dùng

Tính năng này giúp hiển thị giao diện tải khi trang đang được load, cải thiện trải nghiệm người dùng. Bằng cách thêm một component loading, bạn có thể cung cấp phản hồi trực quan cho người dùng khi họ chờ đợi.

Lợi ích của Loading UI

  • Cải thiện trải nghiệm người dùng: Người dùng sẽ biết rằng trang đang được tải, giảm cảm giác chờ đợi.
  • Phản hồi trực quan: Cung cấp phản hồi trực quan giúp người dùng biết rằng ứng dụng vẫn đang hoạt động và không bị treo.

Ví dụ về Loading UI:

  • app/loading.js:
export default function Loading() {
  return <p>Đang tải...</p>;
}

Error Handling: Quản Lý Lỗi Nâng Cao

Next.js cải thiện việc quản lý lỗi, cho phép bạn bắt và xử lý lỗi một cách dễ dàng hơn. Điều này giúp cải thiện độ ổn định của ứng dụng và cung cấp trải nghiệm tốt hơn cho người dùng.

Lợi ích của Error Handling

  • Cải thiện độ ổn định: Bắt và xử lý lỗi kịp thời giúp ứng dụng ổn định hơn.
  • Trải nghiệm người dùng tốt hơn: Người dùng sẽ nhận được thông báo rõ ràng khi xảy ra lỗi, giảm thiểu sự bực bội.
  • Dễ dàng gỡ lỗi: Các lỗi được ghi lại và xử lý rõ ràng giúp việc gỡ lỗi trở nên dễ dàng hơn.

Ví dụ về Quản Lý Lỗi:

  • app/error.js:
export default function Error({ error }) {
  return <p>Đã xảy ra lỗi: {error.message}</p>;
}

Lợi Ích Của Các Thay Đổi

  • Hiệu suất: Các tính năng mới như server components và nested routing giúp cải thiện hiệu suất và trải nghiệm người dùng.
  • Quản lý code: Tính năng layout và nested routing giúp dễ dàng hơn trong việc quản lý và tổ chức code.
  • Phát triển nhanh: Tăng tốc độ phát triển và triển khai ứng dụng nhờ các tính năng tối ưu hóa trải nghiệm người dùng như loading UI và error handling.
  • SEO và bảo mật: Render trên server giúp cải thiện SEO và tăng cường bảo mật cho ứng dụng.

Kết Luận

Routing trong Next.js App Router mang lại rất nhiều lợi ích cho việc phát triển ứng dụng phức tạp. Bằng cách tận dụng các tính năng mới như nested routing, server components, layouts, loading UI và error handling, bạn có thể tạo ra những ứng dụng web mạnh mẽ, hiệu quả và dễ dàng quản lý. Hãy thử nghiệm các tính năng này trong dự án của bạn để tận dụng tối đa lợi ích mà chúng mang lại.