再见 Typora!这款 Markdown 神器绝了!

文章开始之前,先跟大家预告一下今天晚上(10月23日)八点的直播内容,直播大纲如下,不仅干货超级多,还有很多奖品,大家可以预约一下,晚上八点准时来收听!

c825ad85608d05c18d79e6781de38201.png






对于创作平台来说内容编辑器是十分重要的功能,强大的编辑器可以让创作者专注于创作“笔”下生花。

而最好取悦程序员创作者的方法之一就是支持 Markdown 写作,因为大多数程序员都是用 Markdown 来写文章。 06e2281a83a340e238a4a1bf65930c79.png

Markdown 作为程序员写作的心头爱,有很多优点:

  • 通过语法实现排版,不需要点选手动设置样式

  • 快速实现复杂内容,如:代码块、超链接、公式等

  • 让创作者有更多时间专注于内容

但,同样的也有些缺点:

  • 有一定的学习门槛,对于非程序员不太友好

  • 看原文档就像看“代码”,预览效果需要工具或编辑器支持

那有没有能够即保留 Markdown 带来的便利,同时又降低门槛的办法呢?大多数老玩家会脱口而出:Typora

4ca2106adffbef0d14cd251d1774b958.gif

Typora 直接使用完全没有问题,但由于它没有开源。如果想在自己的项目实现类似的 Markdown 编辑器,就需要另寻方案了。

如果你正在寻找功能强大、易于接入、所见即所得的 Markdown 编辑器、组件、插件,就请花 5 分钟读完本文!

接下来 HelloGitHub 带来的开源项目完全满足上述需求。Milkdown 一款高颜值+自由(插件)的所见即所得,集合 Markdown 编辑器、组件、插件于一身的开源项目。

6c72e424a94f70c6df5bdf282330d324.png

https://github.com/Saul-Mirone/milkdown

你想要的功能它都有,不要的功能也可以通过删减插件,减少体积。插件的设计思想+完善的中文文档,让你分分钟定制出最适合自己的 Markdown 编辑器!

d6422190fdc67ddba9533bead04f333d.png

下面跟着项目作者一起来感受 Milkdown 的魅力吧。

一、上手

下面提供了 2 种方式,可直接体验:

60e6e6a8306597b64059e12c88735f58.png

在线尝试:https://milkdown.dev/#/online-demo

VS Code 插件:https://marketplace.visualstudio.com/items?itemName=mirone.milkdown

1.1 功能展示

方便的编写表格:

3618fcf95c792deb878aa87e9dc15dcf.png

直接粘贴和复制 Markdown 文本:

8b6f3d6745650f10231c620ceb649c76.gif

甚至协同编辑:

5d8e13cd943aaf8f5b0d200f61c5b307.gif

双栏 Markdown 编辑器很常见。但 双向绑定 的 Markdown 编辑器,目前仅此一家:

5205125dad8caf5c9f27b50d2128d93b.gif

功能方面就介绍这么多,下面用 Milkdown 轻松实现个编辑器。

1.2 第一个编辑器

Milkdown 的核心以及各种插件都是独立的 NPM 包,可以直接通过 NPM 来进行安装。

npm i @milkdown/core @milkdown/preset-commonmark @milkdown/theme-nord

上手也十分简单:

import { Editor } from '@milkdown/core';
import { nord } from '@milkdown/theme-nord';
import { commonmark } from '@milkdown/preset-commonmark';

Editor
  .make()
  .use(nord)
  .use(commonmark)
  .create();

我们先使用 make 来初始化编辑器,然后使用 use 来加载插件,最后使用 create 来创建编辑器。

b992361ecfce51f0ff501937079cbd87.gif

1.3 丰富的插件

插件是 Milkdown 的核心,它本质上就是一个插件加载器,一切功能都是通过插件来提供的。表格是一个插件、主题是一个插件、甚至一行简单的文本也是一个插件。

目前官方已经提供了许多插件,确保可以开箱即用。下面仅列举了部分插件:

名称描述
plugin-clipboard添加 markdown 格式的复制粘贴能力
plugin-cursor添加 drop 和 gap 光标
plugin-listener添加监听器支持
plugin-collaborative添加协同编辑支持
plugin-table添加表格语法支持(已经包含在 gfm 中)
plugin-prism添加 prism 用于支持代码块高亮

二、技术栈

Milkdown 基于下面的工具实现:

  • Prosemirror:一个用于在 web 端构建富文本编辑器的工具包

  • Remark:正确的 Markdown 解析器

  • TypeScript:以 TypeScript 编写

  • Emotion:用于构建样式的强大的 css in js 工具

  • Prism:代码块支持

  • Katex:高性能的渲染数学公式

富文本编辑器本身是一个天坑。虽然 ContentEditable 看起来很美好,但实际用起来就会发现问题层出不穷。因此我们基于 Prosemirror 来实现富文本编辑器。因为它足够成熟、久经工业的锤炼,并且拥有良好的架构和 API 设计。

三、架构

Prosemirror 的核心逻辑其实类似于 React,它通过一种函数式的数据映射来体现编辑器的 UI 和内部状态的关系,如图:

39265a82b1152dc89c262887e58e57f0.png

编辑器通过 EditorState 来保存当前状态,并由 EditorState 产生出 EditorView,即 UI 视图。 用户在 UI 视图上进行的操作最终会产生 DOM event,例如:input 事件、click 事件。DOM event 事件会产生 Transaction,代表了对 State 的修改,类似于 Redux 或 Vuex 中的 Action。 这些 Transaction 会与原来的 EditorState 进行计算,产生新的 EditorState,如此循环。

Prosemirror 通过这样的方式将编辑器中的每个状态以 EditorState 的方式保存了下来,它是一颗树状结构。而有一点编译原理基础的朋友都知道,任何编程语言都有对应的 AST(抽象语法树)。因此我们需要的就是建立 Prosemirror 中的 EditorState 与 Markdown 的抽象语法树之间的联系。 Remark 完美契合我们的需求,因为它有设计良好的 AST,并且易于扩展自己的语法。

这样一来 Milkdown 的架构也逐渐清晰:

Markdown <-> Remark AST <-> Prosemirror State <-> UI

四、结语

在开始这个项目前,我尝试过各种各样的 Markdown 编辑器,但没有找到一款特别满意的。因为它们都是闭源,而且功能由开发商提供,有的功能太过于臃肿、有的又太过简单。 既然这样,我索性自己做一款能够轻松定制功能,非程序员也能轻松使用的 Markdown 编辑器,也就有了大家看到的 Milkdown。

希望开源的 Milkdown 让用户有更自由的选择,打破 Markdown 编辑器的“垄断”。开源不易如果 Milkdown 对您有帮助,也请给个 Star✨。

https://github.com/Saul-Mirone/milkdown

d7a5fc569f45c814ed6e26a28ae67b15.png

你好,我是厂长谭庆波,就读于哈工大,计算机系博士生,曾经的学渣,现在的学霸,拿过各路编程大奖 。

求学20载,从农村到C9博士,上学期间通过副业收入超 100 万,点击蓝字查看我的成长之路

同时,我也是知乎博主:谭庆波,日常分享高质量程序员认知,学习资料、技术干货等,欢迎围观。


最后说一件重要的事,我最近建了一个【晋级的程序员】社群,旨在帮助新手小白快速上手找到编程的乐趣,里面沉淀了大量编程相关经验教程以及学习资料,目前社群人数已经超过1000人,欢迎大家加入:

4e65b0e8fc5588b8ba93634d0a5aa766.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值