\n\n \n \n \n ```\n\n Настройте глобально через плагин `intlayerMarkdown` (поддерживает пользовательские компоненты MDX):\n\n ```ts fileName=\"main.ts\"\n import { intlayerMarkdown } from \"vue-intlayer/markdown\";\n\n app.use(intlayerMarkdown, {\n components: {\n h1: (props) => h('h1', { style: { color: 'green' } }, props.children),\n MyButton: (props) => h('button', props), // Компонент MDX\n },\n });\n ```\n\n > Если плагин `intlayerMarkdown` не установлен, Intlayer будет выполнять рендеринг с использованием компилятора по умолчанию.\n\n Вы также можете предоставить локальные переопределения для конкретных узлов, используя метод `.use()`:\n\n ```vue\n h('h1', { style: { color: 'red' } }, props.children),\n })\" />\n ```\n\n Вы можете получить Markdown в виде строки:\n\n ```vue\n {{ myMarkdownContent.value }}\n {{ String(myMarkdownContent) }}\n {{ myMarkdownContent.toString() }}\n ```\n\n И вы можете получить доступ к метаданным вашего markdown, например:\n\n ```vue\n \n \n ```\n\n \n \n Svelte по умолчанию рендерит Markdown как HTML-строку. Используйте `{@html}` для его рендеринга.\n\n ```svelte fileName=\"App.svelte\"\n \n\n \n {@html $content.myMarkdownContent}\n \n ```\n\n > Если `MarkdownProvider` отсутствует, Intlayer будет рендерить markdown с использованием компилятора по умолчанию.\n\n Вы также можете предоставить локальные переопределения для конкретных узлов, используя метод `.use()`:\n\n ```svelte\n {@html $content.myMarkdownContent.use({ ... })}\n ```\n\n Вы можете получить Markdown в виде строки:\n\n ```svelte\n {$content.myMarkdownContent.value}\n {String($content.myMarkdownContent)}\n {$content.myMarkdownContent.toString()}\n ```\n\n И вы можете получить доступ к метаданным вашего markdown, например:\n\n ```svelte\n {$content.myMarkdownContent.metadata}\n {$content.myMarkdownContent.metadata.title}\n ```\n\n \n \n Preact поддерживает узлы Markdown непосредственно в JSX.\n\n ```tsx fileName=\"App.tsx\"\n import { useIntlayer } from \"preact-intlayer\";\n import { MarkdownProvider } from \"preact-intlayer/markdown\";\n\n const AppContent = () => {\n const { myMarkdownContent } = useIntlayer(\"app\");\n return
{myMarkdownContent}
;\n };\n\n const App = () => (\n
{children}
,\n MyButton: (props) => , // Компонент MDX\n }}\n >\n \n \n );\n ```\n\n > Если `MarkdownProvider` отсутствует, intlayer будет отрисовывать markdown, используя стандартный парсер Markdown в JSX.\n\n Вы также можете предоставить локальные переопределения для конкретных узлов, используя метод `.use()`:\n\n ```tsx\n {myMarkdownContent.use({\n h1: ({ children }) =>
{children}
,\n })}\n ```\n\n Вы можете получить Markdown в виде строки:\n\n ```tsx\n {myMarkdownContent.value}\n {String(myMarkdownContent)}\n {myMarkdownContent.toString()}\n ```\n\n И вы можете получить доступ к метаданным вашего markdown, например:\n\n ```tsx\n {myMarkdownContent.metadata}\n {myMarkdownContent.metadata.title}\n ```\n\n \n \n Solid поддерживает узлы Markdown непосредственно в JSX.\n\n ```tsx fileName=\"App.tsx\"\n import { useIntlayer } from \"solid-intlayer\";\n import { MarkdownProvider } from \"solid-intlayer/markdown\";\n\n const AppContent = () => {\n const { myMarkdownContent } = useIntlayer(\"app\");\n return
{myMarkdownContent}
;\n };\n\n const App = () => (\n
{props.children}
,\n MyButton: (props) => , // Компонент MDX\n }}\n >\n \n \n );\n ```\n\n > Если `MarkdownProvider` отсутствует, intlayer будет отрисовывать markdown, используя стандартный парсер Markdown в JSX.\n\n Вы также можете предоставить локальные переопределения для конкретных узлов, используя метод `.use()`:\n\n ```tsx\n {myMarkdownContent.use({\n h1: (props) =>
{props.children}
,\n })}\n ```\n\n Вы можете получить Markdown в виде строки:\n\n ```tsx\n {myMarkdownContent.value}\n {String(myMarkdownContent)}\n {myMarkdownContent.toString()}\n ```\n\n И вы можете получить доступ к метаданным вашего markdown, например:\n\n ```tsx\n {myMarkdownContent.metadata}\n {myMarkdownContent.metadata.title}\n ```\n\n \n \n Angular использует директиву `[innerHTML]` для рендеринга контента Markdown.\n\n ```typescript fileName=\"app.component.ts\"\n import { Component } from \"@angular/core\";\n import { useIntlayer } from \"angular-intlayer\";\n\n @Component({\n selector: \"app-root\",\n template: ``,\n })\n export class AppComponent {\n content = useIntlayer(\"app\");\n }\n ```\n\n > Если провайдер IntlayerMarkdown не настроен, Intlayer будет выполнять рендеринг с использованием компилятора по умолчанию.\n\n Вы также можете предоставить локальные переопределения для конкретных узлов, используя метод `.use()`:\n\n ```typescript\n content().myMarkdownContent.use({\n h1: { class: \"text-3xl font-bold\" },\n })\n ```\n\n Вы можете получить Markdown в виде строки:\n\n ```typescript\n content().myMarkdownContent.value\n String(content().myMarkdownContent)\n content().myMarkdownContent.toString()\n ```\n\n И вы можете получить доступ к метаданным вашего markdown, например:\n\n ```typescript\n content().myMarkdownContent.metadata\n content().myMarkdownContent.metadata.title\n ```\n\n \n\n\n## Suspense\n\nРендерер Markdown в Intlayer загружается динамически. Несмотря на оптимизацию, базовый фрагмент парсера составляет около 55 КБ. Его синхронная загрузка задерживает первоначальный рендеринг страницы и ухудшает First Contentful Paint (FCP).\n\nЧтобы предотвратить блокировку пользовательского интерфейса, Intlayer интегрируется с API React Suspense. Он загружает парсер в фоновом режиме и выдает Promise во время загрузки.\n\nОберните любой компонент, рендерящий Intlayer Markdown, в границу ``. Это отобразит локализованное резервное состояние во время загрузки фрагмента, позволяя остальной части вашего DOM рендериться немедленно.\n\nПредупреждение: Если вы не предоставите границу ``, React приостановит работу на корневом уровне или заблокирует рендеринг всего дерева компонентов до тех пор, пока фрагмент размером 55 КБ не будет полностью загружен.\n\n\n \n\nВ маршрутизаторе Next.js App Router вы можете использовать либо React `Suspense` для клиентских компонентов, либо файл `loading.tsx` для серверных компонентов.\n\n**Клиентский компонент:**\n\n```tsx fileName=\"components/MyComponent.tsx\"\n\"use client\";\nimport { useIntlayer } from \"next-intlayer\";\nimport { Suspense } from \"react\";\n\nconst MyComponent = () => {\n const markdownContent = useIntlayer(\"my-markdown\");\n\n return (\n Loading...}>{markdownContent}\n );\n};\n```\n\n**Серверный компонент с `loading.tsx`:**\n\n```tsx fileName=\"app/loading.tsx\"\nexport default function Loading() {\n return
;\n};\n\nexport default MyPage;\n```\n\n \n\n \n\n```tsx\nimport { useIntlayer } from \"react-intlayer\";\nimport { Suspense } from \"react\";\n\nconst MyComponent = () => {\n const markdownContent = useIntlayer(\"my-markdown\");\n\n return (\n Loading...}>{markdownContent}\n );\n};\n```\n\n \n \n \n\nВ Vue есть встроенный компонент ``. Оберните компонент, рендерящий содержимое Markdown, в границу ``.\n\n```vue fileName=\"MyComponent.vue\"\n\n\n\n \n \n \n
Loading...
\n \n \n\n```\n\n \n \n\nSvelte не имеет эквивалента API Suspense. Используйте блок `{#await}` для обработки асинхронного рендеринга содержимого Markdown.\n\n```svelte fileName=\"MyComponent.svelte\"\n\n\n{#await $content.markdownContent}\n
Loading...
\n{:then rendered}\n {@html rendered}\n{/await}\n```\n\n \n \n\nPreact поддерживает API React Suspense через `preact/compat`.\n\n```tsx fileName=\"MyComponent.tsx\"\nimport { useIntlayer } from \"preact-intlayer\";\nimport { Suspense } from \"preact/compat\";\n\nconst MyComponent = () => {\n const markdownContent = useIntlayer(\"my-markdown\");\n\n return (\n Loading...}>{markdownContent}\n );\n};\n```\n\n \n \n\nВ Solid есть собственный компонент `` из `solid-js`.\n\n```tsx fileName=\"MyComponent.tsx\"\nimport { useIntlayer } from \"solid-intlayer\";\nimport { Suspense } from \"solid-js\";\n\nconst MyComponent = () => {\n const { markdownContent } = useIntlayer(\"my-markdown\");\n\n return (\n Loading...}>{markdownContent}\n );\n};\n```\n\n \n \n\nAngular не имеет API Suspense. Используйте отложенные представления (`@defer`) для обработки лениво загружаемого содержимого Markdown (требуется Angular 17+).\n\n```typescript fileName=\"my.component.ts\"\nimport { Component } from \"@angular/core\";\nimport { useIntlayer } from \"angular-intlayer\";\n\n@Component({\n selector: \"app-my\",\n template: `\n @defer {\n \n } @loading {\n
Loading...
\n }\n `,\n})\nexport class MyComponent {\n content = useIntlayer(\"my-markdown\");\n}\n```\n\n \n\n\n---\n\n## Рендеринг на стороне сервера (SSR) и гидратация\n\nПо сравнению с другими парсерами Markdown, такими как remark / rehype, Intlayer Markdown не имеет зависимостей и работает как на клиенте, так и на сервере.\n\nОднако Intlayer оптимизирует синтаксический анализ для фреймворков серверного рендеринга (SSR) (таких как Next.js App Router, React Router, Nuxt, SvelteKit и т. д.).\n\nВместо отправки необработанных строк Markdown клиенту и их анализа в браузере (что приводит к снижению производительности), Intlayer позволяет предварительно проанализировать Markdown в абстрактное синтаксическое дерево (AST) на сервере.\n\nВы можете использовать функцию `parseMarkdown` из пакета Intlayer вашего фреймворка на стороне сервера для генерации сериализуемого AST (объекта `ParsedMarkdown`) и передачи его непосредственно на фронтенд. Все утилиты рендеринга Intlayer (такие как ``, `useMarkdownRenderer` и т. д.) автоматически принимают этот объект AST и плавно рендерят его.\n\n### Пример в архитектуре Сервер/Клиент\n\n\n \n\n ```tsx fileName=\"server.ts\"\n import { parseMarkdown } from \"react-intlayer/markdown\";\n\n // 1. На сервере: преобразовать markdown в сериализуемое AST\n export const loader = async () => {\n const markdownString = \"## My title \\n\\nLorem Ipsum\";\n const ast = parseMarkdown(markdownString);\n\n // Возвратить AST клиенту в формате JSON\n return Response.json({ content: ast });\n };\n ```\n\n ```tsx fileName=\"client.tsx\"\n import { useLoaderData } from \"react-router\";\n import { MarkdownRenderer } from \"react-intlayer/markdown\";\n\n // 2. На клиенте: отрендерить AST напрямую без повторного анализа\n export default function Page() {\n const { content } = useLoaderData();\n\n // Рендерер принимает либо необработанную строку, либо проанализированное AST\n return ;\n }\n ```\n\n \n \n\n ```tsx fileName=\"app/page.tsx\"\n import { parseMarkdown } from \"next-intlayer/markdown\";\n import { MarkdownRenderer } from \"next-intlayer/markdown\";\n\n export default async function Page() {\n // 1. Преобразовать markdown в сериализуемое AST на сервере\n const markdownString = \"## My title \\n\\nLorem Ipsum\";\n const ast = parseMarkdown(markdownString);\n\n // 2. Отрендерить AST напрямую\n // В серверном компоненте это работает бесшовно и передает AST\n // напрямую в базовые клиентские компоненты, если это необходимо.\n return ;\n }\n ```\n\n \n \n\n ```vue fileName=\"pages/index.vue\"\n \n\n \n \n \n \n ```\n\n \n \n\n ```typescript fileName=\"+page.server.ts\"\n import { parseMarkdown } from \"svelte-intlayer/markdown\";\n\n // 1. На сервере: преобразовать markdown в сериализуемое AST\n export const load = async () => {\n const markdownString = \"## My title \\n\\nLorem Ipsum\";\n const ast = parseMarkdown(markdownString);\n\n // Возвратить AST клиенту\n return { content: ast };\n };\n ```\n\n ```svelte fileName=\"+page.svelte\"\n \n\n \n \n ```\n\n \n \n\n Angular SSR обычно разрешает данные на сервере во время первоначальной загрузки и выполняет гидратацию на клиенте. Вы можете использовать резолверы для передачи AST.\n\n ```typescript fileName=\"app.resolver.ts\"\n import { Injectable } from \"@angular/core\";\n import { Resolve } from \"@angular/router\";\n import { parseMarkdown, type ParsedMarkdown } from \"angular-intlayer/markdown\";\n\n @Injectable({ providedIn: \"root\" })\n export class MarkdownResolver implements Resolve {\n resolve(): ParsedMarkdown {\n const markdownString = \"## My title \\n\\nLorem Ipsum\";\n // 1. На сервере: преобразовать markdown в сериализуемое AST\n return parseMarkdown(markdownString);\n }\n }\n ```\n\n ```typescript fileName=\"app.component.ts\"\n import { Component } from \"@angular/core\";\n import { ActivatedRoute } from \"@angular/router\";\n import { IntlayerMarkdownService, type ParsedMarkdown } from \"angular-intlayer/markdown\";\n\n @Component({\n selector: \"app-root\",\n template: ``,\n })\n export class AppComponent {\n renderedMarkdown: string = \"\";\n\n constructor(\n private route: ActivatedRoute,\n private markdownService: IntlayerMarkdownService\n ) {\n // 2. На клиенте: отрендерить AST напрямую без повторного анализа\n this.route.data.subscribe((data) => {\n this.renderedMarkdown = this.markdownService.renderMarkdown(\n data.markdownAst\n ) as string;\n });\n }\n }\n ```\n\n \n\n\nЭтот подход гарантирует, что логика анализа Markdown полностью выполняется на сервере, что значительно сокращает время выполнения на стороне клиента и повышает скорость первоначальной гидратации.\n\n## Справочник по опциям\n\nЭти параметры могут быть переданы в `MarkdownProvider`, `MarkdownRenderer`, `useMarkdownRenderer` и `renderMarkdown`.\n\n| Option | Type | Default | Описание |\n| :-------------------- | :---------- | :------ | :----------------------------------------------------------------------------------------- |\n| `forceBlock` | `boolean` | `false` | Принудительно оборачивает вывод в блочный элемент (например, `
`). |\n| `forceInline` | `boolean` | `false` | Принудительно оборачивает вывод во встроенный элемент (например, ``). |\n| `tagfilter` | `boolean` | `true` | Включает фильтр тегов GitHub для повышения безопасности путем удаления опасных тегов HTML. |\n| `preserveFrontmatter` | `boolean` | `false` | Если `true`, начальный мета-блок (frontmatter) в строке Markdown не будет удален. |\n| `components` | `Overrides` | `{}` | Карта HTML-тегов в пользовательские компоненты (например, `{ h1: MyHeading }`). |\n| `wrapper` | `Component` | `null` | Пользовательский компонент для обертывания отрендеренного Markdown. |\n| `renderMarkdown` | `Function` | `null` | Пользовательская функция рендеринга для полной замены компилятора Markdown по умолчанию. |\n","description":"Узнайте, как объявлять и использовать Markdown-контент на вашем многоязычном сайте с помощью Intlayer. Следуйте инструкциям в этой документации, чтобы легко интегрировать Markdown в ваш проект.","url":"https://intlayer.org/ru/doc/concept/content/markdown","datePublished":"2025-02-07","dateModified":"2026-05-19","version":"8.11.0","keywords":"Markdown, Интернационализация, Документация, Intlayer, Next.js, JavaScript, React","license":"https://raw.githubusercontent.com/aymericzip/intlayer/refs/heads/main/LICENSE","audience":{"@type":"Audience","audienceType":"Разработчики, менеджеры контента"}}
Intlayer поддерживает форматированный текстовый контент, определенный с использованием синтаксиса Markdown. Это позволяет легко писать и поддерживать контент со сложным форматированием, такой как блоги, статьи и многое другое.
Объявление Markdown-контента
Вы можете объявить Markdown-контент с помощью функции md или просто как строку (если она содержит синтаксис Markdown).
Начиная с версии 8.10.0, вы можете объявлять Markdown-контент непосредственно в файлах .content.md. Intlayer автоматически обнаружит и проанализирует Markdown-контент.
markdown-file.en.content.md
Копировать код
Копировать код в буфер обмена
---key: my-markdown-contentdescription: Мой контентlocale: en---# Мой контентВот пример Markdown-контента
Поле locale в front-matter определяет локаль контента. Оно необязательно. Если оно не указано, Intlayer будет использовать локаль по умолчанию, которая также используется в качестве резервной локали (fallback), если перевод для конкретной локали недоступен.
Вы можете добавить в front-matter любые свойства, определенные в определении словаря
Используйте функцию md для явного объявления Markdown-контента. Это полезно, если вы хотите гарантировать, что строка будет обрабатываться как Markdown, даже если она не содержит явного синтаксиса.
markdownDictionary.content.ts
Копировать код
Копировать код в буфер обмена
import { md, type Dictionary } from "intlayer";const markdownDictionary = { key: "app", content: { myMarkdownContent: md("## My title \n\nLorem Ipsum"), },} satisfies Dictionary;export default markdownDictionary;
Импортируйте файлы .md напрямую, используя функцию file.
Если строка содержит общие признаки Markdown (такие как заголовки, списки, ссылки и т. д.), Intlayer автоматически преобразует ее.
markdownDictionary.content.ts
Копировать код
Копировать код в буфер обмена
export default { key: "app", contentAutoTransformation: true, // Включить автоматическое обнаружение Markdown контента — можно установить глобально в intlayer.config.ts content: { myMarkdownContent: "## My title \n\nLorem Ipsum", },};
Рендеринг Markdown
Intlayer предоставляет два независимых способа рендеринга Markdown:
Через useIntlayer
— Intlayer автоматически преобразует узел md в нативный вывод фреймворка (JSX, VNode, HTML-строка).
Frontmatter парсится и предоставляется как .metadata. Вы можете переопределить рендеринг на двух уровнях — глобально с помощью MarkdownProvider (или эквивалента для вашего фреймворка) и локально для каждого узла с помощью .use(). Оба метода можно комбинировать; .use() имеет приоритет над MarkdownProvider, который, в свою очередь, имеет приоритет над поведением по умолчанию.
Вспомогательные утилиты — <MarkdownRenderer />, useMarkdownRenderer() и renderMarkdown() являются автономными инструментами, которые принимают только необработанные строки Markdown (raw strings). Они не зависят от useIntlayer и не работают с декорированными узлами, которые он возвращает.
Рендеринг Markdown поддерживает MDX — используйте любой JSX компонент или компонент фреймворка по имени прямо в вашем Markdown.
1. Автоматический рендеринг (через useIntlayer)
Markdown-узлы могут быть отрисованы напрямую как JSX.
Рендерер Markdown в Intlayer загружается динамически. Несмотря на оптимизацию, базовый фрагмент парсера составляет около 55 КБ. Его синхронная загрузка задерживает первоначальный рендеринг страницы и ухудшает First Contentful Paint (FCP).
Чтобы предотвратить блокировку пользовательского интерфейса, Intlayer интегрируется с API React Suspense. Он загружает парсер в фоновом режиме и выдает Promise во время загрузки.
Оберните любой компонент, рендерящий Intlayer Markdown, в границу <Suspense>. Это отобразит локализованное резервное состояние во время загрузки фрагмента, позволяя остальной части вашего DOM рендериться немедленно.
Предупреждение: Если вы не предоставите границу <Suspense>, React приостановит работу на корневом уровне или заблокирует рендеринг всего дерева компонентов до тех пор, пока фрагмент размером 55 КБ не будет полностью загружен.
В маршрутизаторе Next.js App Router вы можете использовать либо React Suspense для клиентских компонентов, либо файл loading.tsx для серверных компонентов.
Angular не имеет API Suspense. Используйте отложенные представления (@defer) для обработки лениво загружаемого содержимого Markdown (требуется Angular 17+).
my.component.ts
Копировать код
Копировать код в буфер обмена
import { Component } from "@angular/core";import { useIntlayer } from "angular-intlayer";@Component({selector: "app-my",template: ` @defer { <div [innerHTML]="content().markdownContent"></div> } @loading { <div>Loading...</div> }`,})export class MyComponent {content = useIntlayer("my-markdown");}
Рендеринг на стороне сервера (SSR) и гидратация
По сравнению с другими парсерами Markdown, такими как remark / rehype, Intlayer Markdown не имеет зависимостей и работает как на клиенте, так и на сервере.
Однако Intlayer оптимизирует синтаксический анализ для фреймворков серверного рендеринга (SSR) (таких как Next.js App Router, React Router, Nuxt, SvelteKit и т. д.).
Вместо отправки необработанных строк Markdown клиенту и их анализа в браузере (что приводит к снижению производительности), Intlayer позволяет предварительно проанализировать Markdown в абстрактное синтаксическое дерево (AST) на сервере.
Вы можете использовать функцию parseMarkdown из пакета Intlayer вашего фреймворка на стороне сервера для генерации сериализуемого AST (объекта ParsedMarkdown) и передачи его непосредственно на фронтенд. Все утилиты рендеринга Intlayer (такие как <MarkdownRenderer>, useMarkdownRenderer и т. д.) автоматически принимают этот объект AST и плавно рендерят его.
Пример в архитектуре Сервер/Клиент
server.ts
Копировать код
Копировать код в буфер обмена
import { parseMarkdown } from "react-intlayer/markdown";// 1. На сервере: преобразовать markdown в сериализуемое ASTexport const loader = async () => { const markdownString = "## My title \n\nLorem Ipsum"; const ast = parseMarkdown(markdownString); // Возвратить AST клиенту в формате JSON return Response.json({ content: ast });};
client.tsx
Копировать код
Копировать код в буфер обмена
import { useLoaderData } from "react-router";import { MarkdownRenderer } from "react-intlayer/markdown";// 2. На клиенте: отрендерить AST напрямую без повторного анализаexport default function Page() { const { content } = useLoaderData(); // Рендерер принимает либо необработанную строку, либо проанализированное AST return <MarkdownRenderer content={content} />;}
app/page.tsx
Копировать код
Копировать код в буфер обмена
import { parseMarkdown } from "next-intlayer/markdown";import { MarkdownRenderer } from "next-intlayer/markdown";export default async function Page() { // 1. Преобразовать markdown в сериализуемое AST на сервере const markdownString = "## My title \n\nLorem Ipsum"; const ast = parseMarkdown(markdownString); // 2. Отрендерить AST напрямую // В серверном компоненте это работает бесшовно и передает AST// напрямую в базовые клиентские компоненты, если это необходимо. return <MarkdownRenderer content={ast} />;}
pages/index.vue
Копировать код
Копировать код в буфер обмена
<script setup lang="ts">import { parseMarkdown } from "vue-intlayer/markdown";import { MarkdownRenderer } from "vue-intlayer/markdown";// 1. Получить и преобразовать markdown в AST на сервереconst { data: ast } = await useAsyncData('markdown', () => { const markdownString = "## My title \n\nLorem Ipsum"; return parseMarkdown(markdownString);});</script><template> <!-- 2. На клиенте: отрендерить AST напрямую без повторного анализа --> <MarkdownRenderer :content="ast" /></template>
+page.server.ts
Копировать код
Копировать код в буфер обмена
import { parseMarkdown } from "svelte-intlayer/markdown";// 1. На сервере: преобразовать markdown в сериализуемое ASTexport const load = async () => { const markdownString = "## My title \n\nLorem Ipsum"; const ast = parseMarkdown(markdownString); // Возвратить AST клиенту return { content: ast };};
+page.svelte
Копировать код
Копировать код в буфер обмена
<script lang="ts"> import { MarkdownRenderer } from "svelte-intlayer/markdown"; export let data;</script><!-- 2. На клиенте: отрендерить AST напрямую без повторного анализа --><MarkdownRenderer value={data.content} />
Angular SSR обычно разрешает данные на сервере во время первоначальной загрузки и выполняет гидратацию на клиенте. Вы можете использовать резолверы для передачи AST.
app.resolver.ts
Копировать код
Копировать код в буфер обмена
import { Injectable } from "@angular/core";import { Resolve } from "@angular/router";import { parseMarkdown, type ParsedMarkdown } from "angular-intlayer/markdown";@Injectable({ providedIn: "root" })export class MarkdownResolver implements Resolve<ParsedMarkdown> { resolve(): ParsedMarkdown { const markdownString = "## My title \n\nLorem Ipsum"; // 1. На сервере: преобразовать markdown в сериализуемое AST return parseMarkdown(markdownString); }}
app.component.ts
Копировать код
Копировать код в буфер обмена
import { Component } from "@angular/core";import { ActivatedRoute } from "@angular/router";import { IntlayerMarkdownService, type ParsedMarkdown } from "angular-intlayer/markdown";@Component({ selector: "app-root", template: `<div [innerHTML]="renderedMarkdown"></div>`,})export class AppComponent { renderedMarkdown: string = ""; constructor( private route: ActivatedRoute, private markdownService: IntlayerMarkdownService ) { // 2. На клиенте: отрендерить AST напрямую без повторного анализа this.route.data.subscribe((data) => { this.renderedMarkdown = this.markdownService.renderMarkdown( data.markdownAst ) as string; }); }}
Этот подход гарантирует, что логика анализа Markdown полностью выполняется на сервере, что значительно сокращает время выполнения на стороне клиента и повышает скорость первоначальной гидратации.
Справочник по опциям
Эти параметры могут быть переданы в MarkdownProvider, MarkdownRenderer, useMarkdownRenderer и renderMarkdown.
Показать все данные таблицы
Открыть таблицу в модальном окне для четкого просмотра всех данных
Option
Type
Default
Описание
forceBlock
boolean
false
Принудительно оборачивает вывод в блочный элемент (например, <div>).
forceInline
boolean
false
Принудительно оборачивает вывод во встроенный элемент (например, <span>).
tagfilter
boolean
true
Включает фильтр тегов GitHub для повышения безопасности путем удаления опасных тегов HTML.
preserveFrontmatter
boolean
false
Если true, начальный мета-блок (frontmatter) в строке Markdown не будет удален.
components
Overrides
{}
Карта HTML-тегов в пользовательские компоненты (например, { h1: MyHeading }).
wrapper
Component
null
Пользовательский компонент для обертывания отрендеренного Markdown.
renderMarkdown
Function
null
Пользовательская функция рендеринга для полной замены компилятора Markdown по умолчанию.