renderToString
renderToString
hiển thị một cây React thành một chuỗi HTML.
const html = renderToString(reactNode, options?)
Tham khảo
renderToString(reactNode, options?)
Trên máy chủ, gọi renderToString
để hiển thị ứng dụng của bạn thành HTML.
import { renderToString } from 'react-dom/server';
const html = renderToString(<App />);
Trên máy khách, gọi hydrateRoot
để làm cho HTML được tạo từ máy chủ trở nên tương tác.
Tham số
-
reactNode
: Một nút React mà bạn muốn hiển thị thành HTML. Ví dụ: một nút JSX như<App />
. -
tùy chọn
options
: Một đối tượng cho hiển thị phía máy chủ.- tùy chọn
identifierPrefix
: Một tiền tố chuỗi mà React sử dụng cho các ID được tạo bởiuseId
. Hữu ích để tránh xung đột khi sử dụng nhiều gốc trên cùng một trang. Phải là cùng một tiền tố như đã truyền chohydrateRoot
.
- tùy chọn
Trả về
Một chuỗi HTML.
Lưu ý
-
renderToString
có hỗ trợ Suspense hạn chế. Nếu một thành phần tạm dừng,renderToString
sẽ gửi ngay lập tức phần dự phòng của nó dưới dạng HTML. -
renderToString
hoạt động trong trình duyệt, nhưng việc sử dụng nó trong mã phía máy khách là không được khuyến nghị.
Cách sử dụng
Hiển thị một cây React thành HTML thành một chuỗi
Gọi renderToString
để hiển thị ứng dụng của bạn thành một chuỗi HTML mà bạn có thể gửi cùng với phản hồi của máy chủ:
import { renderToString } from 'react-dom/server';
// Cú pháp trình xử lý tuyến đường phụ thuộc vào khung máy chủ của bạn
app.use('/', (request, response) => {
const html = renderToString(<App />);
response.send(html);
});
Điều này sẽ tạo ra đầu ra HTML không tương tác ban đầu của các thành phần React của bạn. Trên máy khách, bạn sẽ cần gọi hydrateRoot
để hydrate HTML được tạo từ máy chủ đó và làm cho nó có tính tương tác.
Các lựa chọn thay thế
Di chuyển từ renderToString
sang hiển thị phát trực tuyến trên máy chủ
renderToString
trả về một chuỗi ngay lập tức, vì vậy nó không hỗ trợ truyền trực tuyến nội dung khi nó tải.
Khi có thể, chúng tôi khuyên bạn nên sử dụng các giải pháp thay thế đầy đủ tính năng này:
- Nếu bạn sử dụng Node.js, hãy sử dụng
renderToPipeableStream
. - Nếu bạn sử dụng Deno hoặc một thời gian chạy biên hiện đại với Web Streams, hãy sử dụng
renderToReadableStream
.
Bạn có thể tiếp tục sử dụng renderToString
nếu môi trường máy chủ của bạn không hỗ trợ luồng.
Di chuyển từ renderToString
sang kết xuất trước tĩnh trên máy chủ
renderToString
trả về một chuỗi ngay lập tức, vì vậy nó không hỗ trợ chờ dữ liệu tải để tạo HTML tĩnh.
Chúng tôi khuyên bạn nên sử dụng các giải pháp thay thế đầy đủ tính năng này:
- Nếu bạn sử dụng Node.js, hãy sử dụng
prerenderToNodeStream
. - Nếu bạn sử dụng Deno hoặc một thời gian chạy biên hiện đại với Web Streams, hãy sử dụng
prerender
.
Bạn có thể tiếp tục sử dụng renderToString
nếu môi trường tạo trang web tĩnh của bạn không hỗ trợ luồng.
Loại bỏ renderToString
khỏi mã phía máy khách
Đôi khi, renderToString
được sử dụng trên máy khách để chuyển đổi một số thành phần sang HTML.
// 🚩 Không cần thiết: sử dụng renderToString trên máy khách
import { renderToString } from 'react-dom/server';
const html = renderToString(<MyIcon />);
console.log(html); // Ví dụ: "<svg>...</svg>"
Nhập react-dom/server
trên máy khách làm tăng kích thước gói của bạn một cách không cần thiết và nên tránh. Nếu bạn cần hiển thị một số thành phần sang HTML trong trình duyệt, hãy sử dụng createRoot
và đọc HTML từ DOM:
import { createRoot } from 'react-dom/client';
import { flushSync } from 'react-dom';
const div = document.createElement('div');
const root = createRoot(div);
flushSync(() => {
root.render(<MyIcon />);
});
console.log(div.innerHTML); // Ví dụ: "<svg>...</svg>"
Lệnh gọi flushSync
là cần thiết để DOM được cập nhật trước khi đọc thuộc tính innerHTML
của nó.
Khắc phục sự cố
Khi một thành phần tạm dừng, HTML luôn chứa một dự phòng
renderToString
không hỗ trợ đầy đủ Suspense.
Nếu một số thành phần tạm dừng (ví dụ: vì nó được xác định bằng lazy
hoặc tìm nạp dữ liệu), renderToString
sẽ không đợi nội dung của nó được giải quyết. Thay vào đó, renderToString
sẽ tìm ranh giới <Suspense>
gần nhất ở trên nó và hiển thị thuộc tính fallback
của nó trong HTML. Nội dung sẽ không xuất hiện cho đến khi mã phía máy khách tải.
Để giải quyết vấn đề này, hãy sử dụng một trong các giải pháp phát trực tuyến được đề xuất. Đối với kết xuất phía máy chủ, chúng có thể truyền trực tuyến nội dung theo các đoạn khi nó được giải quyết trên máy chủ để người dùng thấy trang được điền dần dần trước khi mã phía máy khách tải. Đối với tạo trang web tĩnh, chúng có thể đợi tất cả nội dung được giải quyết trước khi tạo HTML tĩnh.