テキストエディタ比較(前編)react-quill/Editor.js
react-quillとEditor.jsを中心に、テキストエディタライブラリの特徴・利点・懸念点を比較。選定のポイントを詳しく解説!
以前、ノート共有型SNSの投稿フォーム実装についてご紹介という記事でreact-quillのことについて紹介させていただきました。今回は、Reactに対応している複数のテキストエディタライブラリがあった中で、どのように比較検討しQuillを選定することになったのか書いていきたいと思います。
比較したテキストエディタライブラリ
比較項目
- データ構造
- 編集前と編集後の差分を保持出来る形式であるか
- 利点
- 懸念点
データ構造
- Deltaという独自のデータ構造
Delta形式
{
ops: [
{ insert: 'Gandalf', attributes: { bold: true } },
{ insert: ' the ' },
{ insert: 'Grey', attributes: { color: '#cccccc' } }
]
}利点
- 日々メンテナンスが行われていて、開発が活発 2020/08/23時点
Toolbarのメニューは自由にカスタマイズ可能- 入力された情報を都度検知出来る
- 選択された文字の色・背景色を変更することが可能
- 写真・URLでビデオが入れられる
- moduleを使うことでカスタマイズが容易
懸念点
- 閲覧者モード(Read only mode)は提供されている機能として備わっていない
- 閲覧者モードとは、プレビューのみで編集は出来ないモードを指します。Qiitaでいうプレビューモードです。
Toolbarの位置を変更しUIを調整する & 閲覧者モードでは不要のイベントハンドラを無効にすることで対応可能
Editor.js
データ構造
- JSON形式
BlockとInlineという概念があり、Block単位でオブジェクトが管理される。
{
"time": 1550476186479,
"blocks": [
{
"type": "header",
"data": {
"text": "Editor.js",
"level": 2
}
},
{
"type": "paragraph",
"data": {
"text": "Hey. Meet the new Editor. On this page you can see it in action — try to edit this text. Source code of the page contains the example of connection and configuration."
}
},
{
"type": "header",
"data": {
"text": "Key features",
"level": 3
}
},
{
"type": "list",
"data": {
"style": "unordered",
"items": [
"It is a block-styled editor",
"It returns clean data output in JSON",
"Designed to be extendable and pluggable with a simple API"
]
}
}
],
"version": "2.8.1"
}太字やハイパーリンク,文字の色・背景色はInlineで定義され、HTMLタグで表現される。
{
"type" : "list",
"data" : {
"style" : "unordered",
"items" : [
"Hey. <b>Meet</b> the new Editor. On this page you can see it in action — try to edit this text."
]
}
}対応形式
公式で用意されているスタイルは以下の通りです。自作したスタイルを設定することも可能。
Block
- Header(h1, h2, ...)
- Image
- List
- Link
- Code
- Quote
- Delimiter
- Table
- Raw HTML
Inline
- Bold
- Italic
- Link
- InlineCode
- Maker
利点
- 選択文字列の色・背景色を変える機能が用意されている
- ショートカットが定義可能
Blockから他のBlockへの変換ができる(h1->h2, text->List, etc...)
Blockの入れ替えが出来る
懸念点
- 閲覧者モード(Read only mode)は実装中2020/08/23時点
- 現段階で実現するのであれば、
Block,Inlineツールの閲覧者バージョンを実装する必要があると考えられる。 Blockの並び替え機能とBlockの新規追加を無効にできれば、閲覧者モードとして使えそうだが、本家のJSをオーバーライドする必要が生まれるかもしれない。私たちの結論としては、自分たちでカスタマイズするには実装コストが大きい。
- 現段階で実現するのであれば、