paint-brush
Xây dựng ứng dụng thời gian thực với Next.js 13.4 Server Actions 1. Giới thiệu](#...từ tác giả@leandronnz
19,725 lượt đọc
19,725 lượt đọc

Xây dựng ứng dụng thời gian thực với Next.js 13.4 Server Actions 1. Giới thiệu](#...

từ tác giả Leandro Nuñez22m2023/08/10
Read on Terminal Reader

dài quá đọc không nổi

Bài viết khám phá việc xây dựng các ứng dụng web thời gian thực bằng cách sử dụng các hành động máy chủ của Next.js 13.4. Nó giải thích các khái niệm ứng dụng thời gian thực, giới thiệu các hành động máy chủ của Next.js 13.4, bao gồm thiết lập và tạo các hành động máy chủ, thảo luận về thiết kế giao diện người dùng để có trải nghiệm người dùng liền mạch, đưa ra các chiến lược thử nghiệm, kỹ thuật tối ưu hóa và các cải tiến trong tương lai. Bài viết cung cấp các ví dụ mã, hướng dẫn và tài nguyên để xây dựng các ứng dụng thời gian thực hiệu quả.
featured image - Xây dựng ứng dụng thời gian thực với Next.js 13.4 Server Actions

 1. Giới thiệu](#...
Leandro Nuñez HackerNoon profile picture
0-item


Xin chào!


Nếu bạn giống tôi, có lẽ bạn đã thấy ngạc nhiên trước khả năng tương tác liền mạch của các ứng dụng web thời gian thực ngày nay—những chatbot phản hồi ngay lập tức, các thông báo trực tiếp bật lên mà không cần làm mới trang và các công cụ cộng tác cập nhật trong chớp mắt. Chức năng thời gian thực đã trở nên ít xa xỉ hơn và được kỳ vọng nhiều hơn trong thời đại kỹ thuật số.


Bây giờ, nếu bạn đang theo dõi sự phát triển trong thế giới của Next.js, bạn có thể đã nắm bắt được các tính năng đáng chú ý của phiên bản 13.4, đặc biệt là yếu tố thay đổi cuộc chơi: hành động của máy chủ. Bạn có tò mò về cách điều này có thể xác định lại cách chúng ta tạo ra trải nghiệm thời gian thực không?


Chà, tôi cũng vậy!


Hãy cùng tôi đi sâu vào nghiên cứu điển hình này, nơi chúng ta sẽ bắt đầu hành trình xây dựng một ứng dụng thời gian thực, tận dụng sức mạnh và sự khéo léo của các hành động của máy chủ Next.js. Cho dù bạn là nhà phát triển dày dạn kinh nghiệm hay chỉ mới mạo hiểm bước vào lĩnh vực ứng dụng thời gian thực, luôn có rất nhiều thông tin chi tiết đang chờ bạn.


Chúng ta hãy để bóng lăn, phải không?


Mục lục

  1. Bối cảnh: Tìm hiểu các ứng dụng thời gian thực
  2. Có gì mới trong Next.js 13.4: Tổng quan về các hành động của máy chủ
  3. Thiết lập giai đoạn: Phạm vi dự án thời gian thực của chúng tôi
  4. Bắt đầu: Thiết lập ban đầu
  5. Xây dựng chương trình phụ trợ: Tận dụng các hành động của máy chủ
  6. Thiết kế giao diện người dùng: Trải nghiệm người dùng liền mạch
  7. Kiểm tra khả năng thời gian thực
  8. Cải tiến và tối ưu hóa
  9. Kết luận và triển vọng tương lai
  10. Tài nguyên và đọc thêm

1. Bối cảnh: Tìm hiểu các ứng dụng thời gian thực

Trong bối cảnh kỹ thuật số có nhịp độ nhanh ngày nay, thuật ngữ "thời gian thực" thường xuất hiện trong nhiều ngữ cảnh khác nhau—từ trò chơi và tài chính đến truyền thông và mạng xã hội. Nhưng chính xác thì "thời gian thực" có nghĩa là gì trong thế giới ứng dụng web? L


Hãy làm sáng tỏ điều này.


Ứng dụng thời gian thực là gì?

Các ứng dụng thời gian thực là các hệ thống hoặc chương trình phản hồi ngay lập tức với đầu vào của người dùng hoặc các sự kiện bên ngoài, cung cấp phản hồi tức thì mà không có độ trễ rõ ràng. Nói một cách đơn giản hơn, hãy nghĩ về chúng như những nền tảng trực tiếp, năng động phát triển theo "thời gian thực", phản ánh luồng thông tin liên tục trong hệ sinh thái kỹ thuật số hiện đại.

Ví dụ thực tế

Để đưa nó vào quan điểm, hãy xem xét một số ví dụ phổ biến:


  • Ứng dụng nhắn tin tức thời : Các nền tảng như WhatsApp và Telegram nơi tin nhắn được gửi, nhận và xem không chậm trễ.

  • Công cụ cộng tác : Hãy nghĩ đến Google Tài liệu, nơi nhiều người dùng có thể chỉnh sửa tài liệu đồng thời, quan sát các thay đổi của nhau trong thời gian thực.

  • Live Stock Tickers : Nền tảng hiển thị giá cổ phiếu cập nhật tức thời với những biến động của thị trường.

  • Trò chơi nhiều người chơi trực tuyến : Nơi người chơi tương tác với nhau và với môi trường mà không có độ trễ, đảm bảo trải nghiệm chơi trò chơi liền mạch.


Sự liên quan của các ứng dụng thời gian thực

Vậy, tại sao chức năng thời gian thực lại được săn đón như vậy?


  • Kỳ vọng của người dùng : Người dùng hiện đại mong đợi sự nhanh chóng. Cho dù đó là ứng dụng trò chuyện hay cập nhật thời tiết, bất kỳ độ trễ đáng chú ý nào cũng có thể làm giảm sự hài lòng của người dùng.
  • Tương tác nâng cao : Các tính năng thời gian thực cho phép trải nghiệm người dùng tương tác và phong phú hơn, thúc đẩy sự tham gia của người dùng.
  • Lợi thế cạnh tranh : Việc cung cấp các tính năng thời gian thực có thể tạo nên sự khác biệt cho các nền tảng trong một thị trường đông đúc, mang lại một điểm bán hàng độc đáo để thu hút và giữ chân người dùng.


Những thách thức phía trước

Việc xây dựng các ứng dụng thời gian thực không phải là không có trở ngại:


  • Các vấn đề về khả năng mở rộng : Các ứng dụng thời gian thực thường cần xử lý nhiều kết nối đồng thời, yêu cầu cơ sở hạ tầng mạnh mẽ.

  • Tính toàn vẹn của dữ liệu : Đảm bảo rằng dữ liệu thời gian thực vẫn nhất quán trên các giao diện người dùng khác nhau có thể là một thách thức, đặc biệt là với nhiều lần chỉnh sửa hoặc tương tác đồng thời.

  • Độ trễ : Một ứng dụng thời gian thực chỉ tốt bằng thành phần chậm nhất của nó. Đảm bảo sự chậm trễ tối thiểu đòi hỏi phải tối ưu hóa cẩn thận và sử dụng tài nguyên hiệu quả.


Bây giờ chúng ta đã thiết lập giai đoạn với sự hiểu biết cơ bản về các ứng dụng thời gian thực, chúng ta sẽ tìm hiểu sâu về cách Next.js 13.4, với các hành động của máy chủ, nổi lên như một công cụ quan trọng cho các nhà phát triển mong muốn tạo ra những trải nghiệm sống động như vậy.



2. Có gì mới trong Next.js 13.4: Tổng quan về các hành động của máy chủ

Trong bối cảnh phát triển web không ngừng phát triển, Next.js luôn dẫn đầu, giới thiệu các tính năng xác định lại cách chúng tôi tiếp cận các ứng dụng xây dựng. Phiên bản 13.4 cũng không ngoại lệ, đặc biệt với sự nhấn mạnh vào các hành động của máy chủ. Nhưng trước khi đi sâu, hãy làm rõ một số thuật ngữ:

Sơ lược về Hành động

Các hành động trong hệ sinh thái React, mặc dù vẫn còn đang thử nghiệm, nhưng đã mang lại sự thay đổi mô hình bằng cách cho phép các nhà phát triển thực thi mã không đồng bộ để đáp ứng các tương tác của người dùng.

Thật thú vị, mặc dù chúng không dành riêng cho Next.js hoặc React Server Components, nhưng việc sử dụng chúng thông qua Next.js có nghĩa là bạn đang ở trên kênh thử nghiệm React.


Đối với những người quen thuộc với các biểu mẫu HTML, bạn có thể nhớ lại việc chuyển các URL tới chỗ dựa action . Giờ đây, với Hành động, bạn có thể chuyển trực tiếp một chức năng, làm cho các tương tác trở nên năng động và tích hợp hơn.


 <button action={() => { /* async function logic here */ }}>Click me!</button>


Sự tích hợp của React với Actions cũng cung cấp các giải pháp tích hợp sẵn để cập nhật một cách lạc quan. Điều này nhấn mạnh rằng mặc dù các Hành động mang tính đột phá, nhưng các mẫu vẫn đang phát triển và các API mới hơn có thể được thêm vào để làm phong phú thêm các mẫu đó.


Nắm bắt các hành động biểu mẫu

Các hành động biểu mẫu thể hiện sự kết hợp khéo léo giữa các hành động của React với API <form> tiêu chuẩn. Chúng cộng hưởng với thuộc tính formaction nguyên thủy trong HTML, giúp các nhà phát triển có thể nâng cao trạng thái tải liên tục và các chức năng khác vượt trội.


 <!-- Traditional HTML approach --> <form action="/submit-url"> <!-- form elements --> </form> <!-- With Next.js 13.4 Form Actions --> <form action={asyncFunctionForSubmission}> <!-- form elements --> </form>


Chức năng máy chủ & Hành động máy chủ

Chức năng máy chủ về cơ bản là các chức năng hoạt động ở phía máy chủ nhưng có thể được gọi từ máy khách. Những điều này nâng khả năng kết xuất phía máy chủ của Next.js lên một cấp độ hoàn toàn mới.

Chuyển sang Hành động máy chủ , chúng có thể được hiểu là Chức năng máy chủ, nhưng những chức năng được kích hoạt cụ thể dưới dạng hành động. Sự tích hợp của chúng với các phần tử biểu mẫu, đặc biệt là thông qua chỗ dựa action , đảm bảo rằng biểu mẫu vẫn tương tác ngay cả trước khi tải JavaScript phía máy khách. Điều này mang lại trải nghiệm người dùng mượt mà hơn, với việc hydrat hóa React không phải là điều kiện tiên quyết để gửi biểu mẫu.


 // A simple Server Action in Next.js 13.4 <form action={serverActionFunction}> <!-- form elements --> </form>


Hiểu về các đột biến của máy chủ

Cuối cùng, chúng ta có Server Mutations , là một tập hợp con của Server Actions. Chúng đặc biệt hiệu quả khi bạn cần sửa đổi dữ liệu trên máy chủ và sau đó thực hiện các phản hồi cụ thể, chẳng hạn như redirect , revalidatePath hoặc revalidateTag .


 const serverMutationFunction = async () => { // Modify data logic here... // ... return { revalidatePath: '/updated-path' }; } <form action={serverMutationFunction}> <!-- form elements --> </form>


Lưu ý: Tóm lại, khung Hành động máy chủ của Next.js 13.4, được củng cố bởi các Hành động, Hành động biểu mẫu, Chức năng máy chủ và Đột biến máy chủ, là hiện thân của cách tiếp cận chuyển đổi đối với các ứng dụng web thời gian thực.

Khi chúng tôi tiếp tục nghiên cứu trường hợp của mình, bạn sẽ tận mắt chứng kiến sức mạnh mà các tính năng này mang lại.

Vì vậy, hãy chuẩn bị cho hành trình thú vị phía trước!



3. Thiết lập giai đoạn: Phạm vi dự án thời gian thực của chúng tôi

Trong bối cảnh xây dựng ứng dụng thời gian thực, Hành động máy chủ của Next.js 13.4 đóng một vai trò quan trọng. Các tính năng alpha này giúp dễ dàng quản lý các đột biến dữ liệu phía máy chủ, giảm JavaScript phía máy khách và nâng cao dần các biểu mẫu.


Kích hoạt hành động máy chủ

Trước tiên, bạn cần bật Tác vụ máy chủ trong dự án Next.js của mình. Chỉ cần thêm đoạn mã sau vào tệp next.config.js của bạn:


 module.exports = { experimental: { serverActions: true, }, }



Sáng tạo và gọi

Các Hành động Máy chủ có thể được xác định trong Thành phần Máy chủ sử dụng nó hoặc trong một tệp riêng biệt để có thể sử dụng lại giữa các Thành phần Máy khách và Máy chủ.

Đây là cách bạn có thể tạo và gọi các Tác vụ Máy chủ:


  1. Trong các Thành phần Máy chủ : Một Hành động Máy chủ có thể được xác định dễ dàng trong một Thành phần Máy chủ, như sau:


     export default function ServerComponent() { async function myAction() { 'use server' // ... } }


  2. Với Thành phần máy khách : Khi sử dụng Hành động máy chủ bên trong Thành phần máy khách, hãy tạo hành động trong một tệp riêng biệt rồi nhập hành động đó.


     // app/actions.js 'use server' export async function myAction() { // ... }



  3. Nhập và sử dụng trong Thành phần máy khách:


     // app/client-component.js import { myAction } from './actions' export default function ClientComponent() { return ( <form action={myAction}> <button type="submit">Add to Cart</button> </form> ) }


  4. Gọi tùy chỉnh : Bạn có thể sử dụng các phương thức tùy chỉnh như startTransition để gọi các Tác vụ máy chủ bên ngoài biểu mẫu, nút hoặc đầu vào.


     // Example using startTransition 'use client' import { useTransition } from 'react' import { addItem } from '../actions' function ExampleClientComponent({ id }) { let [isPending, startTransition] = useTransition() return ( <button onClick={() => startTransition(() => addItem(id))}> Add To Cart </button> ) }



Tăng cường tiến bộ

Next.js 13.4 cũng cung cấp tính năng Nâng cao lũy tiến, cho phép <form> hoạt động mà không cần JavaScript. Hành động máy chủ có thể được chuyển trực tiếp đến <form> , làm cho biểu mẫu tương tác ngay cả khi JavaScript bị tắt.


 // app/components/example-client-component.js 'use client' import { handleSubmit } from './actions.js' export default function ExampleClientComponent({ myAction }) { return ( <form action={handleSubmit}> {/* ... */} </form> ) }



Giới hạn kích thước

Theo mặc định, nội dung yêu cầu tối đa được gửi tới Hành động máy chủ là 1 MB. Nếu cần, bạn có thể định cấu hình giới hạn này bằng tùy chọn serverActionsBodySizeLimit :


 module.exports = { experimental: { serverActions: true, serverActionsBodySizeLimit: '2mb', }, }


4. Bắt đầu: Thiết lập ban đầu

Tạo dự án Next.js 13.4 mới

Để bắt đầu xây dựng một ứng dụng thời gian thực bằng Next.js 13.4, bước đầu tiên là tạo một dự án mới. Bạn có thể sử dụng lệnh Next.js CLI tiêu chuẩn để khởi tạo dự án của mình:


 npx create-next-app@latest my-real-time-app


Thay my-real-time-app bằng tên mong muốn cho dự án của bạn. Lệnh này thiết lập một dự án Next.js mới với các cấu hình mặc định.

Các phụ thuộc và gói cần thiết cho chức năng thời gian thực

Đối với chức năng thời gian thực, bạn có thể yêu cầu một số gói và phần phụ thuộc nhất định. Tùy thuộc vào các chi tiết cụ thể của ứng dụng của bạn, chúng có thể bao gồm từ thư viện WebSockets đến đăng ký GraphQL, v.v.

Đảm bảo bạn đã xem xét các yêu cầu của dự án và thêm các thành phần phụ thuộc cần thiết.

Tuy nhiên, với sự hỗ trợ của Next.js 13.4 dành cho Hành động máy chủ, đã có một thiết lập tích hợp hỗ trợ xử lý phía máy chủ, có thể hỗ trợ đạt được một số tính năng thời gian thực.


Tổng quan ngắn gọn về cấu trúc dự án và thiết lập thư mục

Bộ định tuyến ứng dụng

Với việc giới thiệu Next.js 13.4, Bộ định tuyến ứng dụng là một tính năng quan trọng cho phép các nhà phát triển sử dụng bố cục dùng chung, định tuyến lồng nhau, xử lý lỗi, v.v. Nó được thiết kế để hoạt động cùng với thư mục pages hiện có, nhưng nó được đặt trong một thư mục mới có tên app .


Để bắt đầu với Bộ định tuyến ứng dụng:

  1. Tạo một thư mục app trong thư mục gốc của dự án của bạn.

  2. Thêm các tuyến đường hoặc thành phần của bạn bên trong thư mục này.


Theo mặc định, các thành phần bên trong thư mục appThành phần máy chủ , cung cấp hiệu suất tối ưu và cho phép các nhà phát triển dễ dàng áp dụng chúng.

Đây là một cấu trúc ví dụ:


 my-real-time-app/ │ ├── app/ # Main directory for App Router components │ ├── _error.js # Custom error page │ ├── _layout.js # Shared layout for the app │ │ │ ├── dashboard/ # Nested route example │ │ ├── index.js # Dashboard main view │ │ └── settings.js # Dashboard settings view │ │ │ ├── index.js # Landing/Home page │ ├── profile.js # User profile page │ ├── login.js # Login page │ └── register.js # Registration page │ ├── public/ # Static assets go here (images, fonts, etc.) │ ├── images/ │ └── favicon.ico │ ├── styles/ # Global styles or variables │ └── global.css │ ├── package.json # Dependencies and scripts ├── next.config.js # Next.js configuration └── README.md # Project documentation


Thành phần máy chủ so với Thành phần máy khách

Suy nghĩ về cách các thành phần kết xuất là rất quan trọng. Trong các SPA truyền thống (Ứng dụng một trang), React hiển thị toàn bộ ứng dụng ở phía máy khách. Với Cấu phần máy chủ, phần lớn ứng dụng hiển thị trên máy chủ, mang lại lợi ích về hiệu suất. Đây là một hướng dẫn:


  • Thành phần máy chủ : Lý tưởng cho các phần không tương tác trong ứng dụng của bạn. Các thành phần này được hiển thị trên máy chủ và được gửi tới máy khách dưới dạng HTML. Ưu điểm ở đây là cải thiện hiệu suất, giảm JavaScript phía máy khách và khả năng tìm nạp dữ liệu hoặc truy cập trực tiếp vào tài nguyên phụ trợ.

  • Thành phần máy khách : Được sử dụng cho các thành phần giao diện người dùng tương tác. Chúng được kết xuất trước trên máy chủ và sau đó được "ngậm nước" trên máy khách để thêm tính tương tác.


Để phân biệt giữa các thành phần này, Next.js đã giới thiệu chỉ thị "use client" . Lệnh này chỉ ra rằng một thành phần phải được coi là Thành phần máy khách. Nó phải được đặt ở đầu tệp thành phần, trước bất kỳ lần nhập nào.


Ví dụ: nếu bạn có một bộ đếm tương tác, như trong mã được cung cấp, thì bạn sẽ sử dụng lệnh "use client" để cho biết rằng đó là một thành phần phía máy khách.


khuyến nghị

Khi bạn cấu trúc ứng dụng của mình, đây là một số hướng dẫn:


  1. Sử dụng Cấu phần máy chủ theo mặc định (vì chúng nằm trong thư mục app ).

  2. Chỉ chọn Thành phần ứng dụng khách khi bạn có các trường hợp sử dụng cụ thể như thêm tính tương tác, sử dụng API chỉ dành cho trình duyệt hoặc tận dụng các hook React phụ thuộc vào trạng thái hoặc chức năng của trình duyệt.


Lưu ý: Theo cấu trúc và thiết lập này, bạn sẽ tiếp tục xây dựng một ứng dụng thời gian thực hoạt động hiệu quả với Server Actions của Next.js 13.4.



5. Xây dựng phần phụ trợ: Tận dụng các hành động của máy chủ

Sức mạnh của Next.js 13.4 tỏa sáng khi tích hợp các chức năng phụ trợ thời gian thực vào dự án của chúng tôi. Hãy xem qua các bước với các ví dụ mã có liên quan cho my-real-time-app .

Giới thiệu về cách các hành động của máy chủ sẽ được sử dụng trong dự án này

Đối với my-real-time-app , các hành động của máy chủ đóng vai trò là cầu nối chính giữa giao diện người dùngphụ trợ , cho phép các giao dịch dữ liệu hiệu quả mà không cần API riêng biệt.


 // my-real-time-app/app/actions/index.js export * from './auth-action'; export * from './chat-action';


Thiết lập hành động máy chủ để xử lý xác thực người dùng

Trong my-real-time-app , chúng tôi tận dụng các hành động của máy chủ để hợp lý hóa quy trình xác thực.


 // my-real-time-app/app/actions/auth-action.js export const login = async (credentials) => { // Logic for authenticating user with credentials // Return user details or error message }; export const logout = async (userId) => { // Logic for logging out the user // Return success or error message }; export const register = async (userInfo) => { // Logic for registering a new user // Store user in database and return success or error message };


Tạo hành động máy chủ để gửi và nhận tin nhắn thời gian thực

Đối với chức năng trò chuyện:


 // my-real-time-app/app/actions/chat-action.js export const sendMessage = async (messageDetails) => { // Logic to send a new message // Store message in database and inform other users via WebSocket or similar }; export const receiveMessage = async () => { // Logic to receive a message in real-time // Return the message details }; export const getRecentMessages = async (userId) => { // Logic to fetch recent messages for the user // Retrieve messages from the database };


Tích hợp cơ sở dữ liệu (ví dụ: MongoDB) để duy trì thông báo

Sử dụng MongoDB làm kho lưu trữ dữ liệu chính của chúng tôi:


 // Initialize MongoDB connection const { MongoClient } = require('mongodb'); const client = new MongoClient(process.env.MONGODB_URI); await client.connect(); // Now, use this connection in server actions to interact with the database.


Trong các hành động trò chuyện của chúng tôi:


 // my-real-time-app/app/actions/chat-action.js export const sendMessage = async (messageDetails) => { const messagesCollection = client.db('chatDB').collection('messages'); await messagesCollection.insertOne(messageDetails); // Inform other users via WebSocket or similar };


Đảm bảo liên lạc an toàn và nhanh chóng thông qua các hành động của máy chủ

Để bảo mật:


 // Middleware for validating request data const validateRequest = (req) => { // Validation logic here return isValid; }; export const sendMessage = async (messageDetails) => { if (!validateRequest(messageDetails)) { throw new Error("Invalid request data"); } // Remaining logic... };


6. Thiết kế giao diện người dùng: Trải nghiệm người dùng liền mạch

Trong phần này, chúng ta sẽ xây dựng giao diện trò chuyện trực quan và phản hồi nhanh cho my-real-time-app . Việc tích hợp các thành phần máy chủ của Next.js 13.4 sẽ cho phép cập nhật theo thời gian thực để mang lại trải nghiệm mượt mà cho người dùng.

Kiến trúc giao diện trò chuyện chính

Đầu tiên, hãy tạo giao diện trò chuyện chính:


 // my-real-time-app/app/chat-interface.js import { useEffect, useState } from 'react'; import { getRecentMessages } from './actions/chat-action'; export default function ChatInterface() { const [messages, setMessages] = useState([]); useEffect(() => { async function loadMessages() { const recentMessages = await getRecentMessages(); setMessages(recentMessages); } loadMessages(); }, []); return ( <div className="chatBox"> {messages.map(msg => ( <p key={msg.id}>{msg.content}</p> ))} </div> ); }


Thành phần này tìm nạp các tin nhắn gần đây khi tải và hiển thị chúng trong hộp trò chuyện.


Kết nối giao diện người dùng với các hành động của máy chủ để cập nhật theo thời gian thực

Bây giờ, chúng ta sẽ thiết lập cập nhật theo thời gian thực bằng một ví dụ cơ bản về WebSockets:


 // my-real-time-app/app/chat-interface.js const [socket, setSocket] = useState(null); useEffect(() => { const ws = new WebSocket("ws://your-backend-url/ws"); ws.onmessage = (event) => { const newMessage = JSON.parse(event.data); setMessages(prevMessages => [...prevMessages, newMessage]); }; setSocket(ws); return () => { ws.close(); }; }, []);


Móc này thiết lập kết nối WebSocket và cập nhật danh sách thư khi nhận được thư mới.

Triển khai thông báo cho tin nhắn mới

Để có trải nghiệm người dùng tốt hơn, hãy thông báo cho người dùng về tin nhắn mới:


 // my-real-time-app/app/chat-interface.js useEffect(() => { if (messages.length && "Notification" in window && Notification.permission === "granted") { const lastMessage = messages[messages.length - 1]; new Notification(`New message from ${lastMessage.sender}: ${lastMessage.content}`); } }, [messages]);


Hiệu ứng này sẽ gửi thông báo cho trình duyệt mỗi khi danh sách tin nhắn được cập nhật với một tin nhắn mới.

Các kỹ thuật để đảm bảo tương tác người dùng trơn tru và không bị lag

Để đảm bảo trải nghiệm trôi chảy:


  1. Lazy-load các thành phần nặng:
 const HeavyComponent = React.lazy(() => import('./HeavyComponent')); function Chat() { return ( <React.Suspense fallback={<div>Loading...</div>}> <HeavyComponent /> </React.Suspense> ); }


  1. Sử dụng React Server Components của Next.js để phân tách logic:


Hãy nhớ từ tài liệu trước đó, Thành phần máy chủ có thể được sử dụng cho các phần không tương tác, trong khi Thành phần máy khách có thể xử lý các phần tương tác, giảm lượng JavaScript được gửi đến máy khách.

Chẳng hạn, trong cuộc trò chuyện của chúng tôi, lịch sử tin nhắn có thể là Thành phần máy chủ, trong khi trường nhập và nút gửi, yêu cầu tương tác phía máy khách, có thể là Thành phần máy khách.



7. Kiểm tra khả năng thời gian thực

Với các thành phần cốt lõi của ứng dụng thời gian thực của chúng tôi, điều cần thiết là đảm bảo rằng chúng hoạt động như mong đợi và có hiệu suất, khả năng mở rộng và mạnh mẽ. Phần này làm sáng tỏ các phương pháp thử nghiệm khác nhau phù hợp với các hệ thống thời gian thực như my-real-time-app .

Các công cụ và chiến lược để thử nghiệm các chức năng thời gian thực

  1. Thử nghiệm từ đầu đến cuối với Cypress

Đối với các ứng dụng thời gian thực, các bài kiểm tra đầu cuối là rất quan trọng. Hãy thiết lập một ví dụ với Cypress:


 // cypress/integration/chat.spec.js describe('Chat functionality', () => { it('should send and receive messages in real-time', () => { cy.visit('/chat'); cy.get('[data-cy=messageInput]').type('Hello, World!'); cy.get('[data-cy=sendButton]').click(); cy.contains('Hello, World!').should('exist'); }); });
  1. Kiểm tra tải trọng với pháo binh

Điều này sẽ giúp hiểu cách hệ thống hoạt động dưới một số lượng lớn người dùng hoặc tin nhắn:


 # artillery-config.yml config: target: 'http://my-real-time-app.com' phases: - duration: 300 arrivalRate: 20 scenarios: - flow: - emit: channel: 'chat' payload: message: 'Hello, World!'
 $ artillery run artillery-config.yml


Giải quyết các tắc nghẽn tiềm ẩn và các vấn đề về hiệu suất

  1. Hồ sơ hiệu suất máy chủ

Node.js cung cấp các công cụ dựng sẵn để định hình và cờ --inspect có thể được sử dụng với máy chủ phát triển Next.js để kích hoạt trình kiểm tra Node.js. Bằng cách sử dụng Công cụ dành cho nhà phát triển của Chrome, người ta có thể hiểu rõ hơn về các tắc nghẽn hiệu suất.


  1. Phân tích hiệu suất phía khách hàng

Đối với phía máy khách, các công cụ như tab Performance trong Chrome DevTools có thể giúp xác định các tắc nghẽn kết xuất. Đặc biệt với các bản cập nhật theo thời gian thực, hãy đảm bảo rằng các kết xuất không cần thiết sẽ không xảy ra.


Đảm bảo khả năng mở rộng và độ bền của ứng dụng thời gian thực

  1. Quản lý trạng thái với SWR hoặc React Query

Các ứng dụng thời gian thực thường liên quan đến việc giữ trạng thái của máy khách đồng bộ với máy chủ. Các thư viện như SWR hoặc React Query giúp việc này trở nên dễ dàng hơn bằng cách cung cấp các tính năng như tự động tìm nạp lại, lưu vào bộ đệm và đồng bộ hóa thời gian thực.


Ví dụ với SWR:

 // my-real-time-app/app/chat-interface.js import useSWR from 'swr'; function ChatInterface() { const { data: messages } = useSWR('/api/messages', fetcher); // ... rest of the component }


  1. Chia tỷ lệ ngang

Đối với khả năng mở rộng phụ trợ, đặc biệt là với WebSockets, hãy cân nhắc sử dụng một giải pháp như Redis để quản lý trạng thái trên nhiều phiên bản máy chủ của bạn. Bằng cách này, nếu một phiên bản máy chủ nhận được tin nhắn, nó có thể truyền tin nhắn đó tới các máy khách được kết nối với các phiên bản máy chủ khác.


  1. Tối ưu hóa cơ sở dữ liệu

Đảm bảo rằng các truy vấn cơ sở dữ liệu của bạn, đặc biệt là những truy vấn chạy thường xuyên trong các ứng dụng thời gian thực, được tối ưu hóa. Lập chỉ mục các cột cần thiết và xem xét sử dụng các giải pháp bộ nhớ đệm cơ sở dữ liệu cho dữ liệu được truy cập thường xuyên.


Lưu ý: Thử nghiệm các ứng dụng thời gian thực yêu cầu kết hợp các kỹ thuật kiểm thử phần mềm tiêu chuẩn và một số kỹ thuật được thiết kế riêng cho các thách thức và đặc điểm của hệ thống thời gian thực. Đảm bảo chế độ thử nghiệm nghiêm ngặt cho my-real-time-app , chúng tôi có thể đảm bảo trải nghiệm người dùng mượt mà và phản hồi nhanh, bất kể quy mô lưu lượng người dùng hoặc luồng dữ liệu.



10. Cải tiến và Tối ưu hóa

Với kiến trúc nền tảng của ứng dụng thời gian thực của chúng tôi đã sẵn sàng, giờ đây, sự chú ý của chúng tôi chuyển sang tinh chỉnh các tính năng và hiệu suất của nó. Dưới đây là một số chiến lược để nâng cao trải nghiệm người dùng và tối ưu hóa my-real-time-app :

Mẹo nâng cao trải nghiệm người dùng

  1. Triển khai xác nhận đã đọc

Cung cấp phản hồi trực quan cho người dùng khi người nhận đã đọc tin nhắn của họ. Điều này nâng cao tính chất tương tác của các cuộc trò chuyện thời gian thực.


 // my-real-time-app/app/components/Message.js function Message({ content, status }) { return ( <div> <p>{content}</p> {status === 'read' && <span>✓ Read</span>} </div> ); }


  1. Hiển thị trạng thái trực tuyến

Hiển thị chỉ báo bên cạnh tên hoặc hình đại diện của người dùng khi họ trực tuyến.


 // my-real-time-app/app/components/UserStatus.js function UserStatus({ isOnline }) { return ( <div> {isOnline ? <span className="online-indicator"></span> : <span className="offline-indicator"></span>} </div> ); }

Tối ưu hóa các hành động của máy chủ để giảm độ trễ

  1. Batch phía máy chủ

Cập nhật hàng loạt phía máy chủ nếu khả thi để giảm số lượng thư được gửi tới máy khách.


  1. Nén tin nhắn WebSocket

Đối với các ứng dụng có tần suất cập nhật cao, hãy xem xét việc nén thông báo WebSocket để giảm dữ liệu được truyền và tăng tốc độ.


 // Example: Setting up compression with a WebSocket server const WebSocket = require('ws'); const wss = new WebSocket.Server({ perMessageDeflate: { zlibDeflateOptions: { // Add compression options here } } });


  1. Ra mắt các bản cập nhật thường xuyên

Nếu bạn nhận thấy các bản cập nhật liên tục nhanh chóng từ khách hàng, hãy xem xét gỡ lỗi những bản cập nhật này để hợp nhất chúng thành các bản cập nhật ít hơn, có ý nghĩa hơn.

Đảm bảo tính toàn vẹn dữ liệu và khả năng chịu lỗi

  1. tìm nguồn cung ứng sự kiện

Đối với các phần quan trọng trong ứng dụng của bạn, nơi tính toàn vẹn của dữ liệu là tối quan trọng, hãy cân nhắc áp dụng mẫu tìm nguồn cung ứng sự kiện. Điều này đảm bảo mọi thay đổi đối với trạng thái ứng dụng được ghi lại dưới dạng một sự kiện, cho phép khôi phục và phát lại các sự kiện một cách đáng tin cậy.


  1. Thực hiện Thử lại logic

Đảm bảo rằng nếu thư không gửi được hoặc cập nhật không được thực hiện do sự cố mạng, sẽ có cơ chế thử lại.


 // Example: Simple retry logic with fetch let retries = 3; function fetchData(url) { fetch(url) .then(response => response.json()) .catch(error => { if (retries > 0) { retries--; fetchData(url); } else { console.error('Failed to fetch data after 3 retries'); } }); }


  1. Kế hoạch sao lưu và phục hồi

Thường xuyên sao lưu dữ liệu và đảm bảo bạn có kế hoạch và quy trình rõ ràng để khôi phục dữ liệu trong trường hợp hỏng hóc. Sử dụng sao chép cơ sở dữ liệu hoặc cơ sở dữ liệu phân tán như Cassandra để có khả năng chịu lỗi.


Lưu ý: Thành công liên tục của my-real-time-app không chỉ phụ thuộc vào các chức năng cốt lõi của nó mà còn phụ thuộc vào các cải tiến tinh tế và tối ưu hóa liên tục để đảm bảo trải nghiệm người dùng mượt mà. Bằng cách kết hợp các chiến lược được liệt kê ở trên, chúng tôi sẵn sàng cung cấp cho người dùng trải nghiệm trò chuyện vượt trội, đáng tin cậy và thú vị.



11. Kết luận và triển vọng tương lai

Tóm tắt hành trình xây dựng ứng dụng thời gian thực

Hành trình của chúng tôi với my-real-time-app đã đưa chúng tôi từ thiết lập ban đầu với Next.js 13.4, thông qua xây dựng phụ trợ với các hành động của máy chủ, thiết kế trải nghiệm giao diện người dùng liền mạch và đảm bảo các khả năng thời gian thực đã được thử nghiệm và tối ưu hóa. Chúng tôi đã đào sâu vào các sắc thái của các thành phần máy chủ và máy khách, đảm bảo sự cân bằng hiệu quả giữa kết xuất phía máy chủ và tương tác phía máy khách.

Tác động và tầm quan trọng của các hành động máy chủ của Next.js 13.4 trong dự án

Việc giới thiệu các hành động máy chủ trong Next.js 13.4 đã cách mạng hóa cách tiếp cận của chúng tôi đối với các ứng dụng thời gian thực. Nó cho phép chúng tôi xây dựng một ứng dụng trò chuyện có tính tương tác cao, tận dụng thế mạnh của cả kết xuất máy chủ và máy khách. Điều này không chỉ tối ưu hóa hiệu suất mà còn tạo điều kiện thuận lợi cho các tương tác người dùng liền mạch mà không ảnh hưởng đến tính bảo mật hoặc hiệu quả.

Các cải tiến và tính năng trong tương lai có thể được thêm vào ứng dụng

Mặc dù my-real-time-app đã đi được một chặng đường dài nhưng tiềm năng cho những cải tiến trong tương lai vẫn còn rất lớn:

  1. Tích hợp trò chuyện video : Giới thiệu khả năng trò chuyện video thời gian thực.
  2. Trò chuyện nhóm : Cho phép người dùng tạo, tham gia hoặc rời khỏi cuộc trò chuyện nhóm.
  3. Mã hóa đầu cuối : Tăng cường bảo mật bằng cách mã hóa tin nhắn để chỉ người gửi và người nhận mới có thể giải mã chúng.
  4. Hồ sơ người dùng có thể tùy chỉnh : Cung cấp cho người dùng tùy chọn cá nhân hóa hồ sơ của họ bằng hình đại diện, thông báo trạng thái và chủ đề.
  5. Chatbots : Triển khai các chatbot do AI điều khiển để phản hồi tự động.


12. Tài nguyên và Đọc thêm

Khi bạn bắt đầu hành trình của mình với các ứng dụng thời gian thực và tìm hiểu sâu hơn về các chức năng cũng như điểm phức tạp của Next.js, đây là danh sách các tài nguyên được tuyển chọn có thể hướng dẫn, truyền cảm hứng và giáo dục thêm cho bạn:

Tài liệu chính thức

  • Tài liệu chính thức của Next.js : Hướng dẫn toàn diện về mọi thứ mới và cải tiến trong phiên bản này. Đọc ở đây .
  • Hành động máy chủ trong Next.js : Tìm hiểu sâu về hoạt động, phương pháp hay nhất và tiềm năng của hành động máy chủ, ngay từ nguồn. Đọc thêm .
  • Bộ định tuyến ứng dụng : Hiểu các khả năng của Bộ định tuyến ứng dụng, đặc biệt là liên quan đến các Thành phần máy chủ React. Khám phá tại đây .
  • Các thành phần máy chủ phản ứng : Hướng dẫn cơ bản về cách sử dụng tốt nhất các thành phần máy chủ để tối ưu hóa hiệu suất và tính linh hoạt. Học ở đây .


Kết thúc

Trước hết, xin chân thành cảm ơn bạn đã đồng hành cùng tôi qua mê cung phức tạp này của thế giới Next.js. Nếu bạn đã làm được điều này cho đến nay, xin chúc mừng! Nếu bạn đọc lướt qua một số phần, tôi không trách bạn – đã có lúc tôi muốn bỏ qua việc viết chúng!


Xây dựng các ứng dụng thời gian thực, theo nhiều cách, là một chuyến tàu lượn đầy cảm xúc. Một số ngày, tôi cảm thấy mình là một thiên tài viết mã, trong khi những ngày khác, tôi đặt câu hỏi về mọi lựa chọn trong cuộc sống đã đưa tôi trở thành một nhà phát triển.


Bạn đã bao giờ dành hàng giờ để gỡ lỗi một vấn đề, chỉ để nhận ra rằng bạn đã bỏ lỡ một dấu chấm phẩy chưa? Hoặc khi bạn vô tình xóa một phần thiết yếu trong mã của mình và ước cuộc sống có Ctrl + Z? Ôi, niềm vui của lập trình!


Nhưng vấn đề là ở đây: giữa tất cả những cái nhìn bằng lòng bàn tay và thỉnh thoảng bị giật tóc, có một điều kỳ diệu không thể diễn tả được khi nhìn thấy tác phẩm của bạn trở nên sống động, trong thời gian thực. Đó là niềm vui nho nhỏ khi mã của bạn chạy không có lỗi, sự hài lòng khi người dùng yêu thích ứng dụng của bạn và niềm tự hào khi biết bạn đã tạo ra thứ gì đó từ đầu.


Đối với mọi nhà phát triển vừa chớm nở đang đọc điều này: thất bại, thất vọng và 'tại sao điều này không hoạt động!?' khoảnh khắc là một phần và bưu kiện của cuộc hành trình của chúng tôi. Chúng không phải là dấu hiệu cho thấy bạn đang thất bại, mà là những bước đệm để trở nên tốt hơn.


Vì vậy, lần tới khi mã của bạn từ chối hợp tác, hãy hít một hơi thật sâu, lấy một ít cà phê (hoặc trà, tôi không phán xét, bản thân tôi là một người hâm mộ matecocido ) và hãy nhớ rằng bạn không đơn độc trong việc này.


Tiếp tục vượt qua ranh giới, tiếp tục học hỏi và nhớ rằng mọi dòng mã, dù hoạt động hay bị lỗi, đều thêm một chương vào câu chuyện nhà phát triển của bạn.


Và nếu bạn cần một tiếng cười hoặc một bờ vai để khóc (dĩ nhiên là gần như vậy), hãy biết rằng tôi đã ở đó, làm điều đó và đã cảm thấy thất vọng đến mức phải ném máy tính xách tay của mình ra ngoài cửa sổ!


Đây là để có nhiều cuộc phiêu lưu viết mã hơn và ít lỗi do dấu chấm phẩy gây ra hơn!

Chúc mừng và viết mã vui vẻ!