compileToReact()

Compile input Markdown atau MDX dan langsung kembalikan elemen React, beserta frontmatter, diagnostics, stats, dan TOC.

import { compileToReact } from "@unifast/react";

Signature

function compileToReact(
  input: string,
  options: CompileToReactOptions,
): CompileToReactResult

Parameter

input

PropertiTipeDefaultDeskripsi
inputstringSumber Markdown atau MDX

options

Opsi compile beserta konfigurasi khusus React

PropertiTipeDefaultDeskripsi
createElementCreateElementFungsi createElement dari React
FragmentunknownKomponen Fragment dari React
components?ComponentMapPemetaan dari nama tag HTML ke komponen React

Memperluas CompileOptions — semua opsi compile lainnya juga diterima.

Return

PropertiTipeDeskripsi
elementunknownElemen React root
frontmatterRecord<string, unknown>Metadata frontmatter yang sudah di-parse
diagnosticsDiagnostic[]Peringatan dan error
stats{ parseMs, transformMs, emitMs }Rincian timing (ms)
tocTocEntry[]Daftar isi yang diekstrak

Penggunaan

import { createElement, Fragment } from "react";
import { compileToReact } from "@unifast/react";
import { gfm, frontmatter, toc } from "@unifast/node";

const { element, frontmatter: fm, toc: tocEntries, diagnostics, stats } = compileToReact(
  md,
  {
    createElement,
    Fragment,
    components: {
      h1: ({ children, ...props }) => <h1 className="title" {...props}>{children}</h1>,
      a: ({ children, ...props }) => <a target="_blank" {...props}>{children}</a>,
    },
    plugins: [gfm(), frontmatter(), toc()],
  },
);

Contoh

Penggunaan dasar

import { createElement, Fragment } from "react";
import { compileToReact } from "@unifast/react";

const { element } = compileToReact(
  "# Hello, **world**!",
  { createElement, Fragment },
);

function Page() {
  return <div>{element}</div>;
}

Dengan komponen kustom

import { createElement, Fragment } from "react";
import { compileToReact } from "@unifast/react";

const { element } = compileToReact(md, {
  createElement,
  Fragment,
  components: {
    h1: ({ children, ...props }) => (
      <h1 className="text-4xl font-bold" {...props}>{children}</h1>
    ),
    a: ({ children, ...props }) => (
      <a className="text-blue-500 underline" target="_blank" {...props}>{children}</a>
    ),
    code: ({ children, ...props }) => (
      <code className="bg-gray-100 rounded px-1" {...props}>{children}</code>
    ),
  },
});

Server-side rendering

import { createElement, Fragment } from "react";
import { renderToString } from "react-dom/server";
import { compileToReact } from "@unifast/react";

const { element } = compileToReact(md, { createElement, Fragment });
const html = renderToString(element);

console.log(html);
// Rendered HTML string for SSR

Menggunakan frontmatter dan TOC

import { createElement, Fragment } from "react";
import { compileToReact } from "@unifast/react";
import { frontmatter, toc } from "@unifast/node";

const md = `---
title: My Page
---

# Introduction

## Setup

## Usage
`;

const result = compileToReact(md, {
  createElement,
  Fragment,
  plugins: [frontmatter(), toc()],
});

console.log(result.frontmatter);
// { title: "My Page" }

console.log(result.toc);
// [
//   { depth: 1, text: "Introduction", slug: "introduction" },
//   { depth: 2, text: "Setup", slug: "setup" },
//   { depth: 2, text: "Usage", slug: "usage" },
// ]