Tạo page

1. Giới thiệu

Như đã đề cập tại Getting started/Folder structure.md, pagesmodules là một cặp. Trong project thông thường thì sẽ chỉ cần 1 trong 2 folder này nhưng với next.js thì sẽ cần cả 2. pages chứa những file khá nhỏ, chúng có nhiệm vụ routing request, khởi tạo server data và trỏ đến code trong modules tương ứng. modules là nơi chứa nhiều react component và logic chính của page.

Lí do của việc phân chia này là do Next.js sẽ coi tất cả components đặt trong folder pages là một page, đọc thêm https://stackoverflow.com/a/59924145.

2. Tạo page

📦src
 ┣ 📂module
 ┃ ┣ 📂home
 ┃ ┃ ┣ 📂components
 ┃ ┃ ┃ ┣ 📂ModalConfirm
 ┃ ┃ ┃ ┃ ┣ 📃index.scss
 ┃ ┃ ┃ ┃ ┣ 📜index.tsx
 ┃ ┃ ┣ 📃index.scss
 ┃ ┃ ┣ 📜index.tsx
 ┣ 📂pages
 ┃ ┣ 📂home
 ┃ ┃ ┣ 📜index.tsx
 ┃ ┃ ┗ 📜user.tsx
 ┃ ┣ 📜404.tsx
 ┃ ┣ 📜_app.tsx
 ┃ ┗ 📜...


Routing:
Để tạo một profile setting page với path là http://localhost:1234/home thì sẽ cần tạo file 📂pages/📂home/📜index.tsx.

Trong trường hợp config private, public cho page thì sẽ cho vào ở file RouteList.tsx

📦src
 ┣ 📂routes
 ┃ ┣ 📜index.tsx
 ┃ ┗ 📜RouteList.tsx
// Các biến có thể config được cho route
export interface IRoute {
  path: string // Đường link đến trang. Ví dụ đối với http://localhost:1234/home thì path sẽ là /home
  name: string // Tên của trang
  role?: Array<IAccountRole> // Role có thể dùng để truy cập trang
  isSidebar?: boolean // Để là true nếu muốn route xuất hiện trong Side bar
  icon?: string // Icon cho route thường dùng trong trường hợp isSidebar = true
  isPrivate?: boolean // Để là true nếu muốn người dùng phải đăng nhập để truy cập route
  isPublic?: boolean // Để là true nếu không muốn xuất hiện sidebar cho trang. Thường sử dụng cho các trang như home page hoặc about
  children?: IRoute[] // Khai báo thêm các route con thuộc route cha này
} // Tuỳ theo project có thể sẽ có thêm những biến config khác
 
// Khai báo route
const routes: IRoute[] = [
  {
    path: "/",
    name: "Home",
    icon: "Homepage",
    isSSR: true,
    isSidebar: true,
  },
  {
    path: "/account-manager",
    name: "Quản lý tài khoản",
    role: [IAccountRole.ADMIN],
    icon: "Homepage",
    isSidebar: true,
  },
]

Module:
Tương ứng với file home trên sẽ có một folder tương ứng trong module:

📂module
┣ 📂home
┃ ┣ 📂components
┃ ┃ ┣ 📂ModalConfirm
┃ ┃ ┃ ┣ 📃index.scss
┃ ┃ ┃ ┣ 📜index.tsx
┃ ┣ 📃index.scss
┃ ┣ 📜index.tsx

Một page thường sẽ có cấu trúc như trên, gồm nhiều components tạo nên page. Những components này chỉ dùng cho page này nên chúng sẽ được đặt tại đây.

3. Server side rendering

SSR được sử dụng tại đây có 2 mục đích chính:

  • Hỗ trợ SEO.
  • Cải thiện tốc độ render ban đầu.

Dựa theo mục đích trên thì những page public(có thể vào mà không cần login, vd: home page,…) cần được render toàn bộ nội dung thiết yếu tại backend(nextjs), những page private(vd: user setting, …) thì không cần thiết render toàn bộ thông tin trên server(nextjs).

Đọc thêm tại đây: https://nextjs.org/docs/basic-features/pages