Khám phá React Server Actions, một tính năng mạnh mẽ để xử lý việc gửi form và thay đổi dữ liệu trực tiếp trên máy chủ, giúp đơn giản hóa việc phát triển React và tăng cường bảo mật.
React Server Actions: Đơn Giản Hóa Xử Lý Form Phía Máy Chủ
React Server Actions, được giới thiệu trong React 18 và được cải tiến đáng kể trong Next.js, mang đến một cách tiếp cận đột phá để xử lý việc gửi form và thay đổi dữ liệu trực tiếp trên máy chủ. Tính năng mạnh mẽ này giúp đơn giản hóa quy trình phát triển, tăng cường bảo mật và cải thiện hiệu suất so với các phương pháp tìm nạp và thao tác dữ liệu phía máy khách truyền thống.
React Server Actions là gì?
Server Actions là các hàm bất đồng bộ chạy trên máy chủ và có thể được gọi trực tiếp từ các component React. Chúng cho phép bạn thực hiện các tác vụ phía máy chủ, chẳng hạn như:
- Gửi Form: Xử lý dữ liệu form một cách an toàn trên máy chủ.
- Thay đổi dữ liệu: Cập nhật cơ sở dữ liệu hoặc các API bên ngoài.
- Xác thực: Xử lý đăng nhập và đăng ký người dùng.
- Logic phía máy chủ: Thực thi logic nghiệp vụ phức tạp mà không để lộ ra phía máy khách.
Lợi thế chính của Server Actions là chúng cho phép bạn viết mã phía máy chủ ngay trong các component React của mình, loại bỏ nhu cầu về các API route riêng biệt và logic tìm nạp dữ liệu phức tạp phía máy khách. Việc kết hợp giao diện người dùng và logic phía máy chủ này dẫn đến một codebase dễ bảo trì và hiệu quả hơn.
Lợi ích của việc sử dụng React Server Actions
Sử dụng React Server Actions mang lại một số lợi ích đáng kể:
Phát triển đơn giản hóa
Server Actions giảm thiểu mã soạn sẵn (boilerplate code) bằng cách cho phép bạn xử lý việc gửi form và thay đổi dữ liệu trực tiếp trong các component React của mình. Điều này loại bỏ sự cần thiết của các API endpoint riêng biệt và logic tìm nạp dữ liệu phức tạp phía máy khách, giúp tinh giản quy trình phát triển và làm cho mã của bạn dễ hiểu và dễ bảo trì hơn. Hãy xem xét một form liên hệ đơn giản. Nếu không có Server Actions, bạn sẽ cần một API route riêng để xử lý việc gửi form, JavaScript phía máy khách để gửi dữ liệu và logic xử lý lỗi ở cả máy khách và máy chủ. Với Server Actions, tất cả những điều này có thể được xử lý ngay trong chính component đó.
Tăng cường bảo mật
Bằng cách chạy mã trên máy chủ, Server Actions làm giảm bề mặt tấn công của ứng dụng của bạn. Dữ liệu nhạy cảm và logic nghiệp vụ được giữ xa khỏi máy khách, ngăn chặn người dùng độc hại can thiệp vào chúng. Ví dụ, thông tin đăng nhập cơ sở dữ liệu hoặc khóa API không bao giờ bị lộ trong mã phía máy khách. Tất cả các tương tác với cơ sở dữ liệu đều diễn ra trên máy chủ, giảm thiểu nguy cơ tấn công SQL injection hoặc truy cập dữ liệu trái phép.
Cải thiện hiệu suất
Server Actions có thể cải thiện hiệu suất bằng cách giảm lượng JavaScript cần được tải xuống và thực thi trên máy khách. Điều này đặc biệt có lợi cho người dùng trên các thiết bị cấu hình thấp hoặc có kết nối internet chậm. Việc xử lý dữ liệu diễn ra trên máy chủ, và chỉ những cập nhật giao diện người dùng cần thiết mới được gửi đến máy khách, dẫn đến thời gian tải trang nhanh hơn và trải nghiệm người dùng mượt mà hơn.
Cập nhật lạc quan (Optimistic Updates)
Server Actions tích hợp liền mạch với Suspense và Transitions của React, cho phép cập nhật lạc quan. Cập nhật lạc quan cho phép bạn cập nhật giao diện người dùng ngay lập tức, ngay cả trước khi máy chủ xác nhận hành động. Điều này mang lại trải nghiệm người dùng phản hồi nhanh và hấp dẫn hơn, vì người dùng không phải đợi máy chủ phản hồi trước khi thấy kết quả hành động của họ. Trong thương mại điện tử, việc thêm một mặt hàng vào giỏ hàng có thể được hiển thị ngay lập tức trong khi máy chủ xác nhận việc thêm vào ở chế độ nền.
Nâng cao lũy tiến (Progressive Enhancement)
Server Actions hỗ trợ nâng cao lũy tiến, có nghĩa là ứng dụng của bạn vẫn có thể hoạt động ngay cả khi JavaScript bị tắt hoặc không tải được. Khi JavaScript bị tắt, các form sẽ gửi đi như các form HTML truyền thống, và máy chủ sẽ xử lý việc gửi và chuyển hướng người dùng đến một trang mới. Điều này đảm bảo rằng ứng dụng của bạn vẫn có thể truy cập được bởi tất cả người dùng, bất kể cấu hình trình duyệt hoặc điều kiện mạng của họ. Điều này đặc biệt quan trọng cho khả năng truy cập và SEO.
Cách sử dụng React Server Actions
Để sử dụng React Server Actions, bạn cần sử dụng một framework hỗ trợ chúng, chẳng hạn như Next.js. Dưới đây là hướng dẫn từng bước:
1. Định nghĩa Server Action
Tạo một hàm bất đồng bộ sẽ chạy trên máy chủ. Hàm này nên xử lý logic bạn muốn thực thi trên máy chủ, chẳng hạn như cập nhật cơ sở dữ liệu hoặc gọi một API. Đánh dấu hàm bằng chỉ thị `"use server"` ở trên cùng để chỉ ra rằng đó là một Server Action. Chỉ thị này cho trình biên dịch React biết để xử lý hàm như một hàm phía máy chủ và tự động xử lý việc tuần tự hóa và giải tuần tự hóa dữ liệu giữa máy khách và máy chủ.
// app/actions.js
'use server'
import { revalidatePath } from 'next/cache';
import { saveMessage } from './db';
export async function createMessage(prevState, formData) {
const message = formData.get('message');
try {
await saveMessage(message);
revalidatePath('/'); // Xóa bộ đệm của route
return { message: 'Tin nhắn đã được lưu thành công!' };
} catch (e) {
return { message: 'Không thể lưu tin nhắn' };
}
}
Giải thích:
- Chỉ thị `'use server'` đánh dấu hàm này là một Server Action.
- `revalidatePath('/')` xóa bộ đệm của route, đảm bảo dữ liệu cập nhật sẽ được tìm nạp trong yêu cầu tiếp theo. Điều này rất quan trọng để duy trì tính nhất quán của dữ liệu.
- `saveMessage(message)` là một trình giữ chỗ cho logic tương tác cơ sở dữ liệu thực tế của bạn. Nó giả định rằng bạn có một hàm `saveMessage` được định nghĩa ở nơi khác để xử lý việc lưu tin nhắn vào cơ sở dữ liệu của bạn.
- Hàm trả về một đối tượng trạng thái có thể được sử dụng để hiển thị phản hồi cho người dùng.
2. Nhập và sử dụng Server Action trong Component của bạn
Nhập Server Action vào component React của bạn và sử dụng nó làm prop `action` trên một phần tử form. Hook `useFormState` có thể được sử dụng để quản lý trạng thái của form và hiển thị phản hồi cho người dùng.
// app/page.jsx
'use client';
import { useFormState } from 'react-dom';
import { createMessage } from './actions';
export default function Home() {
const [state, formAction] = useFormState(createMessage, {message: ''});
return (
);
}
Giải thích:
- Chỉ thị `'use client'` chỉ định rằng đây là một Client Component (vì nó đang sử dụng `useFormState`).
- `useFormState(createMessage, {message: ''})` khởi tạo trạng thái form với Server Action `createMessage`. Đối số thứ hai là trạng thái ban đầu.
- Prop `action` của phần tử `form` được đặt thành `formAction` được trả về bởi `useFormState`.
- Biến `state` chứa giá trị trả về từ Server Action, có thể được sử dụng để hiển thị phản hồi cho người dùng.
3. Xử lý dữ liệu Form
Bên trong Server Action, bạn có thể truy cập dữ liệu form bằng cách sử dụng `FormData` API. API này cung cấp một cách tiện lợi để truy cập giá trị của các trường trong form.
'use server'
export async function createMessage(prevState, formData) {
const message = formData.get('message');
// ...
}
4. Xử lý lỗi
Sử dụng các khối `try...catch` để xử lý các lỗi có thể xảy ra trong quá trình thực thi Server Action. Trả về một thông báo lỗi trong đối tượng trạng thái để hiển thị cho người dùng.
'use server'
export async function createMessage(prevState, formData) {
const message = formData.get('message');
try {
// ...
} catch (e) {
return { message: 'Không thể lưu tin nhắn' };
}
}
5. Xác thực lại dữ liệu
Sau khi một Server Action đã thay đổi dữ liệu thành công, bạn có thể cần xác thực lại bộ đệm dữ liệu để đảm bảo rằng giao diện người dùng phản ánh những thay đổi mới nhất. Sử dụng các hàm `revalidatePath` hoặc `revalidateTag` từ `next/cache` để xác thực lại các đường dẫn hoặc thẻ cụ thể.
'use server'
import { revalidatePath } from 'next/cache';
export async function createMessage(prevState, formData) {
// ...
revalidatePath('/'); // Xóa bộ đệm của route
// ...
}
Sử dụng nâng cao
Thay đổi dữ liệu
Server Actions đặc biệt phù hợp để thay đổi dữ liệu, chẳng hạn như cập nhật cơ sở dữ liệu hoặc các API bên ngoài. Bạn có thể sử dụng Server Actions để xử lý các thay đổi dữ liệu phức tạp đòi hỏi logic phía máy chủ, chẳng hạn như xác thực dữ liệu, thực hiện tính toán hoặc tương tác với nhiều nguồn dữ liệu. Hãy xem xét một kịch bản nơi bạn cần cập nhật hồ sơ người dùng và gửi email xác nhận. Một Server Action có thể xử lý cả việc cập nhật cơ sở dữ liệu và quy trình gửi email trong một hoạt động đơn lẻ, nguyên tử.
Xác thực và ủy quyền
Server Actions có thể được sử dụng để xử lý xác thực và ủy quyền. Bằng cách thực hiện kiểm tra xác thực và ủy quyền trên máy chủ, bạn có thể đảm bảo rằng chỉ những người dùng được ủy quyền mới có quyền truy cập vào dữ liệu và chức năng nhạy cảm. Bạn có thể sử dụng Server Actions để xử lý đăng nhập, đăng ký và đặt lại mật khẩu của người dùng. Ví dụ, một Server Action có thể xác minh thông tin đăng nhập của người dùng so với cơ sở dữ liệu và trả về một token có thể được sử dụng để xác thực các yêu cầu tiếp theo.
Edge Functions
Server Actions có thể được triển khai dưới dạng Edge Functions, chạy trên một mạng lưới máy chủ toàn cầu gần gũi với người dùng của bạn. Điều này có thể giảm đáng kể độ trễ và cải thiện hiệu suất, đặc biệt đối với người dùng ở các vị trí địa lý phân tán. Edge Functions là lý tưởng để xử lý các Server Actions đòi hỏi độ trễ thấp, chẳng hạn như cập nhật dữ liệu thời gian thực hoặc cung cấp nội dung cá nhân hóa. Next.js cung cấp hỗ trợ tích hợp để triển khai Server Actions dưới dạng Edge Functions.
Streaming
Server Actions hỗ trợ streaming, cho phép bạn gửi dữ liệu đến máy khách theo từng đoạn khi nó có sẵn. Điều này có thể cải thiện hiệu suất cảm nhận được của ứng dụng của bạn, đặc biệt đối với các Server Actions mất nhiều thời gian để thực thi. Streaming đặc biệt hữu ích để xử lý các tập dữ liệu lớn hoặc các tính toán phức tạp. Ví dụ, bạn có thể stream kết quả tìm kiếm đến máy khách khi chúng được lấy từ cơ sở dữ liệu, mang lại trải nghiệm người dùng phản hồi nhanh hơn.
Các phương pháp hay nhất (Best Practices)
Dưới đây là một số phương pháp hay nhất cần tuân theo khi sử dụng React Server Actions:
- Giữ Server Actions nhỏ và tập trung: Mỗi Server Action nên thực hiện một tác vụ duy nhất, được xác định rõ ràng. Điều này giúp mã của bạn dễ hiểu, kiểm tra và bảo trì hơn.
- Sử dụng tên mô tả: Chọn những cái tên chỉ rõ mục đích của Server Action. Ví dụ, `createComment` hoặc `updateUserProfile` tốt hơn những cái tên chung chung như `processData`.
- Xác thực dữ liệu trên máy chủ: Luôn xác thực dữ liệu trên máy chủ để ngăn chặn người dùng độc hại chèn dữ liệu không hợp lệ vào ứng dụng của bạn. Điều này bao gồm việc xác thực các kiểu dữ liệu, định dạng và phạm vi.
- Xử lý lỗi một cách duyên dáng: Sử dụng các khối `try...catch` để xử lý lỗi và cung cấp thông báo lỗi đầy đủ thông tin cho người dùng. Tránh để lộ thông tin lỗi nhạy cảm cho máy khách.
- Sử dụng cập nhật lạc quan: Cung cấp trải nghiệm người dùng phản hồi nhanh hơn bằng cách cập nhật giao diện người dùng ngay lập tức, ngay cả trước khi máy chủ xác nhận hành động.
- Xác thực lại dữ liệu khi cần thiết: Đảm bảo rằng giao diện người dùng phản ánh những thay đổi mới nhất bằng cách xác thực lại bộ đệm dữ liệu sau khi một Server Action đã thay đổi dữ liệu.
Ví dụ trong thế giới thực
Hãy xem xét một số ví dụ thực tế về cách React Server Actions có thể được sử dụng trong các loại ứng dụng khác nhau:
Ứng dụng thương mại điện tử
- Thêm một mặt hàng vào giỏ hàng: Một Server Action có thể xử lý việc thêm một mặt hàng vào giỏ hàng của người dùng và cập nhật tổng giỏ hàng trong cơ sở dữ liệu. Cập nhật lạc quan có thể được sử dụng để hiển thị ngay lập tức mặt hàng trong giỏ hàng.
- Xử lý thanh toán: Một Server Action có thể xử lý việc thanh toán bằng cách sử dụng một cổng thanh toán của bên thứ ba. Server Action cũng có thể cập nhật trạng thái đơn hàng trong cơ sở dữ liệu và gửi email xác nhận cho người dùng.
- Gửi đánh giá sản phẩm: Một Server Action có thể xử lý việc gửi đánh giá sản phẩm và lưu nó vào cơ sở dữ liệu. Server Action cũng có thể tính toán xếp hạng trung bình cho sản phẩm và cập nhật trang chi tiết sản phẩm.
Ứng dụng mạng xã hội
- Đăng một tweet mới: Một Server Action có thể xử lý việc đăng một tweet mới và lưu nó vào cơ sở dữ liệu. Server Action cũng có thể cập nhật dòng thời gian của người dùng và thông báo cho những người theo dõi họ.
- Thích một bài đăng: Một Server Action có thể xử lý việc thích một bài đăng và cập nhật số lượt thích trong cơ sở dữ liệu. Cập nhật lạc quan có thể được sử dụng để hiển thị ngay lập tức số lượt thích đã cập nhật.
- Theo dõi một người dùng: Một Server Action có thể xử lý việc theo dõi một người dùng và cập nhật số lượng người theo dõi và đang theo dõi trong cơ sở dữ liệu.
Hệ thống quản lý nội dung (CMS)
- Tạo một bài đăng blog mới: Một Server Action có thể xử lý việc tạo một bài đăng blog mới và lưu nó vào cơ sở dữ liệu. Server Action cũng có thể tạo một slug cho bài đăng và cập nhật sitemap.
- Cập nhật một trang: Một Server Action có thể xử lý việc cập nhật một trang và lưu nó vào cơ sở dữ liệu. Server Action cũng có thể xác thực lại bộ đệm của trang để đảm bảo rằng nội dung cập nhật được hiển thị cho người dùng.
- Xuất bản một thay đổi: Một Server Action có thể xử lý việc xuất bản một thay đổi vào cơ sở dữ liệu và thông báo cho tất cả những người đăng ký.
Những lưu ý về quốc tế hóa
Khi phát triển các ứng dụng cho đối tượng toàn cầu, điều cần thiết là phải xem xét quốc tế hóa (i18n) và địa phương hóa (l10n). Dưới đây là một số lưu ý khi sử dụng React Server Actions trong các ứng dụng được quốc tế hóa:
- Xử lý các định dạng ngày và giờ khác nhau: Sử dụng `Intl` API để định dạng ngày và giờ theo ngôn ngữ của người dùng.
- Xử lý các định dạng số khác nhau: Sử dụng `Intl` API để định dạng số theo ngôn ngữ của người dùng.
- Xử lý các loại tiền tệ khác nhau: Sử dụng `Intl` API để định dạng tiền tệ theo ngôn ngữ của người dùng.
- Dịch thông báo lỗi: Dịch thông báo lỗi sang ngôn ngữ của người dùng.
- Hỗ trợ các ngôn ngữ từ phải sang trái (RTL): Đảm bảo rằng ứng dụng của bạn hỗ trợ các ngôn ngữ RTL, chẳng hạn như tiếng Ả Rập và tiếng Do Thái.
Ví dụ, khi xử lý một form yêu cầu nhập ngày tháng, một Server Action có thể sử dụng `Intl.DateTimeFormat` API để phân tích ngày tháng theo ngôn ngữ của người dùng, đảm bảo rằng ngày tháng được hiểu đúng bất kể cài đặt khu vực của người dùng.
Kết luận
React Server Actions là một công cụ mạnh mẽ để đơn giản hóa việc xử lý form phía máy chủ và thay đổi dữ liệu trong các ứng dụng React. Bằng cách cho phép bạn viết mã phía máy chủ trực tiếp trong các component React của mình, Server Actions giảm thiểu mã soạn sẵn, tăng cường bảo mật, cải thiện hiệu suất và cho phép cập nhật lạc quan. Bằng cách tuân theo các phương pháp hay nhất được nêu trong hướng dẫn này, bạn có thể tận dụng Server Actions để xây dựng các ứng dụng React mạnh mẽ, có khả năng mở rộng và dễ bảo trì hơn. Khi React tiếp tục phát triển, Server Actions chắc chắn sẽ đóng một vai trò ngày càng quan trọng trong tương lai của phát triển web.