@intlayer/docs 8.11.1 → 8.11.2

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.
Files changed (76) hide show
  1. package/blog/en/i18n_using_next-i18next.md +3 -3
  2. package/blog/en/i18n_using_next-intl.md +3 -3
  3. package/blog/en/list_i18n_technologies/frameworks/angular.md +3 -3
  4. package/blog/en/list_i18n_technologies/frameworks/react-native.md +3 -3
  5. package/blog/en/list_i18n_technologies/frameworks/react.md +3 -3
  6. package/blog/en/list_i18n_technologies/frameworks/svelte.md +3 -3
  7. package/blog/en/list_i18n_technologies/frameworks/vue.md +3 -3
  8. package/blog/en/next-i18next_vs_next-intl_vs_intlayer.md +3 -3
  9. package/dist/cjs/generated/blog.entry.cjs +0 -1
  10. package/dist/cjs/generated/blog.entry.cjs.map +1 -1
  11. package/dist/cjs/generated/docs.entry.cjs +0 -1
  12. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  13. package/dist/cjs/generated/frequentQuestions.entry.cjs +0 -1
  14. package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
  15. package/dist/cjs/generated/legal.entry.cjs +0 -1
  16. package/dist/cjs/generated/legal.entry.cjs.map +1 -1
  17. package/docs/ar/dictionary/markdown.md +161 -0
  18. package/docs/de/dictionary/markdown.md +161 -0
  19. package/docs/en/dictionary/markdown.md +163 -0
  20. package/docs/en/intlayer_with_adonisjs.md +3 -3
  21. package/docs/en/intlayer_with_analog.md +3 -3
  22. package/docs/en/intlayer_with_angular_19.md +3 -3
  23. package/docs/en/intlayer_with_angular_21.md +3 -3
  24. package/docs/en/intlayer_with_astro.md +3 -3
  25. package/docs/en/intlayer_with_astro_lit.md +3 -3
  26. package/docs/en/intlayer_with_astro_preact.md +3 -3
  27. package/docs/en/intlayer_with_astro_react.md +3 -3
  28. package/docs/en/intlayer_with_astro_solid.md +3 -3
  29. package/docs/en/intlayer_with_astro_svelte.md +3 -3
  30. package/docs/en/intlayer_with_astro_vanilla.md +3 -3
  31. package/docs/en/intlayer_with_astro_vue.md +3 -3
  32. package/docs/en/intlayer_with_create_react_app.md +3 -3
  33. package/docs/en/intlayer_with_express.md +3 -3
  34. package/docs/en/intlayer_with_fastify.md +3 -3
  35. package/docs/en/intlayer_with_hono.md +3 -3
  36. package/docs/en/intlayer_with_lynx+react.md +3 -3
  37. package/docs/en/intlayer_with_nestjs.md +3 -3
  38. package/docs/en/intlayer_with_next-i18next.md +3 -3
  39. package/docs/en/intlayer_with_next-intl.md +3 -3
  40. package/docs/en/intlayer_with_nextjs_14.md +3 -3
  41. package/docs/en/intlayer_with_nextjs_15.md +3 -3
  42. package/docs/en/intlayer_with_nextjs_16.md +3 -3
  43. package/docs/en/intlayer_with_nextjs_compiler.md +3 -3
  44. package/docs/en/intlayer_with_nextjs_no_locale_path.md +3 -3
  45. package/docs/en/intlayer_with_nextjs_page_router.md +3 -3
  46. package/docs/en/intlayer_with_nuxt.md +3 -3
  47. package/docs/en/intlayer_with_react_native+expo.md +3 -3
  48. package/docs/en/intlayer_with_react_router_v7.md +3 -3
  49. package/docs/en/intlayer_with_react_router_v7_fs_routes.md +3 -3
  50. package/docs/en/intlayer_with_svelte_kit.md +3 -3
  51. package/docs/en/intlayer_with_tanstack+solid.md +3 -3
  52. package/docs/en/intlayer_with_tanstack.md +3 -3
  53. package/docs/en/intlayer_with_vanilla.md +3 -3
  54. package/docs/en/intlayer_with_vite+lit.md +3 -3
  55. package/docs/en/intlayer_with_vite+preact.md +3 -3
  56. package/docs/en/intlayer_with_vite+react.md +3 -3
  57. package/docs/en/intlayer_with_vite+react_compiler.md +3 -3
  58. package/docs/en/intlayer_with_vite+solid.md +3 -3
  59. package/docs/en/intlayer_with_vite+svelte.md +3 -3
  60. package/docs/en/intlayer_with_vite+vanilla.md +3 -3
  61. package/docs/en/intlayer_with_vite+vue.md +3 -3
  62. package/docs/en-GB/dictionary/markdown.md +161 -0
  63. package/docs/es/dictionary/markdown.md +161 -0
  64. package/docs/fr/dictionary/markdown.md +161 -0
  65. package/docs/hi/dictionary/markdown.md +161 -0
  66. package/docs/id/dictionary/markdown.md +161 -0
  67. package/docs/it/dictionary/markdown.md +161 -0
  68. package/docs/ko/dictionary/markdown.md +161 -0
  69. package/docs/pl/dictionary/markdown.md +161 -0
  70. package/docs/pt/dictionary/markdown.md +161 -0
  71. package/docs/ru/dictionary/markdown.md +161 -0
  72. package/docs/tr/dictionary/markdown.md +161 -0
  73. package/docs/uk/dictionary/markdown.md +161 -0
  74. package/docs/vi/dictionary/markdown.md +161 -0
  75. package/docs/zh/dictionary/markdown.md +161 -0
  76. package/package.json +7 -7
@@ -17,6 +17,9 @@ slugs:
17
17
  - content
18
18
  - markdown
19
19
  history:
20
+ - version: 8.11.0
21
+ date: 2026-05-28
22
+ changes: "SSR / 하이드레이션을 위한 Markdown AST 사전 파싱 허용"
20
23
  - version: 8.10.0
21
24
  date: 2026-05-19
22
25
  changes: "`.content.md` 파일 지원 추가"
@@ -1149,6 +1152,164 @@ export class MyComponent {
1149
1152
 
1150
1153
  ---
1151
1154
 
1155
+ ## 서버 사이드 렌더링 (SSR) 및 하이드레이션
1156
+
1157
+ remark / rehype와 같은 다른 마크다운 파서와 비교할 때, Intlayer 마크다운은 의존성이 없으며 클라이언트와 서버 사이드 모두에서 실행됩니다.
1158
+
1159
+ 그러나 Intlayer는 서버 사이드 렌더링(SSR) 프레임워크(Next.js App Router, React Router, Nuxt, SvelteKit 등)를 위해 파싱을 최적화했습니다.
1160
+
1161
+ 원시 마크다운 문자열을 클라이언트에 전송하고 브라우저에서 파싱하는 방식(성능 저하를 유발함) 대신, Intlayer는 서버에서 마크다운을 추상 구문 트리(AST)로 사전 파싱할 수 있도록 지원합니다.
1162
+
1163
+ 서버 사이드에서 해당 프레임워크의 Intlayer 패키지에 있는 `parseMarkdown` 함수를 사용하여 직렬화 가능한 AST(`ParsedMarkdown` 객체)를 생성하고, 이를 프론트엔드로 직접 전달할 수 있습니다. 모든 Intlayer 렌더링 유틸리티(`<MarkdownRenderer>`, `useMarkdownRenderer` 등)는 이 AST 객체를 자동으로 수용하여 원활하게 렌더링합니다.
1164
+
1165
+ ### 서버/클라이언트 아키텍처 예시
1166
+
1167
+ <Tabs group="framework">
1168
+ <Tab label="React Router" value="react">
1169
+
1170
+ ```tsx fileName="server.ts"
1171
+ import { parseMarkdown } from "react-intlayer/markdown";
1172
+
1173
+ // 1. 서버에서: 마크다운을 직렬화 가능한 AST로 파싱
1174
+ export const loader = async () => {
1175
+ const markdownString = "## My title \n\nLorem Ipsum";
1176
+ const ast = parseMarkdown(markdownString);
1177
+
1178
+ // AST를 JSON으로 클라이언트에 반환
1179
+ return Response.json({ content: ast });
1180
+ };
1181
+ ```
1182
+
1183
+ ```tsx fileName="client.tsx"
1184
+ import { useLoaderData } from "react-router";
1185
+ import { MarkdownRenderer } from "react-intlayer/markdown";
1186
+
1187
+ // 2. 클라이언트에서: 재파싱 없이 AST를 직접 렌더링
1188
+ export default function Page() {
1189
+ const { content } = useLoaderData();
1190
+
1191
+ // 렌더러는 원시 문자열 또는 파싱된 AST를 모두 수용합니다
1192
+ return <MarkdownRenderer content={content} />;
1193
+ }
1194
+ ```
1195
+
1196
+ </Tab>
1197
+ <Tab label="Next.js" value="nextjs">
1198
+
1199
+ ```tsx fileName="app/page.tsx"
1200
+ import { parseMarkdown } from "next-intlayer/markdown";
1201
+ import { MarkdownRenderer } from "next-intlayer/markdown";
1202
+
1203
+ export default async function Page() {
1204
+ // 1. 서버에서 마크다운을 직렬화 가능한 AST로 파싱
1205
+ const markdownString = "## My title \n\nLorem Ipsum";
1206
+ const ast = parseMarkdown(markdownString);
1207
+
1208
+ // 2. AST를 직접 렌더링
1209
+ // 서버 컴포넌트(Server Component) 내에서 원활하게 작동하며, 필요한 경우
1210
+ // 하위 클라이언트 컴포넌트로 AST를 직접 전달합니다.
1211
+ return <MarkdownRenderer content={ast} />;
1212
+ }
1213
+ ```
1214
+
1215
+ </Tab>
1216
+ <Tab label="Vue / Nuxt" value="vue">
1217
+
1218
+ ```vue fileName="pages/index.vue"
1219
+ <script setup lang="ts">
1220
+ import { parseMarkdown } from "vue-intlayer/markdown";
1221
+ import { MarkdownRenderer } from "vue-intlayer/markdown";
1222
+
1223
+ // 1. 서버에서 마크다운을 가져오고 AST로 파싱
1224
+ const { data: ast } = await useAsyncData('markdown', () => {
1225
+ const markdownString = "## My title \n\nLorem Ipsum";
1226
+ return parseMarkdown(markdownString);
1227
+ });
1228
+ </script>
1229
+
1230
+ <template>
1231
+ <!-- 2. 클라이언트에서: 재파싱 없이 AST를 직접 렌더링 -->
1232
+ <MarkdownRenderer :content="ast" />
1233
+ </template>
1234
+ ```
1235
+
1236
+ </Tab>
1237
+ <Tab label="SvelteKit" value="svelte">
1238
+
1239
+ ```typescript fileName="+page.server.ts"
1240
+ import { parseMarkdown } from "svelte-intlayer/markdown";
1241
+
1242
+ // 1. 서버에서: 마크다운을 직렬화 가능한 AST로 파싱
1243
+ export const load = async () => {
1244
+ const markdownString = "## My title \n\nLorem Ipsum";
1245
+ const ast = parseMarkdown(markdownString);
1246
+
1247
+ // AST를 클라이언트에 반환
1248
+ return { content: ast };
1249
+ };
1250
+ ```
1251
+
1252
+ ```svelte fileName="+page.svelte"
1253
+ <script lang="ts">
1254
+ import { MarkdownRenderer } from "svelte-intlayer/markdown";
1255
+ export let data;
1256
+ </script>
1257
+
1258
+ <!-- 2. 클라이언트에서: 재파싱 없이 AST를 직접 렌더링 -->
1259
+ <MarkdownRenderer value={data.content} />
1260
+ ```
1261
+
1262
+ </Tab>
1263
+ <Tab label="Angular" value="angular">
1264
+
1265
+ Angular SSR은 일반적으로 초기 로드 시 서버에서 데이터를 확인하고 클라이언트에서 하이드레이션을 수행합니다. 확인자(resolvers)를 사용하여 AST를 전달할 수 있습니다.
1266
+
1267
+ ```typescript fileName="app.resolver.ts"
1268
+ import { Injectable } from "@angular/core";
1269
+ import { Resolve } from "@angular/router";
1270
+ import { parseMarkdown, type ParsedMarkdown } from "angular-intlayer/markdown";
1271
+
1272
+ @Injectable({ providedIn: "root" })
1273
+ export class MarkdownResolver implements Resolve<ParsedMarkdown> {
1274
+ resolve(): ParsedMarkdown {
1275
+ const markdownString = "## My title \n\nLorem Ipsum";
1276
+ // 1. 서버에서: 마크다운을 직렬화 가능한 AST로 파싱
1277
+ return parseMarkdown(markdownString);
1278
+ }
1279
+ }
1280
+ ```
1281
+
1282
+ ```typescript fileName="app.component.ts"
1283
+ import { Component } from "@angular/core";
1284
+ import { ActivatedRoute } from "@angular/router";
1285
+ import { IntlayerMarkdownService, type ParsedMarkdown } from "angular-intlayer/markdown";
1286
+
1287
+ @Component({
1288
+ selector: "app-root",
1289
+ template: `<div [innerHTML]="renderedMarkdown"></div>`,
1290
+ })
1291
+ export class AppComponent {
1292
+ renderedMarkdown: string = "";
1293
+
1294
+ constructor(
1295
+ private route: ActivatedRoute,
1296
+ private markdownService: IntlayerMarkdownService
1297
+ ) {
1298
+ // 2. 클라이언트에서: 재파싱 없이 AST를 직접 렌더링
1299
+ this.route.data.subscribe((data) => {
1300
+ this.renderedMarkdown = this.markdownService.renderMarkdown(
1301
+ data.markdownAst
1302
+ ) as string;
1303
+ });
1304
+ }
1305
+ }
1306
+ ```
1307
+
1308
+ </Tab>
1309
+ </Tabs>
1310
+
1311
+ 이 패턴을 통해 마크다운 파싱 로직을 서버에서 완벽히 실행함으로써 클라이언트 사이드 실행 시간을 크게 단축하고 초기 하이드레이션 속도를 개선할 수 있습니다.
1312
+
1152
1313
  ## 옵션 참조
1153
1314
 
1154
1315
  이러한 옵션은 `MarkdownProvider`, `MarkdownRenderer`, `useMarkdownRenderer` 및 `renderMarkdown`에 전달될 수 있습니다.
@@ -17,6 +17,9 @@ slugs:
17
17
  - content
18
18
  - markdown
19
19
  history:
20
+ - version: 8.11.0
21
+ date: 2026-05-28
22
+ changes: "Zezwalaj na wstępne parsowanie AST Markdown dla SSR / hydratacji"
20
23
  - version: 8.10.0
21
24
  date: 2026-05-19
22
25
  changes: "Dodano obsługę plików `.content.md`"
@@ -1149,6 +1152,164 @@ export class MyComponent {
1149
1152
 
1150
1153
  ---
1151
1154
 
1155
+ ## Renderowanie po stronie serwera (SSR) i hydratacja
1156
+
1157
+ W porównaniu do innych parserów Markdown, takich jak remark / rehype, Intlayer Markdown jest pozbawiony zależności i działa zarówno po stronie klienta, jak i serwera.
1158
+
1159
+ Jednak Intlayer optymalizuje parsowanie dla frameworków renderowania po stronie serwera (SSR) (takich jak Next.js App Router, React Router, Nuxt, SvelteKit itp.).
1160
+
1161
+ Zamiast wysyłać surowe ciągi Markdown do klienta i parsować je w przeglądarce (co powoduje spadek wydajności), Intlayer pozwala na wstępne sparsowanie Markdown do abstrakcyjnego drzewa składniowego (AST) na serwerze.
1162
+
1163
+ Możesz użyć funkcji `parseMarkdown` z pakietu Intlayer swojego frameworka po stronie serwera, aby wygenerować serializowalne AST (obiekt `ParsedMarkdown`) i przekazać je bezpośrednio do frontendu. Wszystkie narzędzia renderujące Intlayer (takie jak `<MarkdownRenderer>`, `useMarkdownRenderer` itp.) automatycznie akceptują ten obiekt AST i renderują go bez zakłóceń.
1164
+
1165
+ ### Przykład w architekturze serwer/klient
1166
+
1167
+ <Tabs group="framework">
1168
+ <Tab label="React Router" value="react">
1169
+
1170
+ ```tsx fileName="server.ts"
1171
+ import { parseMarkdown } from "react-intlayer/markdown";
1172
+
1173
+ // 1. Na serwerze: Sparsuj markdown do serializowalnego AST
1174
+ export const loader = async () => {
1175
+ const markdownString = "## My title \n\nLorem Ipsum";
1176
+ const ast = parseMarkdown(markdownString);
1177
+
1178
+ // Zwróć AST jako JSON do klienta
1179
+ return Response.json({ content: ast });
1180
+ };
1181
+ ```
1182
+
1183
+ ```tsx fileName="client.tsx"
1184
+ import { useLoaderData } from "react-router";
1185
+ import { MarkdownRenderer } from "react-intlayer/markdown";
1186
+
1187
+ // 2. Na kliencie: Renderuj AST bezpośrednio bez ponownego parsowania
1188
+ export default function Page() {
1189
+ const { content } = useLoaderData();
1190
+
1191
+ // Renderer akceptuje surowy ciąg znaków lub sparsowane AST
1192
+ return <MarkdownRenderer content={content} />;
1193
+ }
1194
+ ```
1195
+
1196
+ </Tab>
1197
+ <Tab label="Next.js" value="nextjs">
1198
+
1199
+ ```tsx fileName="app/page.tsx"
1200
+ import { parseMarkdown } from "next-intlayer/markdown";
1201
+ import { MarkdownRenderer } from "next-intlayer/markdown";
1202
+
1203
+ export default async function Page() {
1204
+ // 1. Sparsuj markdown do serializowalnego AST na serwerze
1205
+ const markdownString = "## My title \n\nLorem Ipsum";
1206
+ const ast = parseMarkdown(markdownString);
1207
+
1208
+ // 2. Renderuj AST bezpośrednio
1209
+ // W Server Component działa to bezproblemowo i przekazuje AST
1210
+ // bezpośrednio do bazowych komponentów klienckich, jeśli to konieczne.
1211
+ return <MarkdownRenderer content={ast} />;
1212
+ }
1213
+ ```
1214
+
1215
+ </Tab>
1216
+ <Tab label="Vue / Nuxt" value="vue">
1217
+
1218
+ ```vue fileName="pages/index.vue"
1219
+ <script setup lang="ts">
1220
+ import { parseMarkdown } from "vue-intlayer/markdown";
1221
+ import { MarkdownRenderer } from "vue-intlayer/markdown";
1222
+
1223
+ // 1. Pobierz i sparsuj markdown do AST na serwerze
1224
+ const { data: ast } = await useAsyncData('markdown', () => {
1225
+ const markdownString = "## My title \n\nLorem Ipsum";
1226
+ return parseMarkdown(markdownString);
1227
+ });
1228
+ </script>
1229
+
1230
+ <template>
1231
+ <!-- 2. Na kliencie: Renderuj AST bezpośrednio bez ponownego parsowania -->
1232
+ <MarkdownRenderer :content="ast" />
1233
+ </template>
1234
+ ```
1235
+
1236
+ </Tab>
1237
+ <Tab label="SvelteKit" value="svelte">
1238
+
1239
+ ```typescript fileName="+page.server.ts"
1240
+ import { parseMarkdown } from "svelte-intlayer/markdown";
1241
+
1242
+ // 1. Na serwerze: Sparsuj markdown do serializowalnego AST
1243
+ export const load = async () => {
1244
+ const markdownString = "## My title \n\nLorem Ipsum";
1245
+ const ast = parseMarkdown(markdownString);
1246
+
1247
+ // Zwróć AST do klienta
1248
+ return { content: ast };
1249
+ };
1250
+ ```
1251
+
1252
+ ```svelte fileName="+page.svelte"
1253
+ <script lang="ts">
1254
+ import { MarkdownRenderer } from "svelte-intlayer/markdown";
1255
+ export let data;
1256
+ </script>
1257
+
1258
+ <!-- 2. Na kliencie: Renderuj AST bezpośrednio bez ponownego parsowania -->
1259
+ <MarkdownRenderer value={data.content} />
1260
+ ```
1261
+
1262
+ </Tab>
1263
+ <Tab label="Angular" value="angular">
1264
+
1265
+ Angular SSR zazwyczaj pobiera dane na serwerze podczas początkowego ładowania i hydratuje na kliencie. Możesz użyć resolverów do przekazania AST.
1266
+
1267
+ ```typescript fileName="app.resolver.ts"
1268
+ import { Injectable } from "@angular/core";
1269
+ import { Resolve } from "@angular/router";
1270
+ import { parseMarkdown, type ParsedMarkdown } from "angular-intlayer/markdown";
1271
+
1272
+ @Injectable({ providedIn: "root" })
1273
+ export class MarkdownResolver implements Resolve<ParsedMarkdown> {
1274
+ resolve(): ParsedMarkdown {
1275
+ const markdownString = "## My title \n\nLorem Ipsum";
1276
+ // 1. Na serwerze: Sparsuj markdown do serializowalnego AST
1277
+ return parseMarkdown(markdownString);
1278
+ }
1279
+ }
1280
+ ```
1281
+
1282
+ ```typescript fileName="app.component.ts"
1283
+ import { Component } from "@angular/core";
1284
+ import { ActivatedRoute } from "@angular/router";
1285
+ import { IntlayerMarkdownService, type ParsedMarkdown } from "angular-intlayer/markdown";
1286
+
1287
+ @Component({
1288
+ selector: "app-root",
1289
+ template: `<div [innerHTML]="renderedMarkdown"></div>`,
1290
+ })
1291
+ export class AppComponent {
1292
+ renderedMarkdown: string = "";
1293
+
1294
+ constructor(
1295
+ private route: ActivatedRoute,
1296
+ private markdownService: IntlayerMarkdownService
1297
+ ) {
1298
+ // 2. Na kliencie: Renderuj AST bezpośrednio bez ponownego parsowania
1299
+ this.route.data.subscribe((data) => {
1300
+ this.renderedMarkdown = this.markdownService.renderMarkdown(
1301
+ data.markdownAst
1302
+ ) as string;
1303
+ });
1304
+ }
1305
+ }
1306
+ ```
1307
+
1308
+ </Tab>
1309
+ </Tabs>
1310
+
1311
+ Ten wzorzec zapewnia, że logika parsowania Markdown jest wykonywana całkowicie na serwerze, co znacznie skraca czas wykonywania po stronie klienta i poprawia szybkość początkowej hydratacji.
1312
+
1152
1313
  ## Opcje referencyjne
1153
1314
 
1154
1315
  Te opcje można przekazać do `MarkdownProvider`, `MarkdownRenderer`, `useMarkdownRenderer` i `renderMarkdown`.
@@ -17,6 +17,9 @@ slugs:
17
17
  - content
18
18
  - markdown
19
19
  history:
20
+ - version: 8.11.0
21
+ date: 2026-05-28
22
+ changes: "Permitir a pré-análise do AST do Markdown para SSR / hidratação"
20
23
  - version: 8.10.0
21
24
  date: 2026-05-19
22
25
  changes: "Adicionado suporte a arquivos `.content.md`"
@@ -1149,6 +1152,164 @@ export class MyComponent {
1149
1152
 
1150
1153
  ---
1151
1154
 
1155
+ ## Renderização no Lado do Servidor (SSR) e Hidratação
1156
+
1157
+ Em comparação com outros analisadores de Markdown, como remark / rehype, o Intlayer Markdown é livre de dependências e roda tanto no cliente quanto no servidor.
1158
+
1159
+ No entanto, o Intlayer otimiza a análise para frameworks de Renderização no Lado do Servidor (SSR) (como Next.js App Router, React Router, Nuxt, SvelteKit, etc.).
1160
+
1161
+ Em vez de enviar strings Markdown brutas para o cliente e analisá-las no navegador (o que acarreta uma perda de desempenho), o Intlayer permite pré-analisar o Markdown em uma Árvore de Sintaxe Abstrata (AST) no servidor.
1162
+
1163
+ Você pode usar a função `parseMarkdown` do pacote Intlayer do seu framework no lado do servidor para gerar uma AST serializável (objeto `ParsedMarkdown`) e passá-la diretamente para o frontend. Todos os utilitários de renderização do Intlayer (como `<MarkdownRenderer>`, `useMarkdownRenderer`, etc.) aceitam automaticamente esse objeto AST e o renderizam perfeitamente.
1164
+
1165
+ ### Exemplo em uma Arquitetura Servidor/Cliente
1166
+
1167
+ <Tabs group="framework">
1168
+ <Tab label="React Router" value="react">
1169
+
1170
+ ```tsx fileName="server.ts"
1171
+ import { parseMarkdown } from "react-intlayer/markdown";
1172
+
1173
+ // 1. No servidor: Analisar o markdown em uma AST serializável
1174
+ export const loader = async () => {
1175
+ const markdownString = "## My title \n\nLorem Ipsum";
1176
+ const ast = parseMarkdown(markdownString);
1177
+
1178
+ // Retornar a AST como JSON para o cliente
1179
+ return Response.json({ content: ast });
1180
+ };
1181
+ ```
1182
+
1183
+ ```tsx fileName="client.tsx"
1184
+ import { useLoaderData } from "react-router";
1185
+ import { MarkdownRenderer } from "react-intlayer/markdown";
1186
+
1187
+ // 2. No cliente: Renderizar a AST diretamente sem reanalisar
1188
+ export default function Page() {
1189
+ const { content } = useLoaderData();
1190
+
1191
+ // O renderizador aceita uma string bruta ou a AST analisada
1192
+ return <MarkdownRenderer content={content} />;
1193
+ }
1194
+ ```
1195
+
1196
+ </Tab>
1197
+ <Tab label="Next.js" value="nextjs">
1198
+
1199
+ ```tsx fileName="app/page.tsx"
1200
+ import { parseMarkdown } from "next-intlayer/markdown";
1201
+ import { MarkdownRenderer } from "next-intlayer/markdown";
1202
+
1203
+ export default async function Page() {
1204
+ // 1. Analisar o markdown em uma AST serializável no servidor
1205
+ const markdownString = "## My title \n\nLorem Ipsum";
1206
+ const ast = parseMarkdown(markdownString);
1207
+
1208
+ // 2. Renderizar a AST diretamente
1209
+ // Em um Server Component, isso funciona perfeitamente e passa a AST
1210
+ // diretamente para os componentes de cliente subjacentes, se necessário.
1211
+ return <MarkdownRenderer content={ast} />;
1212
+ }
1213
+ ```
1214
+
1215
+ </Tab>
1216
+ <Tab label="Vue / Nuxt" value="vue">
1217
+
1218
+ ```vue fileName="pages/index.vue"
1219
+ <script setup lang="ts">
1220
+ import { parseMarkdown } from "vue-intlayer/markdown";
1221
+ import { MarkdownRenderer } from "vue-intlayer/markdown";
1222
+
1223
+ // 1. Buscar e analisar o markdown em uma AST no servidor
1224
+ const { data: ast } = await useAsyncData('markdown', () => {
1225
+ const markdownString = "## My title \n\nLorem Ipsum";
1226
+ return parseMarkdown(markdownString);
1227
+ });
1228
+ </script>
1229
+
1230
+ <template>
1231
+ <!-- 2. No cliente: Renderizar a AST diretamente sem reanalisar -->
1232
+ <MarkdownRenderer :content="ast" />
1233
+ </template>
1234
+ ```
1235
+
1236
+ </Tab>
1237
+ <Tab label="SvelteKit" value="svelte">
1238
+
1239
+ ```typescript fileName="+page.server.ts"
1240
+ import { parseMarkdown } from "svelte-intlayer/markdown";
1241
+
1242
+ // 1. No servidor: Analisar o markdown em uma AST serializável
1243
+ export const load = async () => {
1244
+ const markdownString = "## My title \n\nLorem Ipsum";
1245
+ const ast = parseMarkdown(markdownString);
1246
+
1247
+ // Retornar a AST para o cliente
1248
+ return { content: ast };
1249
+ };
1250
+ ```
1251
+
1252
+ ```svelte fileName="+page.svelte"
1253
+ <script lang="ts">
1254
+ import { MarkdownRenderer } from "svelte-intlayer/markdown";
1255
+ export let data;
1256
+ </script>
1257
+
1258
+ <!-- 2. No cliente: Renderizar a AST diretamente sem reanalisar -->
1259
+ <MarkdownRenderer value={data.content} />
1260
+ ```
1261
+
1262
+ </Tab>
1263
+ <Tab label="Angular" value="angular">
1264
+
1265
+ O SSR do Angular normalmente resolve os dados no servidor durante o carregamento inicial e hidrata no cliente. Você pode usar resolvers para passar a AST.
1266
+
1267
+ ```typescript fileName="app.resolver.ts"
1268
+ import { Injectable } from "@angular/core";
1269
+ import { Resolve } from "@angular/router";
1270
+ import { parseMarkdown, type ParsedMarkdown } from "angular-intlayer/markdown";
1271
+
1272
+ @Injectable({ providedIn: "root" })
1273
+ export class MarkdownResolver implements Resolve<ParsedMarkdown> {
1274
+ resolve(): ParsedMarkdown {
1275
+ const markdownString = "## My title \n\nLorem Ipsum";
1276
+ // 1. No servidor: Analisar o markdown em uma AST serializável
1277
+ return parseMarkdown(markdownString);
1278
+ }
1279
+ }
1280
+ ```
1281
+
1282
+ ```typescript fileName="app.component.ts"
1283
+ import { Component } from "@angular/core";
1284
+ import { ActivatedRoute } from "@angular/router";
1285
+ import { IntlayerMarkdownService, type ParsedMarkdown } from "angular-intlayer/markdown";
1286
+
1287
+ @Component({
1288
+ selector: "app-root",
1289
+ template: `<div [innerHTML]="renderedMarkdown"></div>`,
1290
+ })
1291
+ export class AppComponent {
1292
+ renderedMarkdown: string = "";
1293
+
1294
+ constructor(
1295
+ private route: ActivatedRoute,
1296
+ private markdownService: IntlayerMarkdownService
1297
+ ) {
1298
+ // 2. No cliente: Renderizar a AST diretamente sem reanalisar
1299
+ this.route.data.subscribe((data) => {
1300
+ this.renderedMarkdown = this.markdownService.renderMarkdown(
1301
+ data.markdownAst
1302
+ ) as string;
1303
+ });
1304
+ }
1305
+ }
1306
+ ```
1307
+
1308
+ </Tab>
1309
+ </Tabs>
1310
+
1311
+ Esse padrão garante que a lógica de análise do Markdown seja executada inteiramente no servidor, reduzindo significativamente o tempo de execução no cliente e melhorando a velocidade de hidratação inicial.
1312
+
1152
1313
  ## Referência de opções
1153
1314
 
1154
1315
  Essas opções podem ser passadas para `MarkdownProvider`, `MarkdownRenderer`, `useMarkdownRenderer` e `renderMarkdown`.