Đặt câu hỏi và nhận tóm tắt tài liệu bằng cách tham chiếu trang này và nhà cung cấp AI bạn chọn
Nội dung của trang này đã được dịch bằng AI.
Xem phiên bản mới nhất của nội dung gốc bằng tiếng AnhNếu bạn có ý tưởng để cải thiện tài liệu này, vui lòng đóng góp bằng cách gửi pull request trên GitHub.
Liên kết GitHub tới tài liệuSao chép Markdown của tài liệu vào bộ nhớ tạm
Intlayer hỗ trợ nội dung rich text được định nghĩa bằng cú pháp Markdown. Điều này cho phép bạn dễ dàng viết và duy trì nội dung được định dạng phong phú như blog, bài viết, và hơn thế nữa.
Bạn có thể khai báo nội dung Markdown bằng cách sử dụng hàm md hoặc đơn giản là một chuỗi (nếu nó chứa cú pháp Markdown).
Bắt đầu từ phiên bản 8.10.0, bạn có thể khai báo nội dung Markdown trực tiếp trong các tệp .content.md. Intlayer sẽ tự động phát hiện và phân tích nội dung Markdown.
Sao chép đoạn mã vào khay nhớ tạm (clipboard)
---key: my-markdown-contentdescription: Nội dung của tôilocale: en---# Nội dung của tôiDưới đây là một ví dụ về nội dung markdownTrường front-matter locale là trường xác định ngôn ngữ của nội dung. Nó là tùy chọn. Nếu không được cung cấp, Intlayer sẽ sử dụng ngôn ngữ mặc định, ngôn ngữ này cũng được sử dụng làm ngôn ngữ dự phòng nếu không có bản dịch cho một ngôn ngữ cụ thể.
Ví dụ về cấu trúc tệp:
Sao chép đoạn mã vào khay nhớ tạm (clipboard)
content├── markdown-file.en.content.md├── markdown-file.fr.content.md└── markdown-file.es.content.mdBạn có thể thêm vào front-matter bất kỳ thuộc tính nào được định nghĩa trong Định nghĩa Từ điển
Intlayer cung cấp hai cách độc lập để render Markdown:
Thông qua useIntlayer
— Intlayer tự động chuyển đổi node md thành đầu ra nguyên bản của framework (JSX, VNode, chuỗi HTML).
.metadata. Bạn có thể ghi đè quá trình render ở hai cấp độ — toàn cục với MarkdownProvider (hoặc tương đương trong framework) và cục bộ trên mỗi node bằng .use(). Cả hai đều có thể được kết hợp; .use() được ưu tiên hơn MarkdownProvider, và MarkdownProvider được ưu tiên hơn mặc định.Các tiện ích hỗ trợ — <MarkdownRenderer />, useMarkdownRenderer(), và renderMarkdown() là các công cụ độc lập chấp nhận chỉ các chuỗi Markdown thô. Chúng độc lập với useIntlayer và không hoạt động với các node được trang trí mà nó trả về.
Render Markdown hỗ trợ MDX — sử dụng bất kỳ component JSX/framework nào bằng tên trực tiếp bên trong Markdown của bạn.
useIntlayer)Các node Markdown có thể được render trực tiếp dưới dạng JSX.
Sao chép đoạn mã vào khay nhớ tạm (clipboard)
import { useIntlayer } from "react-intlayer";import { MarkdownProvider } from "react-intlayer/markdown";const AppContent = () => { const { myMarkdownContent } = useIntlayer("app"); return <div>{myMarkdownContent}</div>;};const App = () => ( <MarkdownProvider components={{ h1: ({ children }) => <h1 style={{ color: "red" }}>{children}</h1>, MyButton: (props) => <button {...props} />, // Component MDX }} > <AppContent /> </MarkdownProvider>);Nếu không có MarkdownProvider, Intlayer sẽ render markdown bằng cách sử dụng trình phân tích cú pháp Markdown sang JSX mặc định.
Bạn cũng có thể cung cấp các ghi đè cục bộ cho các node cụ thể bằng phương thức .use():
Sao chép đoạn mã vào khay nhớ tạm (clipboard)
{myMarkdownContent.use({ h1: ({ children }) => <h1 style={{ color: "red" }}>{children}</h1>,})}Bạn có thể lấy Markdown dưới dạng chuỗi:
Sao chép đoạn mã vào khay nhớ tạm (clipboard)
{myMarkdownContent.value}{String(myMarkdownContent)}{myMarkdownContent.toString()}Và bạn có thể truy cập siêu dữ liệu markdown của mình như sau:
Sao chép đoạn mã vào khay nhớ tạm (clipboard)
{myMarkdownContent.metadata}{myMarkdownContent.metadata.title}Các tiện ích này chỉ render các chuỗi Markdown thô và độc lập với useIntlayer. Hãy sử dụng chúng khi bạn cần render Markdown từ các nguồn khác ngoài từ điển của bạn.
<MarkdownRenderer />Render một chuỗi Markdown với các tùy chọn cụ thể.
Sao chép đoạn mã vào khay nhớ tạm (clipboard)
import { MarkdownRenderer } from "react-intlayer/markdown";<MarkdownRenderer forceBlock={true} tagfilter={true}> {"# Tiêu đề của tôi"}</MarkdownRenderer>useMarkdownRenderer()Nhận một hàm render đã được cấu hình trước.
Sao chép đoạn mã vào khay nhớ tạm (clipboard)
import { useMarkdownRenderer } from "react-intlayer/markdown";const renderMarkdown = useMarkdownRenderer({ forceBlock: true, components: { h1: (props) => <h1 {...props} className="custom" /> }});return renderMarkdown("# Tiêu đề của tôi");renderMarkdown()Tiện ích độc lập để render bên ngoài các component.
Sao chép đoạn mã vào khay nhớ tạm (clipboard)
import { renderMarkdown } from "react-intlayer/markdown";const jsx = renderMarkdown("# Tiêu đề của tôi", { forceBlock: true });MarkdownProviderMarkdownProvider (hoặc tương đương trong framework) cấu hình pipeline render Markdown cho toàn bộ ứng dụng của bạn. Điều này áp dụng cho cả render useIntlayer tự động và các tiện ích hỗ trợ. Các tùy chọn được đặt ở đây là mặc định — .use() sẽ ghi đè chúng ở cấp độ node.
Sao chép đoạn mã vào khay nhớ tạm (clipboard)
import { MarkdownProvider } from "react-intlayer/markdown";export const AppProvider = ({ children }) => ( <MarkdownProvider components={{ h1: (props) => <h1 style={{color: 'green'}} {...props} />, a: ({ href, ...props }) => <a style={{color: 'red'}} {...props} />, MyCustomJSXComponent: (props) => <span style={{color: 'red'}} {...props} />, }} > {children} </MarkdownProvider>);Hỗ trợ MDX — bất kỳ tên component nào được sử dụng bên trong Markdown của bạn (ví dụ:<MyCustomJSXComponent />) đều được phân giải dựa trên bản đồcomponents.
Bạn cũng có thể sử dụng trình render markdown của riêng mình:
Sao chép đoạn mã vào khay nhớ tạm (clipboard)
import { MarkdownProvider } from "react-intlayer/markdown";export const AppProvider = ({ children }) => ( <MarkdownProvider renderMarkdown={async (md) => { // Use dynamic import to reduce the bundle size of your application const { renderMarkdown } = await import('react-intlayer/markdown'); return renderMarkdown(md); }} > {children} </MarkdownProvider>);Việc nhập trình render Markdown của bạn một cách động là một cách tuyệt vời để giảm dung lượng bundle của ứng dụng.
Trình kết xuất Markdown của Intlayer được tải động. Mặc dù được tối ưu hóa, đoạn phân tích cú pháp cơ bản là khoảng 55kb. Tải điều này đồng bộ sẽ trì hoãn kết xuất trang ban đầu và làm suy giảm First Contentful Paint (FCP).
Để ngăn chặn việc chặn giao diện người dùng, Intlayer tích hợp với Suspense API của React. Nó tìm nạp trình phân tích cú pháp trong nền và ném Promise trong khi tải xuống.
Bọc bất kỳ thành phần nào kết xuất Intlayer Markdown trong ranh giới <Suspense>. Điều này hiển thị trạng thái dự phòng được bản địa hóa trong khi đoạn phim tải xuống, cho phép phần còn lại của DOM của bạn kết xuất ngay lập tức.
Cảnh báo: Nếu bạn không cung cấp ranh giới <Suspense>, React sẽ đình chỉ ở cấp gốc hoặc chặn toàn bộ cây thành phần khỏi kết xuất cho đến khi đoạn 55kb được tải hoàn toàn.
Trong Next.js App Router, bạn có thể sử dụng React Suspense cho các thành phần máy khách hoặc tệp loading.tsx cho các thành phần máy chủ.
Thành phần máy khách:
Sao chép đoạn mã vào khay nhớ tạm (clipboard)
"use client";import { useIntlayer } from "next-intlayer";import { Suspense } from "react";const MyComponent = () => {const markdownContent = useIntlayer("my-markdown");return ( <Suspense fallback={<div>Loading...</div>}>{markdownContent}</Suspense>);};Thành phần máy chủ với loading.tsx:
Sao chép đoạn mã vào khay nhớ tạm (clipboard)
export default function Loading() {return <div>Loading...</div>;}Sao chép đoạn mã vào khay nhớ tạm (clipboard)
import { useIntlayer } from "next-intlayer/server";const MyPage = () => {const markdownContent = useIntlayer("my-markdown");return <div>{markdownContent}</div>;};export default MyPage;So với các trình phân tích cú pháp Markdown khác như remark / rehype, Intlayer Markdown không phụ thuộc và chạy trên cả client lẫn server.
Nhưng Intlayer tối ưu hóa việc phân tích cú pháp cho các framework Server-Side Rendering (SSR) (như Next.js App Router, React Router, Nuxt, SvelteKit, v.v.).
Thay vì gửi chuỗi Markdown thô đến client và phân tích cú pháp trên trình duyệt (gây giảm hiệu suất), Intlayer cho phép bạn phân tích cú pháp trước Markdown thành Cây Cú Pháp Trừu Tượng (AST) trên server.
Bạn có thể sử dụng hàm parseMarkdown từ gói Intlayer của framework phía server để tạo ra một AST có thể tuần tự hóa (đối tượng ParsedMarkdown), và chuyển trực tiếp đến frontend. Tất cả các tiện ích render của Intlayer (như <MarkdownRenderer>, useMarkdownRenderer, v.v.) tự động chấp nhận đối tượng AST này và hiển thị nó một cách liền mạch.
Sao chép đoạn mã vào khay nhớ tạm (clipboard)
import { parseMarkdown } from "react-intlayer/markdown";// 1. Trên server: Phân tích cú pháp markdown thành AST có thể tuần tự hóaexport const loader = async () => { const markdownString = "## My title \n\nLorem Ipsum"; const ast = parseMarkdown(markdownString); // Trả về AST dưới dạng JSON cho client return Response.json({ content: ast });};Sao chép đoạn mã vào khay nhớ tạm (clipboard)
import { useLoaderData } from "react-router";import { MarkdownRenderer } from "react-intlayer/markdown";// 2. Trên client: Hiển thị trực tiếp AST mà không cần phân tích cú pháp lạiexport default function Page() { const { content } = useLoaderData(); // Trình kết xuất chấp nhận chuỗi thô hoặc AST đã được phân tích cú pháp return <MarkdownRenderer content={content} />;}Mẫu này đảm bảo logic phân tích cú pháp Markdown được thực thi hoàn toàn trên server, giảm đáng kể thời gian thực thi phía client và cải thiện tốc độ hydrat hóa ban đầu.
Các tùy chọn này có thể được truyền đến MarkdownProvider, MarkdownRenderer, useMarkdownRenderer và renderMarkdown.
Mở bảng trong một cửa sổ bật lên để xem toàn bộ nội dung dữ liệu một cách rõ ràng
| Option | Type | Default | Mô tả |
|---|---|---|---|
forceBlock | boolean | false | Bắt buộc đầu ra phải được bọc trong một phần tử cấp khối (ví dụ: <div>). |
forceInline | boolean | false | Bắt buộc đầu ra phải được bọc trong một phần tử nội tuyến (ví dụ: <span>). |
tagfilter | boolean | true | Bật Bộ lọc thẻ GitHub để cải thiện bảo mật bằng cách loại bỏ các thẻ HTML nguy hiểm. |
preserveFrontmatter | boolean | false | Nếu true, frontmatter ở đầu chuỗi Markdown sẽ không bị tước đi. |
components | Overrides | {} | Bản đồ các thẻ HTML cho các thành phần tùy chỉnh (ví dụ: { h1: MyHeading }). |
wrapper | Component | null | Thành phần tùy chỉnh để bọc Markdown đã kết xuất. |
renderMarkdown | Function | null | Chức năng kết xuất tùy chỉnh để thay thế hoàn toàn trình biên dịch Markdown mặc định. |