;\n ```\n\n #### `renderMarkdown()` Yardımcı Programı\n\n ```tsx\n import { renderMarkdown } from \"solid-intlayer/markdown\";\n\n return
{renderMarkdown(\"# Başlığım\")}
;\n ```\n\n \n \n #### `IntlayerMarkdownService` Hizmeti\n Hizmeti kullanarak bir Markdown dizesini oluşturur.\n\n ```typescript\n import { IntlayerMarkdownService } from \"angular-intlayer/markdown\";\n\n export class MyComponent {\n constructor(private markdownService: IntlayerMarkdownService) {}\n\n renderMarkdown(markdown: string) {\n return this.markdownService.renderMarkdown(markdown);\n }\n }\n ```\n\n \n\n\n## `MarkdownProvider` ile Global Yapılandırma\n\n`MarkdownProvider` (veya çerçeve eşdeğeri), tüm uygulamanız için Markdown oluşturma işlem hattını yapılandırır. Bu hem otomatik `useIntlayer` oluşturma işlemleri hem de yardımcı araçlar için geçerlidir. Burada ayarlanan seçenekler varsayılanlardır — `.use()` bunları düğüm düzeyinde geçersiz kılar.\n\n\n \n\n ```tsx fileName=\"AppProvider.tsx\"\n import { MarkdownProvider } from \"react-intlayer/markdown\";\n\n export const AppProvider = ({ children }) => (\n ,\n a: ({ href, ...props }) => ,\n MyCustomJSXComponent: (props) => ,\n }}\n >\n {children}\n \n );\n ```\n\n\n > MDX desteklenir — Markdown'ınızın içinde kullanılan herhangi bir bileşen adı (örn. ``) `components` haritasına göre çözümlenir.\n\n Kendi markdown oluşturucunuzu da kullanabilirsiniz:\n\n ```tsx fileName=\"AppProvider.tsx\"\n import { MarkdownProvider } from \"react-intlayer/markdown\";\n\n export const AppProvider = ({ children }) => (\n {\n // Use dynamic import to reduce the bundle size of your application\n const { renderMarkdown } = await import('react-intlayer/markdown');\n return renderMarkdown(md);\n }}\n >\n {children}\n \n );\n ```\n\n > Markdown oluşturucunuzu dinamik olarak içe aktarmak, uygulamanızın bundle boyutunu azaltmanın harika bir yoludur.\n\n \n \n\n ```tsx fileName=\"AppProvider.tsx\"\n import { MarkdownProvider } from \"next-intlayer/markdown\";\n\n export const AppProvider = ({ children }) => (\n ,\n a: ({ href, ...props }) => ,\n MyCustomJSXComponent: (props) => ,\n }}\n >\n {children}\n \n );\n ```\n\n\n > MDX desteklenir — Markdown'ınızın içinde kullanılan herhangi bir bileşen adı (örn. ``) `components` haritasına göre çözümlenir.\n\n Kendi markdown oluşturucunuzu da kullanabilirsiniz:\n\n ```tsx fileName=\"AppProvider.tsx\"\n import { MarkdownProvider } from \"next-intlayer/markdown\";\n\n export const AppProvider = ({ children }) => (\n {\n // Use dynamic import to reduce the bundle size of your application\n const { renderMarkdown } = await import('next-intlayer/markdown');\n return renderMarkdown(md);\n }}\n >\n {children}\n \n );\n ```\n\n > Markdown oluşturucunuzu dinamik olarak içe aktarmak, uygulamanızın bundle boyutunu azaltmanın harika bir yoludur.\n\n \n \n\n ```typescript fileName=\"main.ts\"\n import { createApp } from \"vue\";\n import { intlayer } from \"vue-intlayer\";\n import { intlayerMarkdown } from \"vue-intlayer/markdown\";\n import App from \"./App.vue\";\n\n const app = createApp(App);\n\n app.use(intlayer);\n app.use(intlayerMarkdown, {\n components: {\n h1: (props) =>\n h('h1', { style: { color: 'orange' }, ...props }, props.children),\n ComponentDemo: () => h('div', { style: { background: 'grey' } }, 'DEMO'),\n bold: (props) => h('strong', props),\n code: (props) => h('code', props),\n },\n });\n\n app.mount(\"#app\");\n ```\n\n\n > MDX desteklenir — Markdown'ınızın içinde kullanılan herhangi bir bileşen adı (örn. ``) `components` haritasına göre çözümlenir.\n\n Kendi markdown oluşturucunuzu da kullanabilirsiniz:\n\n ```typescript fileName=\"main.ts\"\n import { createApp } from \"vue\";\n import { intlayer } from \"vue-intlayer\";\n import { intlayerMarkdown } from \"vue-intlayer/markdown\";\n import App from \"./App.vue\";\n\n const app = createApp(App);\n\n app.use(intlayer);\n app.use(intlayerMarkdown, {\n renderMarkdown: async (md) => {\n const { renderMarkdown } = await import('vue-intlayer/markdown');\n return renderMarkdown(md);\n },\n });\n\n app.mount(\"#app\");\n ```\n\n > Markdown oluşturucunuzu dinamik olarak içe aktarmak, uygulamanızın bundle boyutunu azaltmanın harika bir yoludur.\n\n \n \n\n ```svelte fileName=\"App.svelte\"\n \n\n \n \n \n ```\n\n\n > MDX desteklenir — Markdown'ınızın içinde kullanılan herhangi bir bileşen adı (örn. ``) `components` haritasına göre çözümlenir.\n\n Kendi markdown oluşturucunuzu da kullanabilirsiniz:\n\n ```svelte fileName=\"App.svelte\"\n \n\n {\n const { renderMarkdown } = await import('svelte-intlayer/markdown');\n return renderMarkdown(md);\n }}\n >\n \n \n ```\n\n > Markdown oluşturucunuzu dinamik olarak içe aktarmak, uygulamanızın bundle boyutunu azaltmanın harika bir yoludur.\n\n \n \n\n ```tsx fileName=\"AppProvider.tsx\"\n import { MarkdownProvider } from \"preact-intlayer/markdown\";\n\n export const AppProvider = ({ children }) => (\n
{children}
,\n }}\n >\n {children}\n \n );\n ```\n\n\n > MDX desteklenir — Markdown'ınızın içinde kullanılan herhangi bir bileşen adı (örn. ``) `components` haritasına göre çözümlenir.\n\n Kendi markdown oluşturucunuzu da kullanabilirsiniz:\n\n ```tsx fileName=\"AppProvider.tsx\"\n import { MarkdownProvider } from \"preact-intlayer/markdown\";\n\n export const AppProvider = ({ children }) => (\n {\n const { renderMarkdown } = await import('preact-intlayer/markdown');\n return renderMarkdown(md);\n }}\n >\n {children}\n \n );\n ```\n\n > Markdown oluşturucunuzu dinamik olarak içe aktarmak, uygulamanızın bundle boyutunu azaltmanın harika bir yoludur.\n\n \n \n\n ```tsx fileName=\"AppProvider.tsx\"\n import { MarkdownProvider } from \"solid-intlayer/markdown\";\n\n export const AppProvider = (props) => (\n
{props.children}
,\n }}\n >\n {props.children}\n \n );\n ```\n\n\n > MDX desteklenir — Markdown'ınızın içinde kullanılan herhangi bir bileşen adı (örn. ``) `components` haritasına göre çözümlenir.\n\n Kendi markdown oluşturucunuzu da kullanabilirsiniz:\n\n ```tsx fileName=\"AppProvider.tsx\"\n import { MarkdownProvider } from \"solid-intlayer/markdown\";\n\n export const AppProvider = (props) => (\n {\n const { renderMarkdown } = await import('solid-intlayer/markdown');\n return renderMarkdown(md);\n }}\n >\n {props.children}\n \n );\n ```\n\n > Markdown oluşturucunuzu dinamik olarak içe aktarmak, uygulamanızın bundle boyutunu azaltmanın harika bir yoludur.\n\n \n \n\n ```typescript fileName=\"app.module.ts\"\n import { NgModule } from '@angular/core';\n import { IntlayerMarkdownModule } from 'angular-intlayer/markdown';\n\n @NgModule({\n imports: [\n IntlayerMarkdownModule.forRoot({\n renderMarkdown: async (md) => {\n const { renderMarkdown } = await import('angular-intlayer/markdown');\n return renderMarkdown(md);\n }\n })\n ]\n })\n export class AppModule {}\n ```\n\n > Markdown oluşturucunuzu dinamik olarak içe aktarmak, uygulamanızın bundle boyutunu azaltmanın harika bir yoludur.\n\n \n\n\n## Suspense\n\nIntlayer Markdown oluşturucu dinamik olarak yüklenir. Optimize edilmiş olmasına rağmen, temel ayrıştırıcı parçası yaklaşık 55 kb'dir. Bunu senkron olarak yüklemek, ilk sayfa oluşturulmasını geciktirir ve First Contentful Paint'i (FCP) bozar.\n\nUI engellemesini önlemek için, Intlayer React'in Suspense API'si ile entegre olur. Arka planda ayrıştırıcıyı getirir ve indirme sırasında bir Promise fırlatır.\n\nIntlayer Markdown'ı oluşturan herhangi bir bileşeni bir `` sınırına sarın. Bu, parça indirilirken yerelleştirilmiş bir geri dönüş durumunu göstererek DOM'nizin geri kalanının anında oluşturulmasına izin verir.\n\nUyarı: Bir `` sınırı sağlamazsanız, React 55 kb'lik parça tam olarak yüklenene kadar kök seviyesinde askıya alınır veya tüm bileşen ağacının oluşturulmasını engeller.\n\n\n \n\nNext.js App Router'da, istemci bileşenleri için React `Suspense`'i veya sunucu bileşenleri için bir `loading.tsx` dosyası kullanabilirsiniz.\n\n**İstemci Bileşeni:**\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` ile Sunucu Bileşeni:**\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\nVue, yerleşik bir `` bileşenine sahiptir. Markdown içeriğini oluşturan bileşeni bir `` sınırına sarın.\n\n```vue fileName=\"MyComponent.vue\"\n\n\n\n \n \n \n
Loading...
\n \n \n\n```\n\n \n \n\nSvelte'nin bir Suspense API eşdeğeri yoktur. Markdown içeriğinin asenkron olarak oluşturulmasını işlemek için bir `{#await}` bloğu kullanın.\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, `preact/compat` aracılığıyla React'in Suspense API'sini destekler.\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\nSolid, `solid-js`'den kendi `` bileşenine sahiptir.\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'da bir Suspense API'si yoktur. Geç yüklenen Markdown içeriğini işlemek için Angular'ın ertelenebilir görünümlerini (`@defer`) kullanın (Angular 17+ gerektirir).\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## Sunucu Tarafı İşleme (SSR) ve Hidrasyon\n\nRemark / rehype gibi diğer Markdown ayrıştırıcılarıyla karşılaştırıldığında, Intlayer Markdown bağımlılık içermez ve hem istemci hem de sunucu tarafında çalışır.\n\nAncak Intlayer, Sunucu Tarafı İşleme (SSR) çerçeveleri (Next.js App Router, React Router, Nuxt, SvelteKit vb. gibi) için ayrıştırmayı optimize etmiştir.\n\nHam Markdown dizelerini istemciye göndermek ve tarayıcıda ayrıştırmak (bu da performans kaybına neden olur) yerine, Intlayer, Markdown'u sunucuda bir Soyut Sözdizimi Ağacı (AST) olarak önceden ayrıştırmanıza olanak tanır.\n\nSerileştirilebilir bir AST (`ParsedMarkdown` nesnesi) oluşturmak için sunucu tarafında çerçevenizin Intlayer paketindeki `parseMarkdown` işlevini kullanabilir ve bunu doğrudan ön uca aktarabilirsiniz. Tüm Intlayer işleme yardımcı programları ( ``, `useMarkdownRenderer` vb. gibi) bu AST nesnesini otomatik olarak kabul eder ve sorunsuz bir şekilde işler.\n\n### Sunucu/İstemci Mimarisinde Örnek\n\n\n \n\n ```tsx fileName=\"server.ts\"\n import { parseMarkdown } from \"react-intlayer/markdown\";\n\n // 1. Sunucuda: Markdown'u serileştirilebilir bir AST'ye ayrıştırın\n export const loader = async () => {\n const markdownString = \"## My title \\n\\nLorem Ipsum\";\n const ast = parseMarkdown(markdownString);\n\n // AST'yi istemciye JSON olarak döndürün\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. İstemcide: AST'yi yeniden ayrıştırmadan doğrudan işleyin\n export default function Page() {\n const { content } = useLoaderData();\n\n // İşleyici, ham bir dizeyi veya ayrıştırılmış AST'yi kabul eder\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. Sunucuda Markdown'u serileştirilebilir bir AST'ye ayrıştırın\n const markdownString = \"## My title \\n\\nLorem Ipsum\";\n const ast = parseMarkdown(markdownString);\n\n // 2. AST'yi doğrudan işleyin\n // Bir Server Component içinde bu sorunsuz çalışır ve gerekirse AST'yi\n // doğrudan alt istemci bileşenlerine iletir.\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. Sunucuda: Markdown'u serileştirilebilir bir AST'ye ayrıştırın\n export const load = async () => {\n const markdownString = \"## My title \\n\\nLorem Ipsum\";\n const ast = parseMarkdown(markdownString);\n\n // AST'yi istemciye döndürün\n return { content: ast };\n };\n ```\n\n ```svelte fileName=\"+page.svelte\"\n \n\n \n \n ```\n\n \n \n\n Angular SSR, verileri genellikle ilk yükleme sırasında sunucuda çözümler ve istemcide hidrasyon gerçekleştirir. AST'yi iletmek için çözümleyiciler (resolvers) kullanabilirsiniz.\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. Sunucuda: Markdown'u serileştirilebilir bir AST'ye ayrıştırın\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. İstemcide: AST'yi yeniden ayrıştırmadan doğrudan işleyin\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\nBu model, Markdown ayrıştırma mantığının tamamen sunucuda çalıştırılmasını sağlayarak istemci tarafındaki yürütme süresini önemli ölçüde azaltır ve ilk hidrasyon hızını artırır.\n\n## Seçenek Referansı\n\nBu seçenekler `MarkdownProvider`, `MarkdownRenderer`, `useMarkdownRenderer` ve `renderMarkdown`a iletilebilir.\n\n| Option | Type | Default | Açıklama |\n| :-------------------- | :---------- | :------ | :----------------------------------------------------------------------------------------------------- |\n| `forceBlock` | `boolean` | `false` | Çıktının bir blok düzeyinde öğeye (örn. `
`) sarılmasını zorlar. |\n| `forceInline` | `boolean` | `false` | Çıktının bir satır içi öğeye (örn. ``) sarılmasını zorlar. |\n| `tagfilter` | `boolean` | `true` | Tehlikeli HTML etiketlerini kaldırarak güvenliği artırmak için GitHub Etiket Filtresini etkinleştirir. |\n| `preserveFrontmatter` | `boolean` | `false` | `true` ise, Markdown dizesinin başındaki frontmatter kaldırılmaz. |\n| `components` | `Overrides` | `{}` | HTML etiketlerinden özel bileşenlere bir eşleme (örn. `{ h1: MyHeading }`). |\n| `wrapper` | `Component` | `null` | Oluşturulan Markdown'u sarmak için özel bir bileşen. |\n| `renderMarkdown` | `Function` | `null` | Varsayılan Markdown derleyicisini tamamen değiştirmek için özel bir oluşturma işlevi. |\n","description":"Intlayer ile çok dilli web sitenizde Markdown içeriğini nasıl bildireceğinizi ve kullanacağınızı öğrenin. Projenize Markdown'ı sorunsuz bir şekilde entegre etmek için bu çevrimiçi belgelerdeki adımları izleyin.","url":"https://intlayer.org/tr/doc/concept/content/markdown","datePublished":"2025-02-07","dateModified":"2026-05-19","version":"8.11.0","keywords":"Markdown, Uluslararasılaştırma, Dokümantasyon, Intlayer, Next.js, JavaScript, React","license":"https://raw.githubusercontent.com/aymericzip/intlayer/refs/heads/main/LICENSE","audience":{"@type":"Audience","audienceType":"Geliştiriciler, İçerik Yöneticileri"}}
Intlayer, Markdown sözdizimi kullanılarak tanımlanan zengin metin içeriğini destekler. Bu, bloglar, makaleler ve daha fazlası gibi zengin biçimlendirilmiş içerikleri kolayca yazmanıza ve sürdürmenize olanak tanır.
Markdown İçeriğini Bildirme
Markdown içeriğini md işlevini kullanarak veya basitçe bir dize olarak (Markdown sözdizimi içeriyorsa) bildirebilirsiniz.
Sürüm 8.10.0'dan itibaren Markdown içeriğini doğrudan .content.md dosyalarında bildirebilirsiniz. Intlayer, Markdown içeriğini otomatik olarak algılar ve ayrıştırır.
markdown-file.en.content.md
Kodu kopyala
Kodu panoya kopyala
---key: my-markdown-contentdescription: İçeriğimlocale: en---# İçeriğimİşte bir markdown içerik örneği
locale ön madde alanı, içeriğin yerel ayarını tanımlayan alandır. İsteğe bağlıdır. Sağlanmazsa, Intlayer varsayılan yerel ayarı kullanacaktır; bu, belirli bir yerel ayar için çeviri mevcut değilse aynı zamanda geri dönüş yerel ayarı olarak da kullanılır.
Ön maddeye Sözlük Tanımı bölümünde tanımlanan özellikleri ekleyebilirsiniz.
Markdown içeriğini açıkça bildirmek için md işlevini kullanın. Bu, belirgin bir sözdizimi içermese bile bir dizenin Markdown olarak ele alınmasını sağlamak istiyorsanız kullanışlıdır.
Dize ortak Markdown göstergeleri (başlıklar, listeler, bağlantılar vb.) içeriyorsa, Intlayer bunu otomatik olarak dönüştürecektir.
markdownDictionary.content.ts
Kodu kopyala
Kodu panoya kopyala
export default { key: "app", contentAutoTransformation: true, // Markdown içeriğinin otomatik algılanmasını etkinleştir - intlayer.config.ts dosyasında global olarak ayarlanabilir content: { myMarkdownContent: "## Başlığım \n\nLorem Ipsum", },};
Markdown'u İşleme (Rendering)
Intlayer, Markdown'ı işlemek için iki bağımsız yol sağlar:
useIntlayer aracılığıyla
— Intlayer, md düğümünü çerçevenin yerel çıktısına (JSX, VNode, HTML dizesi) otomatik olarak dönüştürür.
Frontmatter ayrıştırılır ve .metadata olarak sunulur. İşlemeyi iki düzeyde geçersiz kılabilirsiniz — MarkdownProvider (veya çerçeve eşdeğeri) ile global olarak ve .use() ile düğüm başına yerel olarak. Her ikisi de birleştirilebilir; .use(), MarkdownProvider'dan önceliklidir ve o da varsayılandan önceliklidir.
Yardımcı araçlar — <MarkdownRenderer />, useMarkdownRenderer() ve renderMarkdown(), yalnızca ham Markdown dizelerini kabul eden bağımsız araçlardır. useIntlayer'dan bağımsızdırlar ve döndürdüğü süslenmiş düğümlerle çalışmazlar.
Markdown oluşturma MDX'i destekler — Markdown'ınızın içinde doğrudan adıyla herhangi bir JSX/çerçeve bileşenini kullanın.
1. Otomatik İşleme (useIntlayer aracılığıyla)
Markdown düğümleri doğrudan JSX olarak işlenebilir.
Bu yardımcı programlar yalnızca ham Markdown dizelerini oluşturur ve useIntlayer'dan bağımsızdır. Markdown'ı sözlükleriniz dışındaki kaynaklardan oluşturmanız gerektiğinde bunları kullanın.
<MarkdownRenderer /> Bileşeni
Belirli seçeneklerle bir Markdown dizesini oluşturur.
tsx
Kodu kopyala
Kodu panoya kopyala
import { MarkdownRenderer } from "react-intlayer/markdown";<MarkdownRenderer forceBlock={true} tagfilter={true}> {"# Başlığım"}</MarkdownRenderer>
useMarkdownRenderer() Kancası
Önceden yapılandırılmış bir oluşturucu işlevi alın.
import { renderMarkdown } from "solid-intlayer/markdown";return <div>{renderMarkdown("# Başlığım")}</div>;
IntlayerMarkdownService Hizmeti
Hizmeti kullanarak bir Markdown dizesini oluşturur.
typescript
Kodu kopyala
Kodu panoya kopyala
import { IntlayerMarkdownService } from "angular-intlayer/markdown";export class MyComponent { constructor(private markdownService: IntlayerMarkdownService) {} renderMarkdown(markdown: string) { return this.markdownService.renderMarkdown(markdown); }}
MarkdownProvider ile Global Yapılandırma
MarkdownProvider (veya çerçeve eşdeğeri), tüm uygulamanız için Markdown oluşturma işlem hattını yapılandırır. Bu hem otomatik useIntlayer oluşturma işlemleri hem de yardımcı araçlar için geçerlidir. Burada ayarlanan seçenekler varsayılanlardır — .use() bunları düğüm düzeyinde geçersiz kılar.
Markdown oluşturucunuzu dinamik olarak içe aktarmak, uygulamanızın bundle boyutunu azaltmanın harika bir yoludur.
Suspense
Intlayer Markdown oluşturucu dinamik olarak yüklenir. Optimize edilmiş olmasına rağmen, temel ayrıştırıcı parçası yaklaşık 55 kb'dir. Bunu senkron olarak yüklemek, ilk sayfa oluşturulmasını geciktirir ve First Contentful Paint'i (FCP) bozar.
UI engellemesini önlemek için, Intlayer React'in Suspense API'si ile entegre olur. Arka planda ayrıştırıcıyı getirir ve indirme sırasında bir Promise fırlatır.
Intlayer Markdown'ı oluşturan herhangi bir bileşeni bir <Suspense> sınırına sarın. Bu, parça indirilirken yerelleştirilmiş bir geri dönüş durumunu göstererek DOM'nizin geri kalanının anında oluşturulmasına izin verir.
Uyarı: Bir <Suspense> sınırı sağlamazsanız, React 55 kb'lik parça tam olarak yüklenene kadar kök seviyesinde askıya alınır veya tüm bileşen ağacının oluşturulmasını engeller.
Next.js App Router'da, istemci bileşenleri için React Suspense'i veya sunucu bileşenleri için bir loading.tsx dosyası kullanabilirsiniz.
Angular'da bir Suspense API'si yoktur. Geç yüklenen Markdown içeriğini işlemek için Angular'ın ertelenebilir görünümlerini (@defer) kullanın (Angular 17+ gerektirir).
my.component.ts
Kodu kopyala
Kodu panoya kopyala
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");}
Sunucu Tarafı İşleme (SSR) ve Hidrasyon
Remark / rehype gibi diğer Markdown ayrıştırıcılarıyla karşılaştırıldığında, Intlayer Markdown bağımlılık içermez ve hem istemci hem de sunucu tarafında çalışır.
Ancak Intlayer, Sunucu Tarafı İşleme (SSR) çerçeveleri (Next.js App Router, React Router, Nuxt, SvelteKit vb. gibi) için ayrıştırmayı optimize etmiştir.
Ham Markdown dizelerini istemciye göndermek ve tarayıcıda ayrıştırmak (bu da performans kaybına neden olur) yerine, Intlayer, Markdown'u sunucuda bir Soyut Sözdizimi Ağacı (AST) olarak önceden ayrıştırmanıza olanak tanır.
Serileştirilebilir bir AST (ParsedMarkdown nesnesi) oluşturmak için sunucu tarafında çerçevenizin Intlayer paketindeki parseMarkdown işlevini kullanabilir ve bunu doğrudan ön uca aktarabilirsiniz. Tüm Intlayer işleme yardımcı programları ( <MarkdownRenderer>, useMarkdownRenderer vb. gibi) bu AST nesnesini otomatik olarak kabul eder ve sorunsuz bir şekilde işler.
Sunucu/İstemci Mimarisinde Örnek
server.ts
Kodu kopyala
Kodu panoya kopyala
import { parseMarkdown } from "react-intlayer/markdown";// 1. Sunucuda: Markdown'u serileştirilebilir bir AST'ye ayrıştırınexport const loader = async () => { const markdownString = "## My title \n\nLorem Ipsum"; const ast = parseMarkdown(markdownString); // AST'yi istemciye JSON olarak döndürün return Response.json({ content: ast });};
client.tsx
Kodu kopyala
Kodu panoya kopyala
import { useLoaderData } from "react-router";import { MarkdownRenderer } from "react-intlayer/markdown";// 2. İstemcide: AST'yi yeniden ayrıştırmadan doğrudan işleyinexport default function Page() { const { content } = useLoaderData(); // İşleyici, ham bir dizeyi veya ayrıştırılmış AST'yi kabul eder return <MarkdownRenderer content={content} />;}
app/page.tsx
Kodu kopyala
Kodu panoya kopyala
import { parseMarkdown } from "next-intlayer/markdown";import { MarkdownRenderer } from "next-intlayer/markdown";export default async function Page() { // 1. Sunucuda Markdown'u serileştirilebilir bir AST'ye ayrıştırın const markdownString = "## My title \n\nLorem Ipsum"; const ast = parseMarkdown(markdownString); // 2. AST'yi doğrudan işleyin // Bir Server Component içinde bu sorunsuz çalışır ve gerekirse AST'yi// doğrudan alt istemci bileşenlerine iletir. return <MarkdownRenderer content={ast} />;}
pages/index.vue
Kodu kopyala
Kodu panoya kopyala
<script setup lang="ts">import { parseMarkdown } from "vue-intlayer/markdown";import { MarkdownRenderer } from "vue-intlayer/markdown";// 1. Sunucuda markdown'u getirin ve bir AST'ye ayrıştırınconst { data: ast } = await useAsyncData('markdown', () => { const markdownString = "## My title \n\nLorem Ipsum"; return parseMarkdown(markdownString);});</script><template> <!-- 2. İstemcide: AST'yi yeniden ayrıştırmadan doğrudan işleyin --> <MarkdownRenderer :content="ast" /></template>
<script lang="ts"> import { MarkdownRenderer } from "svelte-intlayer/markdown"; export let data;</script><!-- 2. İstemcide: AST'yi yeniden ayrıştırmadan doğrudan işleyin --><MarkdownRenderer value={data.content} />
Angular SSR, verileri genellikle ilk yükleme sırasında sunucuda çözümler ve istemcide hidrasyon gerçekleştirir. AST'yi iletmek için çözümleyiciler (resolvers) kullanabilirsiniz.
app.resolver.ts
Kodu kopyala
Kodu panoya kopyala
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. Sunucuda: Markdown'u serileştirilebilir bir AST'ye ayrıştırın return parseMarkdown(markdownString); }}
app.component.ts
Kodu kopyala
Kodu panoya kopyala
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. İstemcide: AST'yi yeniden ayrıştırmadan doğrudan işleyin this.route.data.subscribe((data) => { this.renderedMarkdown = this.markdownService.renderMarkdown( data.markdownAst ) as string; }); }}
Bu model, Markdown ayrıştırma mantığının tamamen sunucuda çalıştırılmasını sağlayarak istemci tarafındaki yürütme süresini önemli ölçüde azaltır ve ilk hidrasyon hızını artırır.
Seçenek Referansı
Bu seçenekler MarkdownProvider, MarkdownRenderer, useMarkdownRenderer ve renderMarkdowna iletilebilir.
Tüm tablo içeriğini göster
Tüm veri içeriğini net bir şekilde görmek için tabloyu modalde açın
Option
Type
Default
Açıklama
forceBlock
boolean
false
Çıktının bir blok düzeyinde öğeye (örn. <div>) sarılmasını zorlar.
forceInline
boolean
false
Çıktının bir satır içi öğeye (örn. <span>) sarılmasını zorlar.
tagfilter
boolean
true
Tehlikeli HTML etiketlerini kaldırarak güvenliği artırmak için GitHub Etiket Filtresini etkinleştirir.
preserveFrontmatter
boolean
false
true ise, Markdown dizesinin başındaki frontmatter kaldırılmaz.
components
Overrides
{}
HTML etiketlerinden özel bileşenlere bir eşleme (örn. { h1: MyHeading }).
wrapper
Component
null
Oluşturulan Markdown'u sarmak için özel bir bileşen.
renderMarkdown
Function
null
Varsayılan Markdown derleyicisini tamamen değiştirmek için özel bir oluşturma işlevi.