SO 클론 프로젝트 CRUD에 TOAST-UI 에디터 라이브러리를 사용했다. 아래 react 라이브러리 후보 중에 처음에는 stacks-editor를 선택했다. (stackoverflow 클론이니까 당연 UI가 같은 에디터가 Best!)
1. stacks-editor
2. react-md-editor
3. toast-ui
4. react-markdown-editor-lite
5. react-quill
하지만 적용하면서 옵션을 설정하거나 이미지 업로드 등 정보를 찾기 힘들어서 프로젝트 중간에 정보와 예시가 많은 toast-ui로 급히 변경하게 되었다.
🛑 toast-ui는 react@17.0.1에 의존성을 가진다. 18버전에서 toast-ui를 설치하면서 만났던 의존성 에러 (upstream-dependency-conflict)는 👉 여기
npm i --save @toast-ui/react-editor
toast-ui에는 크게 Editor와 Viewer 컴포넌트로 나누어서 설명할 수 있을 것 같다. 가이드가 잘 되어 있고 사례가 많아서 적용하는 것은 어렵지 않았다.
Editor
컴포넌트 안에 중복을 피하기 위해서 Writer
라는 이름으로 에디터를 import 해주었다.
// Editor.js
import { Editor as Writer } from '@toast-ui/react-editor';
import '@toast-ui/editor/dist/toastui-editor.css';
import { Viewer } from '@toast-ui/react-editor';
import '@toast-ui/editor/dist/toastui-editor.css';
코드 에디터에서 필수 플러그인이 아닐까 싶은데, 사용방법은 👉 여기
간략하게 소개하자면,
npm install @toast-ui/editor-plugin-code-syntax-highlight
import codeSyntaxHighlight from '@toast-ui/editor-plugin-code-syntax-highlight';
import '@toast-ui/editor-plugin-code-syntax-highlight/dist/toastui-editor-plugin-code-syntax-highlight.css';
import prism from 'prismjs';
import 'prismjs/themes/prism.css';
코드 하이라이트 플러그인 설치 후, 테마를 위해 prism
과 각각의 css 파일을 import 한다. 아래는 Editor 컴포넌트(Editor as Writer
)에 적용한 옵션 중에 plugins={...}
항목 참고.
<Viewer>
역시 옵션에 plugins={...}
항목을 추가해야 적용된다.
<div>
<Writer
previewStyle="tab"
height={height}
initialEditType="markdown"
initialValue="## *Your* **markdown** here"
ref={editorRef}
plugins={[[codeSyntaxHighlight, { highlighter: prism }]]}
hideModeSwitch={true}
onChange={onChangeHandle}
useCommandShortcut={false}
hooks={{
addImageBlobHook: onUploadImage,
}}
toolbarItems={[
['heading', 'bold', 'strike'],
['hr', 'quote'],
['ul', 'ol', 'task'],
['table', 'image', 'link'],
['code', 'codeblock'],
]}
/>
</div>
<div>
{content && (
<Viewer
initialValue={JSON.parse(content)}
plugins={[[codeSyntaxHighlight, { highlighter: Prism }]]}
/>
)}
</div>
JSON.stringify()
), 서버에서 HTML태그를 가져와 파싱(JSON.parse()
)한 후 Viewer에 출력 👉 여기