@intlayer/docs 8.10.0-canary.1 → 8.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/docs/ar/dictionary/markdown.md +349 -19
- package/docs/ar/interest_of_intlayer.md +1 -1
- package/docs/bn/interest_of_intlayer.md +1 -1
- package/docs/cs/interest_of_intlayer.md +1 -1
- package/docs/de/dictionary/markdown.md +349 -19
- package/docs/de/interest_of_intlayer.md +1 -1
- package/docs/en/dictionary/markdown.md +338 -20
- package/docs/en/interest_of_intlayer.md +1 -1
- package/docs/en-GB/dictionary/markdown.md +349 -19
- package/docs/en-GB/interest_of_intlayer.md +1 -1
- package/docs/es/dictionary/markdown.md +349 -19
- package/docs/es/interest_of_intlayer.md +1 -1
- package/docs/fr/dictionary/markdown.md +349 -19
- package/docs/fr/interest_of_intlayer.md +1 -1
- package/docs/hi/dictionary/markdown.md +349 -19
- package/docs/hi/interest_of_intlayer.md +1 -1
- package/docs/id/dictionary/markdown.md +349 -19
- package/docs/id/interest_of_intlayer.md +1 -1
- package/docs/it/dictionary/markdown.md +349 -19
- package/docs/it/interest_of_intlayer.md +1 -1
- package/docs/ja/interest_of_intlayer.md +1 -1
- package/docs/ko/dictionary/markdown.md +349 -19
- package/docs/ko/interest_of_intlayer.md +1 -1
- package/docs/nl/interest_of_intlayer.md +1 -1
- package/docs/pl/dictionary/markdown.md +349 -19
- package/docs/pl/interest_of_intlayer.md +1 -1
- package/docs/pt/benchmark/solid.md +1 -1
- package/docs/pt/benchmark/svelte.md +1 -1
- package/docs/pt/dictionary/markdown.md +349 -19
- package/docs/pt/interest_of_intlayer.md +1 -1
- package/docs/ru/dictionary/markdown.md +458 -16
- package/docs/ru/interest_of_intlayer.md +1 -1
- package/docs/tr/dictionary/markdown.md +349 -19
- package/docs/tr/interest_of_intlayer.md +1 -1
- package/docs/uk/dictionary/markdown.md +349 -19
- package/docs/uk/interest_of_intlayer.md +1 -1
- package/docs/ur/interest_of_intlayer.md +1 -1
- package/docs/vi/dictionary/markdown.md +349 -19
- package/docs/vi/interest_of_intlayer.md +1 -1
- package/docs/zh/dictionary/markdown.md +349 -19
- package/docs/zh/interest_of_intlayer.md +1 -1
- package/docs/zh-TW/interest_of_intlayer.md +1 -1
- package/package.json +7 -7
|
@@ -95,34 +95,34 @@ Bạn có thể khai báo nội dung Markdown bằng cách sử dụng hàm `md`
|
|
|
95
95
|
```
|
|
96
96
|
|
|
97
97
|
</Tab>
|
|
98
|
-
<Tab label="
|
|
99
|
-
|
|
98
|
+
<Tab label="Tệp Bên ngoài" value="external-files">
|
|
99
|
+
Nhập trực tiếp các tệp `.md` bằng cách sử dụng hàm `file`.
|
|
100
100
|
|
|
101
101
|
```typescript fileName="markdownDictionary.content.ts"
|
|
102
|
+
import { md, file, t } from "intlayer";
|
|
103
|
+
|
|
102
104
|
export default {
|
|
103
105
|
key: "app",
|
|
104
|
-
contentAutoTransformation: true, // Bật phát hiện tự động nội dung Markdown - Có thể được đặt toàn cục trong intlayer.config.ts
|
|
105
106
|
content: {
|
|
106
|
-
|
|
107
|
+
content: t({
|
|
108
|
+
en: md(file("./myMarkdown.en.md")),
|
|
109
|
+
vi: md(file("./myMarkdown.vi.md")),
|
|
110
|
+
}),
|
|
107
111
|
},
|
|
108
112
|
};
|
|
109
113
|
```
|
|
110
114
|
|
|
111
115
|
</Tab>
|
|
112
116
|
|
|
113
|
-
<Tab label="
|
|
114
|
-
|
|
117
|
+
<Tab label="Phát hiện Tự động" value="automatic-detection">
|
|
118
|
+
Nếu chuỗi chứa các chỉ báo Markdown phổ biến (như tiêu đề, danh sách, liên kết, v.v.), Intlayer sẽ tự động chuyển đổi nó.
|
|
115
119
|
|
|
116
120
|
```typescript fileName="markdownDictionary.content.ts"
|
|
117
|
-
import { md, file, t } from "intlayer";
|
|
118
|
-
|
|
119
121
|
export default {
|
|
120
122
|
key: "app",
|
|
123
|
+
contentAutoTransformation: true, // Bật phát hiện tự động nội dung Markdown - Có thể được đặt toàn cục trong intlayer.config.ts
|
|
121
124
|
content: {
|
|
122
|
-
|
|
123
|
-
en: md(file("./myMarkdown.en.md")),
|
|
124
|
-
vi: md(file("./myMarkdown.vi.md")),
|
|
125
|
-
}),
|
|
125
|
+
myMarkdownContent: "## Tiêu đề của tôi \n\nLorem Ipsum",
|
|
126
126
|
},
|
|
127
127
|
};
|
|
128
128
|
```
|
|
@@ -130,8 +130,6 @@ Bạn có thể khai báo nội dung Markdown bằng cách sử dụng hàm `md`
|
|
|
130
130
|
</Tab>
|
|
131
131
|
</Tabs>
|
|
132
132
|
|
|
133
|
-
---
|
|
134
|
-
|
|
135
133
|
## Render Markdown
|
|
136
134
|
|
|
137
135
|
Intlayer cung cấp hai cách độc lập để render Markdown:
|
|
@@ -147,7 +145,7 @@ Render Markdown hỗ trợ **MDX** — sử dụng bất kỳ component JSX/fram
|
|
|
147
145
|
### 1. Render Tự động (thông qua `useIntlayer`)
|
|
148
146
|
|
|
149
147
|
<Tabs group="framework">
|
|
150
|
-
<Tab label="React
|
|
148
|
+
<Tab label="React" value="react">
|
|
151
149
|
Các node Markdown có thể được render trực tiếp dưới dạng JSX.
|
|
152
150
|
|
|
153
151
|
```tsx fileName="App.tsx"
|
|
@@ -197,6 +195,57 @@ Render Markdown hỗ trợ **MDX** — sử dụng bất kỳ component JSX/fram
|
|
|
197
195
|
{myMarkdownContent.metadata.title}
|
|
198
196
|
```
|
|
199
197
|
|
|
198
|
+
</Tab>
|
|
199
|
+
<Tab label="Next.js" value="nextjs">
|
|
200
|
+
Các node Markdown có thể được render trực tiếp dưới dạng JSX.
|
|
201
|
+
|
|
202
|
+
```tsx fileName="App.tsx"
|
|
203
|
+
import { useIntlayer } from "next-intlayer";
|
|
204
|
+
import { MarkdownProvider } from "next-intlayer/markdown";
|
|
205
|
+
|
|
206
|
+
const AppContent = () => {
|
|
207
|
+
const { myMarkdownContent } = useIntlayer("app");
|
|
208
|
+
|
|
209
|
+
return <div>{myMarkdownContent}</div>;
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
const App = () => (
|
|
213
|
+
<MarkdownProvider
|
|
214
|
+
components={{
|
|
215
|
+
h1: ({ children }) => <h1 style={{ color: "red" }}>{children}</h1>,
|
|
216
|
+
MyButton: (props) => <button {...props} />, // Component MDX
|
|
217
|
+
}}
|
|
218
|
+
>
|
|
219
|
+
<AppContent />
|
|
220
|
+
</MarkdownProvider>
|
|
221
|
+
);
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
> 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.
|
|
225
|
+
|
|
226
|
+
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()`:
|
|
227
|
+
|
|
228
|
+
```tsx
|
|
229
|
+
{myMarkdownContent.use({
|
|
230
|
+
h1: ({ children }) => <h1 style={{ color: "red" }}>{children}</h1>,
|
|
231
|
+
})}
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
Bạn có thể lấy Markdown dưới dạng chuỗi:
|
|
235
|
+
|
|
236
|
+
```tsx
|
|
237
|
+
{myMarkdownContent.value}
|
|
238
|
+
{String(myMarkdownContent)}
|
|
239
|
+
{myMarkdownContent.toString()}
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
Và bạn có thể truy cập siêu dữ liệu markdown của mình như sau:
|
|
243
|
+
|
|
244
|
+
```tsx
|
|
245
|
+
{myMarkdownContent.metadata}
|
|
246
|
+
{myMarkdownContent.metadata.title}
|
|
247
|
+
```
|
|
248
|
+
|
|
200
249
|
</Tab>
|
|
201
250
|
<Tab label="Vue" value="vue">
|
|
202
251
|
Trong Vue, nội dung Markdown có thể được render bằng thẻ `component` tích hợp sẵn hoặc trực tiếp như một node.
|
|
@@ -441,7 +490,7 @@ Render Markdown hỗ trợ **MDX** — sử dụng bất kỳ component JSX/fram
|
|
|
441
490
|
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.
|
|
442
491
|
|
|
443
492
|
<Tabs group="framework">
|
|
444
|
-
<Tab label="React
|
|
493
|
+
<Tab label="React" value="react">
|
|
445
494
|
|
|
446
495
|
#### Component `<MarkdownRenderer />`
|
|
447
496
|
|
|
@@ -479,6 +528,45 @@ Các tiện ích này **chỉ render các chuỗi Markdown thô** và độc l
|
|
|
479
528
|
const jsx = renderMarkdown("# Tiêu đề của tôi", { forceBlock: true });
|
|
480
529
|
```
|
|
481
530
|
|
|
531
|
+
</Tab>
|
|
532
|
+
<Tab label="Next.js" value="nextjs">
|
|
533
|
+
|
|
534
|
+
#### Component `<MarkdownRenderer />`
|
|
535
|
+
|
|
536
|
+
Render một chuỗi Markdown với các tùy chọn cụ thể.
|
|
537
|
+
|
|
538
|
+
```tsx
|
|
539
|
+
import { MarkdownRenderer } from "next-intlayer/markdown";
|
|
540
|
+
|
|
541
|
+
<MarkdownRenderer forceBlock={true} tagfilter={true}>
|
|
542
|
+
{"# Tiêu đề của tôi"}
|
|
543
|
+
</MarkdownRenderer>
|
|
544
|
+
```
|
|
545
|
+
|
|
546
|
+
#### Hook `useMarkdownRenderer()`
|
|
547
|
+
|
|
548
|
+
Nhận một hàm render đã được cấu hình trước.
|
|
549
|
+
|
|
550
|
+
```tsx
|
|
551
|
+
import { useMarkdownRenderer } from "next-intlayer/markdown";
|
|
552
|
+
|
|
553
|
+
const renderMarkdown = useMarkdownRenderer({
|
|
554
|
+
forceBlock: true,
|
|
555
|
+
components: { h1: (props) => <h1 {...props} className="custom" /> }
|
|
556
|
+
});
|
|
557
|
+
|
|
558
|
+
return renderMarkdown("# Tiêu đề của tôi");
|
|
559
|
+
```
|
|
560
|
+
|
|
561
|
+
#### Tiện ích `renderMarkdown()`
|
|
562
|
+
Tiện ích độc lập để render bên ngoài các component.
|
|
563
|
+
|
|
564
|
+
```tsx
|
|
565
|
+
import { renderMarkdown } from "next-intlayer/markdown";
|
|
566
|
+
|
|
567
|
+
const jsx = renderMarkdown("# Tiêu đề của tôi", { forceBlock: true });
|
|
568
|
+
```
|
|
569
|
+
|
|
482
570
|
</Tab>
|
|
483
571
|
<Tab label="Vue" value="vue">
|
|
484
572
|
|
|
@@ -608,14 +696,12 @@ Các tiện ích này **chỉ render các chuỗi Markdown thô** và độc l
|
|
|
608
696
|
</Tab>
|
|
609
697
|
</Tabs>
|
|
610
698
|
|
|
611
|
-
---
|
|
612
|
-
|
|
613
699
|
## Cấu hình Toàn cục với `MarkdownProvider`
|
|
614
700
|
|
|
615
701
|
`MarkdownProvider` (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.
|
|
616
702
|
|
|
617
703
|
<Tabs group="framework">
|
|
618
|
-
<Tab label="React
|
|
704
|
+
<Tab label="React" value="react">
|
|
619
705
|
|
|
620
706
|
```tsx fileName="AppProvider.tsx"
|
|
621
707
|
import { MarkdownProvider } from "react-intlayer/markdown";
|
|
@@ -633,6 +719,7 @@ Các tiện ích này **chỉ render các chuỗi Markdown thô** và độc l
|
|
|
633
719
|
);
|
|
634
720
|
```
|
|
635
721
|
|
|
722
|
+
|
|
636
723
|
> 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`.
|
|
637
724
|
|
|
638
725
|
Bạn cũng có thể sử dụng trình render markdown của riêng mình:
|
|
@@ -643,6 +730,7 @@ Các tiện ích này **chỉ render các chuỗi Markdown thô** và độc l
|
|
|
643
730
|
export const AppProvider = ({ children }) => (
|
|
644
731
|
<MarkdownProvider
|
|
645
732
|
renderMarkdown={async (md) => {
|
|
733
|
+
// Use dynamic import to reduce the bundle size of your application
|
|
646
734
|
const { renderMarkdown } = await import('react-intlayer/markdown');
|
|
647
735
|
return renderMarkdown(md);
|
|
648
736
|
}}
|
|
@@ -654,6 +742,48 @@ Các tiện ích này **chỉ render các chuỗi Markdown thô** và độc l
|
|
|
654
742
|
|
|
655
743
|
> 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.
|
|
656
744
|
|
|
745
|
+
</Tab>
|
|
746
|
+
<Tab label="Next.js" value="nextjs">
|
|
747
|
+
|
|
748
|
+
```tsx fileName="AppProvider.tsx"
|
|
749
|
+
import { MarkdownProvider } from "next-intlayer/markdown";
|
|
750
|
+
|
|
751
|
+
export const AppProvider = ({ children }) => (
|
|
752
|
+
<MarkdownProvider
|
|
753
|
+
components={{
|
|
754
|
+
h1: (props) => <h1 style={{color: 'green'}} {...props} />,
|
|
755
|
+
a: ({ href, ...props }) => <a style={{color: 'red'}} {...props} />,
|
|
756
|
+
MyCustomJSXComponent: (props) => <span style={{color: 'red'}} {...props} />,
|
|
757
|
+
}}
|
|
758
|
+
>
|
|
759
|
+
{children}
|
|
760
|
+
</MarkdownProvider>
|
|
761
|
+
);
|
|
762
|
+
```
|
|
763
|
+
|
|
764
|
+
|
|
765
|
+
> 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`.
|
|
766
|
+
|
|
767
|
+
Bạn cũng có thể sử dụng trình render markdown của riêng mình:
|
|
768
|
+
|
|
769
|
+
```tsx fileName="AppProvider.tsx"
|
|
770
|
+
import { MarkdownProvider } from "next-intlayer/markdown";
|
|
771
|
+
|
|
772
|
+
export const AppProvider = ({ children }) => (
|
|
773
|
+
<MarkdownProvider
|
|
774
|
+
renderMarkdown={async (md) => {
|
|
775
|
+
// Use dynamic import to reduce the bundle size of your application
|
|
776
|
+
const { renderMarkdown } = await import('next-intlayer/markdown');
|
|
777
|
+
return renderMarkdown(md);
|
|
778
|
+
}}
|
|
779
|
+
>
|
|
780
|
+
{children}
|
|
781
|
+
</MarkdownProvider>
|
|
782
|
+
);
|
|
783
|
+
```
|
|
784
|
+
|
|
785
|
+
> 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.
|
|
786
|
+
|
|
657
787
|
</Tab>
|
|
658
788
|
<Tab label="Vue" value="vue">
|
|
659
789
|
|
|
@@ -679,6 +809,9 @@ Các tiện ích này **chỉ render các chuỗi Markdown thô** và độc l
|
|
|
679
809
|
app.mount("#app");
|
|
680
810
|
```
|
|
681
811
|
|
|
812
|
+
|
|
813
|
+
> 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`.
|
|
814
|
+
|
|
682
815
|
Bạn cũng có thể sử dụng trình render markdown của riêng mình:
|
|
683
816
|
|
|
684
817
|
```typescript fileName="main.ts"
|
|
@@ -720,6 +853,9 @@ Các tiện ích này **chỉ render các chuỗi Markdown thô** và độc l
|
|
|
720
853
|
</MarkdownProvider>
|
|
721
854
|
```
|
|
722
855
|
|
|
856
|
+
|
|
857
|
+
> 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`.
|
|
858
|
+
|
|
723
859
|
Bạn cũng có thể sử dụng trình render markdown của riêng mình:
|
|
724
860
|
|
|
725
861
|
```svelte fileName="App.svelte"
|
|
@@ -756,6 +892,9 @@ Các tiện ích này **chỉ render các chuỗi Markdown thô** và độc l
|
|
|
756
892
|
);
|
|
757
893
|
```
|
|
758
894
|
|
|
895
|
+
|
|
896
|
+
> 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`.
|
|
897
|
+
|
|
759
898
|
Bạn cũng có thể sử dụng trình render markdown của riêng mình:
|
|
760
899
|
|
|
761
900
|
```tsx fileName="AppProvider.tsx"
|
|
@@ -792,6 +931,9 @@ Các tiện ích này **chỉ render các chuỗi Markdown thô** và độc l
|
|
|
792
931
|
);
|
|
793
932
|
```
|
|
794
933
|
|
|
934
|
+
|
|
935
|
+
> 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`.
|
|
936
|
+
|
|
795
937
|
Bạn cũng có thể sử dụng trình render markdown của riêng mình:
|
|
796
938
|
|
|
797
939
|
```tsx fileName="AppProvider.tsx"
|
|
@@ -835,3 +977,191 @@ Các tiện ích này **chỉ render các chuỗi Markdown thô** và độc l
|
|
|
835
977
|
|
|
836
978
|
</Tab>
|
|
837
979
|
</Tabs>
|
|
980
|
+
|
|
981
|
+
## Suspense
|
|
982
|
+
|
|
983
|
+
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).
|
|
984
|
+
|
|
985
|
+
Để 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.
|
|
986
|
+
|
|
987
|
+
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.
|
|
988
|
+
|
|
989
|
+
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.
|
|
990
|
+
|
|
991
|
+
<Tabs>
|
|
992
|
+
<Tab label="Next.js" value="nextjs">
|
|
993
|
+
|
|
994
|
+
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ủ.
|
|
995
|
+
|
|
996
|
+
**Thành phần máy khách:**
|
|
997
|
+
|
|
998
|
+
```tsx fileName="components/MyComponent.tsx"
|
|
999
|
+
"use client";
|
|
1000
|
+
import { useIntlayer } from "next-intlayer";
|
|
1001
|
+
import { Suspense } from "react";
|
|
1002
|
+
|
|
1003
|
+
const MyComponent = () => {
|
|
1004
|
+
const markdownContent = useIntlayer("my-markdown");
|
|
1005
|
+
|
|
1006
|
+
return (
|
|
1007
|
+
<Suspense fallback={<div>Loading...</div>}>{markdownContent}</Suspense>
|
|
1008
|
+
);
|
|
1009
|
+
};
|
|
1010
|
+
```
|
|
1011
|
+
|
|
1012
|
+
**Thành phần máy chủ với `loading.tsx`:**
|
|
1013
|
+
|
|
1014
|
+
```tsx fileName="app/loading.tsx"
|
|
1015
|
+
export default function Loading() {
|
|
1016
|
+
return <div>Loading...</div>;
|
|
1017
|
+
}
|
|
1018
|
+
```
|
|
1019
|
+
|
|
1020
|
+
```tsx fileName="app/page.tsx"
|
|
1021
|
+
import { useIntlayer } from "next-intlayer/server";
|
|
1022
|
+
|
|
1023
|
+
const MyPage = () => {
|
|
1024
|
+
const markdownContent = useIntlayer("my-markdown");
|
|
1025
|
+
return <div>{markdownContent}</div>;
|
|
1026
|
+
};
|
|
1027
|
+
|
|
1028
|
+
export default MyPage;
|
|
1029
|
+
```
|
|
1030
|
+
|
|
1031
|
+
</Tab>
|
|
1032
|
+
|
|
1033
|
+
<Tab label="React" value="react">
|
|
1034
|
+
|
|
1035
|
+
```tsx
|
|
1036
|
+
import { useIntlayer } from "react-intlayer";
|
|
1037
|
+
import { Suspense } from "react";
|
|
1038
|
+
|
|
1039
|
+
const MyComponent = () => {
|
|
1040
|
+
const markdownContent = useIntlayer("my-markdown");
|
|
1041
|
+
|
|
1042
|
+
return (
|
|
1043
|
+
<Suspense fallback={<div>Loading...</div>}>{markdownContent}</Suspense>
|
|
1044
|
+
);
|
|
1045
|
+
};
|
|
1046
|
+
```
|
|
1047
|
+
|
|
1048
|
+
</Tab>
|
|
1049
|
+
|
|
1050
|
+
<Tab label="Vue" value="vue">
|
|
1051
|
+
|
|
1052
|
+
Vue có một thành phần `<Suspense>` được tích hợp sẵn. Bọc thành phần kết xuất nội dung Markdown trong ranh giới `<Suspense>`.
|
|
1053
|
+
|
|
1054
|
+
```vue fileName="MyComponent.vue"
|
|
1055
|
+
<script setup>
|
|
1056
|
+
import { useIntlayer } from "vue-intlayer";
|
|
1057
|
+
|
|
1058
|
+
const { markdownContent } = useIntlayer("my-markdown");
|
|
1059
|
+
</script>
|
|
1060
|
+
|
|
1061
|
+
<template>
|
|
1062
|
+
<Suspense>
|
|
1063
|
+
<component :is="markdownContent" />
|
|
1064
|
+
<template #fallback>
|
|
1065
|
+
<div>Loading...</div>
|
|
1066
|
+
</template>
|
|
1067
|
+
</Suspense>
|
|
1068
|
+
</template>
|
|
1069
|
+
```
|
|
1070
|
+
|
|
1071
|
+
</Tab>
|
|
1072
|
+
<Tab label="Svelte" value="svelte">
|
|
1073
|
+
|
|
1074
|
+
Svelte không có Suspense API tương đương. Sử dụng khối `{#await}` để xử lý kết xuất không đồng bộ của nội dung Markdown.
|
|
1075
|
+
|
|
1076
|
+
```svelte fileName="MyComponent.svelte"
|
|
1077
|
+
<script lang="ts">
|
|
1078
|
+
import { useIntlayer } from "svelte-intlayer";
|
|
1079
|
+
|
|
1080
|
+
const content = useIntlayer("my-markdown");
|
|
1081
|
+
</script>
|
|
1082
|
+
|
|
1083
|
+
{#await $content.markdownContent}
|
|
1084
|
+
<div>Loading...</div>
|
|
1085
|
+
{:then rendered}
|
|
1086
|
+
{@html rendered}
|
|
1087
|
+
{/await}
|
|
1088
|
+
```
|
|
1089
|
+
|
|
1090
|
+
</Tab>
|
|
1091
|
+
<Tab label="Preact" value="preact">
|
|
1092
|
+
|
|
1093
|
+
Preact hỗ trợ Suspense API của React thông qua `preact/compat`.
|
|
1094
|
+
|
|
1095
|
+
```tsx fileName="MyComponent.tsx"
|
|
1096
|
+
import { useIntlayer } from "preact-intlayer";
|
|
1097
|
+
import { Suspense } from "preact/compat";
|
|
1098
|
+
|
|
1099
|
+
const MyComponent = () => {
|
|
1100
|
+
const markdownContent = useIntlayer("my-markdown");
|
|
1101
|
+
|
|
1102
|
+
return (
|
|
1103
|
+
<Suspense fallback={<div>Loading...</div>}>{markdownContent}</Suspense>
|
|
1104
|
+
);
|
|
1105
|
+
};
|
|
1106
|
+
```
|
|
1107
|
+
|
|
1108
|
+
</Tab>
|
|
1109
|
+
<Tab label="Solid" value="solid">
|
|
1110
|
+
|
|
1111
|
+
Solid có thành phần `<Suspense>` riêng biệt từ `solid-js`.
|
|
1112
|
+
|
|
1113
|
+
```tsx fileName="MyComponent.tsx"
|
|
1114
|
+
import { useIntlayer } from "solid-intlayer";
|
|
1115
|
+
import { Suspense } from "solid-js";
|
|
1116
|
+
|
|
1117
|
+
const MyComponent = () => {
|
|
1118
|
+
const { markdownContent } = useIntlayer("my-markdown");
|
|
1119
|
+
|
|
1120
|
+
return (
|
|
1121
|
+
<Suspense fallback={<div>Loading...</div>}>{markdownContent}</Suspense>
|
|
1122
|
+
);
|
|
1123
|
+
};
|
|
1124
|
+
```
|
|
1125
|
+
|
|
1126
|
+
</Tab>
|
|
1127
|
+
<Tab label="Angular" value="angular">
|
|
1128
|
+
|
|
1129
|
+
Angular không có Suspense API. Sử dụng chế độ xem có thể trì hoãn (`@defer`) của Angular để xử lý nội dung Markdown được tải chậm (yêu cầu Angular 17+).
|
|
1130
|
+
|
|
1131
|
+
```typescript fileName="my.component.ts"
|
|
1132
|
+
import { Component } from "@angular/core";
|
|
1133
|
+
import { useIntlayer } from "angular-intlayer";
|
|
1134
|
+
|
|
1135
|
+
@Component({
|
|
1136
|
+
selector: "app-my",
|
|
1137
|
+
template: `
|
|
1138
|
+
@defer {
|
|
1139
|
+
<div [innerHTML]="content().markdownContent"></div>
|
|
1140
|
+
} @loading {
|
|
1141
|
+
<div>Loading...</div>
|
|
1142
|
+
}
|
|
1143
|
+
`,
|
|
1144
|
+
})
|
|
1145
|
+
export class MyComponent {
|
|
1146
|
+
content = useIntlayer("my-markdown");
|
|
1147
|
+
}
|
|
1148
|
+
```
|
|
1149
|
+
|
|
1150
|
+
</Tab>
|
|
1151
|
+
</Tabs>
|
|
1152
|
+
|
|
1153
|
+
---
|
|
1154
|
+
|
|
1155
|
+
## Tham chiếu tùy chọn
|
|
1156
|
+
|
|
1157
|
+
Các tùy chọn này có thể được truyền đến `MarkdownProvider`, `MarkdownRenderer`, `useMarkdownRenderer` và `renderMarkdown`.
|
|
1158
|
+
|
|
1159
|
+
| Option | Type | Default | Mô tả |
|
|
1160
|
+
| :-------------------- | :---------- | :------ | :------------------------------------------------------------------------------------ |
|
|
1161
|
+
| `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>`). |
|
|
1162
|
+
| `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>`). |
|
|
1163
|
+
| `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. |
|
|
1164
|
+
| `preserveFrontmatter` | `boolean` | `false` | Nếu `true`, frontmatter ở đầu chuỗi Markdown sẽ không bị tước đi. |
|
|
1165
|
+
| `components` | `Overrides` | `{}` | Bản đồ các thẻ HTML cho các thành phần tùy chỉnh (ví dụ: `{ h1: MyHeading }`). |
|
|
1166
|
+
| `wrapper` | `Component` | `null` | Thành phần tùy chỉnh để bọc Markdown đã kết xuất. |
|
|
1167
|
+
| `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. |
|
|
@@ -224,7 +224,7 @@ Cách tiếp cận này cho phép bạn:
|
|
|
224
224
|
|
|
225
225
|
Sao GitHub là một chỉ số mạnh mẽ về mức độ phổ biến của dự án, sự tin tưởng của cộng đồng và mức độ phù hợp lâu dài. Mặc dù không phải là thước đo trực tiếp về chất lượng kỹ thuật, chúng phản ánh số lượng nhà phát triển thấy dự án hữu ích, theo dõi tiến trình của nó và có khả năng áp dụng nó. Để ước tính giá trị của một dự án, các ngôi sao giúp so sánh sức hút giữa các lựa chọn thay thế và cung cấp thông tin chi tiết về sự phát triển của hệ sinh thái.
|
|
226
226
|
|
|
227
|
-
[](https://www.star-history.com/#aymericzip/intlayer&formatjs/formatjs&i18next/react-i18next&i18next/i18next&i18next/next-i18next&lingui/js-lingui&amannn/next-intl&intlify/vue-i18n&codingcommons/typesafe-i18n&opral/paraglide-js)
|
|
228
228
|
|
|
229
229
|
---
|
|
230
230
|
|