Skip to Content
์‹œ์ž‘ํ•˜๊ธฐ

์‹œ์ž‘ํ•˜๊ธฐ

์ด ๊ฐ€์ด๋“œ๋Š” Inkio๋ฅผ ํ”„๋กœ์ ํŠธ์— ํ†ตํ•ฉํ•˜๋Š” ์ตœ์†Œ ๋‹จ๊ณ„๋งŒ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์„ค์น˜

npm install @inkio/editor @inkio/extension react react-dom

์Šคํƒ€์ผ ์„ ํƒ

import '@inkio/editor/minimal.css'; import '@inkio/extension/style.css';

๊ธฐ๋ณธ ์‚ฌ์šฉ

import { useMemo, useState } from 'react'; import { Editor, getDefaultCoreExtensions } from '@inkio/editor'; import { Callout } from '@inkio/extension/callout'; import { HashTag } from '@inkio/extension/hashtag'; import { SlashCommand } from '@inkio/extension/slash-command'; import { WikiLink } from '@inkio/extension/wikilink'; import '@inkio/editor/minimal.css'; import '@inkio/extension/style.css'; const tags = ['inkio', 'editor', 'react', 'nextjs']; export function MyEditorPage() { const [content, setContent] = useState({ type: 'doc', content: [{ type: 'paragraph' }], }); const extensions = useMemo( () => [ ...getDefaultCoreExtensions({ placeholder: 'Start typing...', }), Callout, HashTag.configure({ items: ({ query }) => tags .filter((tag) => tag.includes(query.toLowerCase())) .map((tag) => ({ id: tag, label: `#${tag}` })), }), SlashCommand, WikiLink, ], [], ); return ( <Editor content={content} extensions={extensions} showBubbleMenu showFloatingMenu onUpdate={setContent} /> ); }

getDefaultInkioExtensions()๋Š” ํŽธ์˜์šฉ full preset์ž…๋‹ˆ๋‹ค. ๋น ๋ฅด๊ฒŒ ์ „ ๊ธฐ๋Šฅ์„ ๋ถ™์ผ ๋•Œ๋Š” ์œ ์šฉํ•˜์ง€๋งŒ, ์‹œ์ž‘์ ์œผ๋กœ๋Š” getDefaultCoreExtensions()์— ํ•„์š”ํ•œ extension๋งŒ ์ง์ ‘ ์กฐํ•ฉํ•˜๋Š” ๋ฐฉ์‹์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. HashTag๋Š” #์™€ heading markdown shortcut ์ถฉ๋Œ ๋•Œ๋ฌธ์— opt-in์ž…๋‹ˆ๋‹ค. ImageBlock์€ core ๊ธฐ๋ณธ ๊ตฌ์„ฑ์— ํฌํ•จ๋˜๋ฉฐ, ํ•„์š”ํ•˜๋ฉด @inkio/editor์—์„œ ์ง์ ‘ importํ•ด์„œ ์˜ต์…˜์„ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

i18n ์ „๋žต

Inkio ๊ธฐ๋ณธ ๋‚ด์žฅ ๋ฉ”์‹œ์ง€๋Š” ์˜์–ด(en)๋งŒ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • locale์€ unknown ์ž…๋ ฅ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.
  • locale์€ ๋ฌธ์ž์—ด, Accept-Language ๋ฌธ์ž์—ด, ๋ฐฐ์—ด, Intl.Locale, locale-like ๊ฐ์ฒด๋ฅผ ํ•ด์„ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹ค๊ตญ์–ด ๋ฉ”์‹œ์ง€๋Š” ์†Œ๋น„์ž๊ฐ€ messages prop์œผ๋กœ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค.
  • ํ•ด์„ ์‹คํŒจ/๋ฉ”์‹œ์ง€ ๋ˆ„๋ฝ ์‹œ ์˜์–ด ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ํด๋ฐฑํ•ฉ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๊ทœ์น™์€ i18n-locale ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

Controlled / Uncontrolled

import { Editor } from '@inkio/editor'; // controlled <Editor content={content} onUpdate={setContent} /> // uncontrolled <Editor initialContent={initialContent} onUpdate={setContent} />

content์™€ initialContent๋Š” ๋™์‹œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

์Šคํƒ€์ผ์ด ์•ˆ ๋ณด์ผ ๋•Œ

์Šคํƒ€์ผ ์—”ํŠธ๋ฆฌ๋ฅผ ๋ฐ˜๋“œ์‹œ importํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

ํ™•์žฅ UI๊ฐ€ ๊นจ์งˆ ๋•Œ

@inkio/extension/style.css๊ฐ€ import๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. SlashCommand, HashTag, BlockHandle, Comment, ImageEditorModal์— ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€ ํŽธ์ง‘ UI๊ฐ€ ๊นจ์งˆ ๋•Œ

@inkio/extension/style.css๊ฐ€ import๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

SSR ์˜ค๋ฅ˜(window is not defined)

์—๋””ํ„ฐ๋Š” ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์—์„œ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Next.js App Router๋ผ๋ฉด ํŒŒ์ผ ์ƒ๋‹จ์— 'use client';๋ฅผ ์„ ์–ธํ•˜์„ธ์š”.

Last updated on