In the previous article, we introduced the basic concepts of rich text and its development history. In this article, we will explore the currently mainstream open-source rich text editor engines. The most widely used rich text editor currently is the L1
rich text editor, which can meet the needs of the vast majority of use cases. As a result, many excellent open-source rich text engines have been born. These include standalone engine editors such as Slate.js
, partially out-of-the-box functional editors like Quill.js
, and secondary development based on these engines such as Plate.js
. This article mainly introduces three editing engines: Slate.js
, Quill.js
, and Draft.js
.
Slate
is a rich text core
that only provides an engine. Simply put, it does not provide various rich text editing functions by itself, and all rich text features need to be implemented through its provided API
. Even its plugin mechanism needs to be expanded by oneself, so using Slate
to build a rich text editor can be highly customizable. Although the documentation for Slate
is not particularly detailed, its examples are very rich. The documentation also provides a tutorial as a starting point, which is quite friendly for beginners. Speaking of which, if only an engine is provided, no one knows how to use it, haha.
In the Slate
documentation, there are descriptions of the design principles of the framework:
Slate
is that plugins are first-class citizen entities, which means you can completely customize the editing experience to build complex editors like Medium
or Dropbox
without struggling with the default settings of the library.schema
core. The core logic of Slate
imposes very few presets on the structure of your edited data. This means that when you build complex use cases, you will not be hindered by any pre-existing content.Slate
documents is a nested, recursive tree, just like DOM
. This means that for advanced use cases, it is possible to build complex components such as tables or nested references. Of course, you can also use a single-level structure to keep it simple.DOM
, Slate
's data model is based on DOM
. The document is a nested tree, using text selections and ranges, and exposes all standard event handling functions. This means that advanced features such as tables or nested references that can be done in DOM
can also be done in Slate
.Slate
documents execute commands to edit. It is designed to be advanced and very intuitive for editing and reading, so that customized features are as expressive as possible, greatly improving your understanding of the code.Slate
, especially how operations are applied to the document, is designed to allow collaborative editing at the highest level, so if you decide to implement collaborative editing, you don't have to consider a complete refactor.The data structure of a text sample looks like this:
JSON
structure similar to DOM
, making it intuitive and easy to understand.Beta
stage, there may be major API
changes. For example, version 0.50
was completely refactored.OT
or CRDT
algorithms for transformation operations.Slate
does not have a schema
, which means that Normalize
needs to be implemented independently.slate
can be found at https://docs.slatejs.org/
.slate
official website at https://www.slatejs.org/examples/richtext
.slate
can be accessed at https://github.com/WindrunnerMax/DocEditor
.slate
at https://plate.udecode.io/docs/playground
.OT
with slate
, visit https://github.com/solidoc/slate-ot
.https://github.com/pubuzhixing8/ottype-slate
for OTTypes
reference for slate
.CRDT
for slate
at https://github.com/humandx/slate-automerge
.slate
with YJS
collaboration, refer to https://github.com/BitPhinix/slate-yjs
.slate
can be found at https://github.com/yoyoyohamapi/book-slate-editor-design
.Quill
is a modern rich text editor with excellent compatibility and powerful extensibility, offering some out-of-the-box features. It was open-sourced in 2012
and brought many new features to the rich text editor, making it one of the most popular open-source editors with a rich ecosystem. You can find numerous examples, including comprehensive collaborative instances, on platforms like GitHub
.
The design principles of the framework are described in the documentation:
Quill's
features are implemented through the API and data changes can be intuitively obtained through the API. It is built on a text-centric API, eliminating the need to parse HTML
or DIFF DOM
trees, making its functionality more flexible and highly extensible.Quill
provides its document model as a powerful abstraction of the DOM, allowing for expansion and customization, with data structures such as Blots
, Parchment
, and Delta
taking center stage.Quill
has excellent compatibility and can run in the same way on older browser versions, ensuring consistent views and interactions across different browsers, as well as desktop and mobile devices.Quill
comes with some out-of-the-box features that are sufficient if customization is not required. Additionally, it offers high extensibility for customizing various functions.The data structure for a piece of text is as follows:
Vue
or React
.Delta
to describe data structures, implementing logic for operation transformation and facilitating collaboration.Delta
data structure is flat, making it cumbersome to implement features like tables.Quill 2.0
has been in development for a long time and has not been formally released yet. The current version, 1.3.7
, has not been updated for many years.Quill
comes with a rich set of features, this also results in a larger package size.Quill
can be found at https://quilljs.com/docs/quickstart/
.Quill
official website at https://quilljs.com/standalone/full/
.Delta
design and implementation in Quill
, refer to https://quilljs.com/docs/delta/
.OTTypes
reference for collaborative implementation with Quill
at https://github.com/ottypes/rich-text
.OT
with Quill
can be found at https://github.com/share/sharedb/tree/master/examples/rich-text
.CRDT-yjs
for Quill
, refer to https://github.com/yjs/y-quill
.Draft
is a framework for building rich text editors in React
, providing a powerful API for creating and customizing text editors. It aims to be easy to extend and integrate with other libraries. Combining it with React
allows developers to develop editors without directly manipulating the DOM or learning a separate UI building paradigm. Instead, they can directly write React
components to implement the editor's UI. The overall concept of draft
aligns very well with React
. For example, it uses state management to store data structures, leverages the immutable.js
library, delegates most data structure modifications to the browser's default behavior, and modifies rich text data through state management.
The README
of draft
describes the framework's design principles:
Scalable and customizable, providing building blocks to create various rich text editing experiences, from basic text styles to support for embedded media.
Declarative rich text, seamlessly integrating with React
using a declarative API
familiar to React
users, abstracting the details of rendering, selection, and input behavior.
Immutable editor state. The draft
model is built using immutable.js
, providing an API for functional state updates and actively utilizing data persistence to achieve scalable memory usage.
The data structure of a piece of text with emphasis is as follows.
React
for the UI layer and data management, making it user-friendly for React
users.React
as the UI layer, making it difficult to use with other UI frameworks.draft
has been heavily optimized for performance, it still exhibits lag when rendering a large amount of content.draft
documentation: https://draftjs.org/docs/overview
.draft
examples: https://draftjs.org/
.draft
codesandbox
example: https://codesandbox.io/s/github/gupta-piyush19/Draft-JS-Editor
.