이번에 새롭게 시작한 프로젝트에서 웹 에디터를 사용해야 할 일이 생겨서 두 개의 라이브러리를 직접 사용해 본 후기를 작성하겠습니다.
react-draft-wysiwyg_editor.tsx
import { EditorProps } from "react-draft-wysiwyg";
import { EditorState } from "draft-js";
import "react-draft-wysiwyg/dist/react-draft-wysiwyg.css";
import dynamic from "next/dynamic";
import { useState } from "react";
const Editor = dynamic<EditorProps>(
() => import("react-draft-wysiwyg").then((mod) => mod.Editor),
{
ssr: false,
}
);
const MyEditor = () => {
const [editorState, setEditorState] = useState<EditorState>(
EditorState.createEmpty()
);
const updateTextDescription = (state: EditorState) => {
setEditorState(state);
};
const uploadCallback = () => {
console.log("이미지 업로드");
};
return (
<div>
<Editor
editorState={editorState}
onEditorStateChange={updateTextDescription}
toolbar={{
inline: {
options: ["bold", "italic", "underline", "strikethrough"],
},
blockType: {
inDropdown: false,
options: [
"Normal",
"H1",
"H2",
"H3",
"H4",
"H5",
"H6",
"Blockquote",
"Code",
],
},
image: { uploadCallback: uploadCallback },
}}
localization={{ locale: "ko" }}
editorStyle={{
width: "100%",
height: "100%",
}}
placeholder="여러분의 경험을 자유롭게 적어주세요."
/>
</div>
);
};
export default MyEditor;
위의 코드가 내가 작성한 "react-draft-wysiwyg" 라이브러리를 사용한 코드인데 적용하는 과정에서 typescript를 사용함으로서 생기는 문제점이 있었는데, 바로 'window is undefined' error 이다.
이 에러는 빌드타임에서 불러오는 것이 불가능하기 때문에 NextJs에서 제공하는 dynamic module을 활용해 런타임에서 라이브러리를 불러오도록 하는 방식으로 해결해야 하는데
const Editor = dynamic<EditorProps>(
() => import("react-draft-wysiwyg").then((mod) => mod.Editor),
{
ssr: false,
}
);
이 코드가 바로 해당 에러를 해결하기 위해 넣어준 코드이다.
그리고 또 다른 문제가 있었는데
이런 식으로 적용이 잘 되었으나 드롭다운 메뉴나 사진 및 이모티콘 아이콘을 클릭하면 효과가 실행이 되지 않는 오류를 발견하였다..
공식 문서 참조 및 구글링, 챗 gpt에 이유를 검색해보았으나 해결하지 못했고 결국 React-Quill 을 사용하기로 결정했다.
일단 여기까지 "react-draft-wysiwyg" 라이브러리를 사용해봤을 때 장점과 단점을 정리해보겠다.
다음 게시물에서는 react-quill의 사용과 장단점에 대해 포스팅 할 예정이다.