본문으로 건너뛰기

@noxion/notion-renderer

npm install @noxion/notion-renderer
# 또는
bun add @noxion/notion-renderer

Notion 페이지를 위한 완전 커스텀 React 렌더러입니다. Noxion의 렌더링 코어로서 react-notion-x를 대체하며, 마크업, CSS, 접근성, 렌더링 동작에 대한 완전한 제어권을 제공합니다.

피어 의존성: react >= 18.0.0, notion-types >= 7.0.0, notion-utils >= 7.0.0 선택적 피어 의존성: mermaid (Mermaid 플러그인용), chart.js (Chart 플러그인용)


왜 커스텀 렌더러인가?

react-notion-x는 강력한 라이브러리이지만 렌더링과 스타일링이 강하게 결합되어 있어 CSS 오버라이드가 어렵고, 서버 사이드 KaTeX가 없으며, Shiki가 내장되어 있지 않고, 블록 컴포넌트의 트리 셰이킹이 불가능합니다. @noxion/notion-renderer는 이 모든 문제를 해결하기 위해 만들어졌습니다:

기능react-notion-x@noxion/notion-renderer
블록 커버리지✅ 30+ 블록 타입
KaTeX 렌더링클라이언트 전용katex.renderToString() SSR
구문 강조Prism (클라이언트)✅ Shiki (듀얼 테마 CSS 변수)
CSS 오버라이드어려움✅ BEM + CSS 커스텀 속성
트리 셰이킹✅ 각 블록이 named export
커스텀 블록 오버라이드제한적components.blockOverrides
다크 모드테마 기반✅ CSS 변수 + darkMode prop
플러그인 시스템✅ 렌더 타임 플러그인 훅
에러 바운더리✅ 블록별 에러 격리
지연 로딩✅ Suspense를 사용한 createLazyBlock
접근성기본✅ ARIA 레이블, 키보드 네비게이션

설치 및 설정

1. 설치

bun add @noxion/notion-renderer
# 피어 의존성 (보통 @noxion/core를 통해 이미 설치됨)
bun add notion-types notion-utils react

2. 스타일 임포트

/* app/globals.css 또는 동일한 파일 */
@import '@noxion/notion-renderer/styles';

/* 선택 사항: 수식을 위한 KaTeX 스타일 */
@import '@noxion/notion-renderer/katex-css';

3. 페이지 렌더링

"use client";
import { NotionRenderer } from "@noxion/notion-renderer";
import type { ExtendedRecordMap } from "notion-types";

interface Props {
recordMap: ExtendedRecordMap;
pageId: string;
}

export function MyNotionPage({ recordMap, pageId }: Props) {
return (
<NotionRenderer
recordMap={recordMap}
rootPageId={pageId}
fullPage={true}
darkMode={false}
/>
);
}

익스포트

메인 컴포넌트

익스포트설명
<NotionRenderer />최상위 렌더러 — NotionRendererProvider + NotionBlock을 래핑

컨텍스트 & 훅

익스포트설명
NotionRendererProvider렌더러 상태를 위한 React 컨텍스트 프로바이더
useNotionRenderer()전체 렌더러 컨텍스트 접근
useNotionBlock(blockId)레코드 맵에서 ID로 블록 조회

블록 컴포넌트

30개 이상의 블록 컴포넌트가 named export로 제공됩니다. components.blockOverrides를 통해 직접 사용하거나 오버라이드할 수 있습니다. 전체 목록은 블록 컴포넌트를 참조하세요.

익스포트렌더링 대상
TextBlock단락 / 일반 텍스트
HeadingBlockH1, H2, H3 (Notion: header, sub_header, sub_sub_header)
BulletedListBlock글머리 기호 목록 항목
NumberedListBlock번호 매기기 목록 항목
ToDoBlock체크박스 / 할 일 항목
QuoteBlock인용 블록
CalloutBlock이모지 아이콘이 있는 콜아웃
DividerBlock수평선
ToggleBlock접을 수 있는 토글
PageBlock하위 페이지 링크
EquationBlock블록 수식 (KaTeX SSR)
CodeBlockShiki 구문 강조 코드 블록
ImageBlock캡션이 있는 이미지 (mapImageUrl 적용)
VideoBlock동영상 임베드
AudioBlock오디오 임베드
EmbedBlock일반 iframe 임베드
BookmarkBlock풍부한 링크 미리보기
FileBlock파일 첨부
PdfBlockPDF 임베드
TableBlock
ColumnListBlock열 레이아웃 컨테이너
ColumnBlock개별 열
SyncedContainerBlock동기화된 블록 (원본)
SyncedReferenceBlock동기화된 블록 (참조)
AliasBlock블록 별칭
TableOfContentsBlock자동 목차
CollectionViewPlaceholder데이터베이스 / 컬렉션 뷰 (플레이스홀더)
CollectionViewBlockNotion 데이터베이스를 위한 인터랙티브 테이블 뷰 (지연 로딩)

인라인 컴포넌트

익스포트설명
<Text />리치 텍스트 렌더러 — 모든 Notion 인라인 데코레이션 처리
<InlineEquation />인라인 KaTeX 수식

플러그인 시스템

익스포트설명
RendererPlugin블록 오버라이드, 변환, 라이프사이클 훅을 포함한 플러그인 인터페이스
RendererPluginFactory플러그인 생성을 위한 타입 안정성 팩토리 함수
resolveBlockRenderer블록을 렌더링할 컴포넌트 결정 (플러그인 오버라이드 또는 내장)
executeBlockTransforms모든 플러그인의 transformBlock 훅 실행
executeTextTransforms모든 플러그인의 transformText 훅 실행
applyTextTransforms텍스트 변환을 적용하고 ReactNode 배열 반환

내장 플러그인

익스포트설명
createMermaidPlugin코드 블록에서 Mermaid 다이어그램 렌더링 (mermaid 피어 의존성 필요)
createChartPlugin코드 블록에서 Chart.js 차트 렌더링 (chart.js 피어 의존성 필요)
createCalloutTransformPlugin이모지 아이콘에 따라 콜아웃을 아코디언이나 탭으로 변환
createEmbedEnhancedPlugin제공자별 강화된 임베드 렌더링
createTextTransformPlugin위키링크 [[Page]]#hashtag 텍스트 변환

새 컴포넌트

익스포트설명
BlockErrorBoundary블록별 에러 격리를 위한 React 에러 바운더리
HeadingAnchor헤딩을 위한 클릭 가능한 앵커 링크
BlockActions블록을 위한 복사/공유 액션 버튼
LoadingPlaceholder지연 로딩되는 블록을 위한 로딩 상태 플레이스홀더

유틸리티

익스포트설명
formatNotionDate(dateValue)Notion 날짜 값을 사람이 읽을 수 있는 문자열로 변환
unwrapBlockValue(record)Notion 레코드에서 { role, value } 래퍼 언래핑
getBlockTitle(block)블록의 properties에서 일반 텍스트 제목 추출
cs(...classes)조건부 클래스명 유틸리티 (clsx와 유사)

새 유틸리티

익스포트설명
createLazyBlock블록 컴포넌트를 위해 Suspense와 에러 바운더리로 React.lazy() 래핑
generateHeadingId중복 제거 기능이 포함된 안정적이고 URL 안전한 헤딩 ID 생성
getAriaLabel블록을 위한 접근성 레이블 생성
handleKeyboardActivation인터랙티브 요소를 위한 Enter/Space 키보드 이벤트 처리
getToggleContentId토글 콘텐츠를 위한 고유 ID 생성 (aria-controls)

Shiki

익스포트설명
createShikiHighlighter(options)Shiki 기반 HighlightCodeFn 생성
normalizeLanguage(language)Notion 언어명을 Shiki 언어 ID로 변환

타입

익스포트설명
NotionRendererProps<NotionRenderer />의 Props
NotionRendererContextValue렌더러 컨텍스트 형태
NotionBlockProps모든 블록 컴포넌트에 전달되는 Props
NotionComponents컴포넌트 오버라이드 맵
MapPageUrlFn(pageId: string) => string
MapImageUrlFn(url: string, block: Block) => string
HighlightCodeFn(code: string, language: string) => string
ExtendedRecordMapnotion-types에서 재익스포트
Blocknotion-types에서 재익스포트
BlockTypenotion-types에서 재익스포트
Decorationnotion-types에서 재익스포트
RendererPlugin플러그인 인터페이스
RendererPluginFactory플러그인 팩토리 타입
BlockOverrideArgs플러그인 blockOverride 훅에 전달되는 인자
BlockOverrideResult플러그인 blockOverride 훅의 결과
TransformBlockArgstransformBlock 훅에 전달되는 인자
TransformTextArgstransformText 훅에 전달되는 인자
TextReplacement컴포넌트를 포함한 텍스트 교체
TextTransformResulttransformText 훅의 결과
PluginPriority플러그인 실행 우선순위 열거형

CSS 익스포트

임포트 경로내용
@noxion/notion-renderer/styles모든 블록 스타일 (BEM, CSS 커스텀 속성)
@noxion/notion-renderer/katex-cssKaTeX 수식 스타일시트

지원하는 Notion 블록 타입

Notion 블록 타입컴포넌트비고
textTextBlock일반 단락
headerHeadingBlock<h1>
sub_headerHeadingBlock<h2>
sub_sub_headerHeadingBlock<h3>
bulleted_listBulletedListBlock<ul><li>
numbered_listNumberedListBlock<ol><li>
to_doToDoBlock체크박스
quoteQuoteBlock<blockquote>
calloutCalloutBlock아이콘이 있는 콜아웃
dividerDividerBlock<hr>
toggleToggleBlock<details><summary>
pagePageBlock하위 페이지 링크
equationEquationBlock블록 KaTeX
codeCodeBlockShiki 구문 강조 코드
imageImageBlock<figure><img>
videoVideoBlock동영상 임베드
audioAudioBlock오디오 임베드
embedEmbedBlock일반 iframe
gistEmbedBlockGitHub Gist
figmaEmbedBlockFigma 임베드
tweetEmbedBlockTwitter/X 임베드
mapsEmbedBlockGoogle 지도
miroEmbedBlockMiro 보드
codepenEmbedBlockCodePen
excalidrawEmbedBlockExcalidraw
bookmarkBookmarkBlock풍부한 링크 미리보기
fileFileBlock파일 첨부
pdfPdfBlockPDF 뷰어
tableTableBlockNotion 표
table_rowTextBlock표 행
column_listColumnListBlock열 레이아웃
columnColumnBlock
transclusion_containerSyncedContainerBlock동기화된 블록 (원본)
transclusion_referenceSyncedReferenceBlock동기화된 블록 (참조)
aliasAliasBlock블록 별칭
table_of_contentsTableOfContentsBlock목차
collection_viewCollectionViewBlock인터랙티브 테이블 뷰 (지연 로딩)
collection_view_pageCollectionViewBlock전체 페이지 인터랙티브 테이블 뷰
breadcrumbDividerBlock브레드크럼 (구분선으로 렌더링)
external_object_instanceEmbedBlock외부 객체