Skip to Content
SSR

SSR (μ„œλ²„ μ‚¬μ΄λ“œ λ Œλ”λ§)

InkioλŠ” Next.js App Router ν™˜κ²½μ—μ„œ SSR을 μ§€μ›ν•©λ‹ˆλ‹€.

λ™μž‘ 방식

  1. μ„œλ²„: generateHTML(@tiptap/html)둜 정적 HTML 생성
  2. ν΄λΌμ΄μ–ΈνŠΈ: 정적 HTML을 SSR shell둜 ν‘œμ‹œ β†’ Tiptap 에디터가 hydration ν›„ λŒ€μ²΄

SSR shell은 ν΄λΌμ΄μ–ΈνŠΈμ™€ λ™μΌν•œ HTML을 μƒμ„±ν•˜λ―€λ‘œ hydration mismatchκ°€ λ°œμƒν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μ„€μ •

별도 μ„€μ • 없이 λ™μž‘ν•©λ‹ˆλ‹€. Editor와 Viewer μ»΄ν¬λ„ŒνŠΈκ°€ μžλ™μœΌλ‘œ SSR을 μ²˜λ¦¬ν•©λ‹ˆλ‹€.

// Next.js App Router β€” μžλ™ SSR import { Editor } from '@inkio/editor'; import '@inkio/editor/style.css'; export default function Page() { return <Editor initialContent={content} />; }

HTML λ¬Έμžμ—΄ μž…λ ₯

content prop에 HTML λ¬Έμžμ—΄μ„ μ „λ‹¬ν•˜λ©΄, μ„œλ²„μ—μ„œλŠ” sanitize-html둜 XSSλ₯Ό λ°©μ§€ν•œ ν›„ λ Œλ”λ§ν•©λ‹ˆλ‹€.

<Editor content="<p>Hello <strong>World</strong></p>" />

λ³΄μ•ˆ

  • JSON μ½˜ν…μΈ : @tiptap/html의 DOM 기반 λ Œλ”λ§μœΌλ‘œ ν…μŠ€νŠΈ λ…Έλ“œ μžλ™ μ΄μŠ€μΌ€μ΄ν”„
  • HTML λ¬Έμžμ—΄: sanitize-html ν™”μ΄νŠΈλ¦¬μŠ€νŠΈ 기반 필터링
  • ν—ˆμš©λœ μŠ€νƒ€μΌ: color, background-color, text-align만 ν—ˆμš©
  • μ°¨λ‹¨λœ ν”„λ‘œν† μ½œ: javascript:, data:, vbscript:

μ£Όμ˜μ‚¬ν•­

  • parseMarkdown은 DOM이 ν•„μš”ν•˜λ―€λ‘œ λͺ¨λ“ˆ λ ˆλ²¨μ—μ„œ ν˜ΈμΆœν•  수 μ—†μŠ΅λ‹ˆλ‹€
  • 'use client' μ§€μ‹œμ–΄λŠ” Editor/Viewer μ»΄ν¬λ„ŒνŠΈμ— 이미 ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€
Last updated on