Skip to content

Chuyển đổi NextJS sang ReactJS

Agent, hãy phân tích cấu trúc của dự án NextJS tại đường dẫn './my-nextjs-app'. Liệt kê giúp tôi:

  • Danh sách các trang (pages) và component chính.
  • Các API route đang được sử dụng.
  • Các custom hook và logic nghiệp vụ quan trọng.
  • Các thư viện và dependencies chính của dự án.

Agent sẽ cung cấp một báo cáo chi tiết dựa trên phân tích mã nguồn, giúp bạn có cái nhìn tổng quan trước khi bắt đầu.

1.2. Tạo dự án ReactJS mới

Bạn có thể tạo một dự án ReactJS mới theo cách thông thường:

bash
npx create-react-app my-react-app
cd my-react-app

Hoặc, bạn có thể yêu cầu Agent trong Windsurf IDE hỗ trợ tạo cấu trúc thư mục cơ bản cho dự án React mới nếu bạn không sử dụng create-react-app.

1.3. Cài đặt các dependency cần thiết

Dựa trên báo cáo phân tích từ Agent ở bước 1.1 và kiến thức về ReactJS, bạn cần cài đặt các thư viện tương đương cho dự án React mới. Ví dụ:

bash
npm install react-router-dom axios react-query styled-components
# Hoặc yarn add ...

Nhà phát triển có thể hỏi Agent Mode để được gợi ý các thư viện thay thế phù hợp. Ví dụ:

Agent, dự án NextJS của tôi đang sử dụng thư viện X. Có thư viện ReactJS nào tương đương hoặc tốt hơn để thay thế không?

2. Chuyển đổi cấu trúc dự án

2.1. Thiết lập routing

NextJS sử dụng hệ thống routing dựa trên cấu trúc thư mục pages/, trong khi ReactJS thường dùng react-router-dom. Bạn có thể yêu cầu Agent Mode hỗ trợ:

Agent, hãy giúp tôi chuyển đổi hệ thống routing từ cấu trúc thư mục 'pages' của NextJS sang cấu hình sử dụng 'react-router-dom' cho dự án ReactJS.
Cấu trúc thư mục 'pages' của NextJS hiện tại là:
- pages/index.js
- pages/about.js
- pages/products/[id].js
- pages/blog/[...slug].js

Hãy đề xuất cấu hình <Routes> và các <Route> tương ứng.

Agent sẽ phân tích và đề xuất mã nguồn cho việc thiết lập routing.

2.2. Thiết lập state management

Nếu dự án NextJS của bạn sử dụng các giải pháp quản lý state (ví dụ: Context API, Redux, Zustand), bạn cần thiết lập tương tự trong ReactJS. Agent Mode có thể hỗ trợ bằng cách:

  • Gợi ý cách cấu trúc store.
  • Hỗ trợ chuyển đổi các reducer, action (nếu dùng Redux).
  • Đề xuất cách tích hợp state management vào cấu trúc component mới.
Agent, dự án NextJS của tôi đang dùng Redux với cấu trúc slice như thế này [...mô tả...]. Làm thế nào để tôi thiết lập Redux Toolkit tương tự trong dự án ReactJS mới?

3. Chuyển đổi mã nguồn

Đây là giai đoạn tương tác nhiều nhất với Agent Mode.

3.1. Chuyển đổi các component

Đối với từng component, bạn có thể cung cấp mã nguồn NextJS cho Agent và yêu cầu chuyển đổi. Ví dụ:

Agent, hãy chuyển đổi component NextJS sau sang ReactJS. Lưu ý thay thế 'next/router' bằng 'react-router-dom' và 'next/image' bằng một thẻ <img> tiêu chuẩn hoặc một thư viện tối ưu ảnh khác nếu cần.

Đây là mã nguồn component NextJS:

import { useRouter } from 'next/router';
import Image from 'next/image';

export default function ProductPage({ product }) {
  const router = useRouter();
  
  if (router.isFallback) {
    return <div>Loading...</div>;
  }
  
  return (
    <div>
      <h1>{product.name}</h1>
      <Image src={product.image} width={500} height={300} alt={product.name} />
      <p>{product.description}</p>
      <button onClick={() => router.back()}>Back</button>
    </div>
  );
}

export async function getServerSideProps(context) {
  const { id } = context.params;
  const res = await fetch(`https://api.example.com/products/${id}`);
  const product = await res.json();
  
  return {
    props: {
      product,
    },
  };
}

Agent sẽ đề xuất phiên bản ReactJS, có thể bao gồm cả việc tách logic data fetching ra khỏi component.

3.2. Xử lý data fetching

Các hàm như getServerSidePropsgetStaticProps của NextJS cần được thay thế bằng các giải pháp fetching dữ liệu phía client trong ReactJS (thường là trong useEffect hoặc sử dụng các thư viện như React Query, SWR).

Agent, logic data fetching trong 'getServerSideProps' của component trên cần được chuyển đổi như thế nào để sử dụng React Query trong ReactJS? 
Hãy viết lại phần data fetching và component ProductPage cho phù hợp.

3.3. Xử lý routing và navigation

Các API của next/router (như useRouter, router.push, router.query) cần được ánh xạ sang các API tương ứng của react-router-dom (useNavigate, useParams, useLocation).

Agent, tôi có đoạn code sau sử dụng 'next/router':

const router = useRouter();
const { id } = router.query;
const handleNavigate = () => router.push('/new-page');

Hãy chuyển đổi nó để sử dụng các hook tương ứng từ 'react-router-dom v6'.

3.4. Xử lý các thư viện và tính năng đặc biệt của NextJS

  • next/image: Cần thay thế bằng thẻ <img> tiêu chuẩn, hoặc các thư viện React như react-image-component nếu cần tối ưu hóa. Agent có thể gợi ý các giải pháp.
  • next/link: Thay bằng <Link> từ react-router-dom.
  • API Routes: Logic trong thư mục pages/api của NextJS cần được xây dựng lại thành một backend riêng hoặc sử dụng các giải pháp serverless functions nếu ứng dụng ReactJS là hoàn toàn client-side.

Bạn có thể yêu cầu Agent cho từng trường hợp cụ thể:

Agent, làm cách nào để thay thế <Image> từ 'next/image' trong component này bằng một giải pháp phù hợp cho ReactJS, có hỗ trợ lazy loading?

4. Kiểm thử và tối ưu hóa

4.1. Kiểm thử ứng dụng

Sau khi chuyển đổi, việc kiểm thử toàn diện là rất quan trọng. Agent Mode có thể hỗ trợ:

  • Tạo sườn (boilerplate) cho các tệp test (ví dụ: sử dụng Jest và React Testing Library).
  • Gợi ý các test case dựa trên logic của component.
Agent, hãy tạo một tệp test cơ bản cho component ProductPage vừa được chuyển đổi, sử dụng Jest và React Testing Library. Bao gồm các test case kiểm tra việc hiển thị thông tin sản phẩm và hành vi của nút 'Back'.

4.2. Tối ưu hóa hiệu suất

Windsurf IDE có thể cung cấp các công cụ phân tích hiệu suất. Bạn cũng có thể yêu cầu Agent Mode rà soát code để tìm các điểm có thể tối ưu:

Agent, hãy xem lại component ProductList này và gợi ý các cách để tối ưu hóa hiệu suất render, đặc biệt khi danh sách sản phẩm rất lớn.