ProseMirror学习
ProseMirror
- prosemirror-model
- prosemirror-state
- prosemirror-view
- prosemirror-transform
Schema
Schema 描述的是:这篇文档允许出现哪些结构——能有哪些节点(Node)、哪些标记(Mark),以及它们之间如何嵌套、谁里能装谁
创建 Schema 大致是
1 | new Schema({ |
nodes:名字 → NodeSpec 的映射。其中必须有一个 根节点(通常叫 doc),且 Schema 会把它当作 schema.topNode(整篇文档的根类型)。
- content:
- group:inline、block、tile分组(其概念与 html 节点的 inline 节点与 block 节点一致)
- marks:
marks:名字 → MarkSpec 的映射(加粗、链接等)。
编译后会得到 schema.nodes / schema.marks:从名字查到 NodeType / MarkType(带上了已解析的 content 规则、默认属性等)。
prosemirror 不允许有空文本节点,我们看到在 p 标签中, 文本内容为空时,会填入一个 br 标签。
1 | import { Schema } from 'prosemirror-model'; |
从现象看,prosemirror 会寻找到我们第一个定义的 block 元素来初始化默认的 state。因此,在定义 schema 的时候,需要注意两点:
Schema 中必要的节点要定义
节点的定义顺序可能会影响编辑器初始内容,如果遇到类似问题,可以排查 schema 中 node 的定义顺序
schema中的工具方法
- schema.cached 中绑定的 domParser 可以将 dom 节点解析为 node 节点
- domSerializer 可以将 node 内容序列化为 dom 节点。
Node
对于 Node 的类型,只有两种,即 block 与 inline
- NodeSpec 就是之前在 Schema 中填写的 Node 相关的描述
- NodeType 是 Schema 实例化过程中,根据传入的 nodeSpec 规格说明书创建的 NodeType 实例,可以认为是 node 数据的工厂,后续所有的 node 类型都需要遵循它的定义,它也能像帮我们创造出一个 node 数据
- 最后生成的 Node 实例则是文档中对应到 dom 的一个具体数据

inline 元素与 block 元素不能混合,即 content 里面要么只能是 inline 类型的,要么只能是 block 类型的,不能混合排列,如 paragraph|text* 就会报错。