细谈 MarkMax 和 markdown-it 的异同

本贴最后更新于 1097 天前,其中的信息可能已经渤澥桑田

最近有点纠结,到底 MarkMax 自定义插件呢?还是 100% 支持 markdown-it 的插件?MarkMax 现在是实验性支持了 markdown-it 的部分插件,因为 MarkMax 的渲染器参数与 markdown-it 有差别,并且 MarkMax 的渲染机制与 markdown-it 同样有差别,所以对于 markdown-it 插件的支持程度需要进行源码级评估。需要注意的是,markdown-it 的插件不会支持 MarkMax 的运行时设计,这也意味着无法支持 MarkMax 的运行时性能优化和新的特性。

我深入思考之后觉得 markdown-it 的插件具有参考意义,但不意味着 MarkMax 将会 100% 支持其插件,所以开始着手设计工程级的 MarkMax 插件开发。因为 markdown-it 插件是存在设计缺陷的,具体表现在无法解决 rules 键存在冲突的问题,例如:默认类型为 text 的节点,我有多个插件修改同一个 text 的规则,就会导致渲染函数冲突,这对于任何一个插件设计机制来说都是有挑战性的。

当然,那些框架把决定权踢给了用户,比如 docsify。docsify 插件对我来说就是尤其失败的设计,我给社区开源了好几个 docsify 插件,这些插件通过 cdn 统计至少有数万的网站正在使用。也因为 docsify 失败的插件设计,导致了用户踢 issues 我还得去解释和进行适配,非常的恼火。

所以 MarkMax 插件设计除了借鉴了我自己对于 Vditor 的插件设计之外,将会针对 markdown-it 原理进行定制设计。先谈 MarkMax 究竟是如何支持 markdown-it 插件的吧,说起来其实非常简单,通过包装器进行实现的。因为 markdown-it 对于 markdown 文件 parse 之后的结果,一般都是 HTML 标签或其组成部分,所以 MarkMax 将这些渲染函数通过 MarkdownItWrapper 包装转化为 VNode,然后交给 MarkMax 的“清洗工”进行处理。理论上来说,此机制同样可以实现对于 Vditor Plugin 的支持,但是 MarkMax 已经计划移除其中所有的代码了。

MarkMax 的 Washer 其实是个非常有意思的设计,这个不光会“洗掉”不必要的节点生成,还把 markdown-it 的队列转化为了 VNode 树结构,实现详情可以参考源码,我是通过栈这一数据结构进行实现数据结构转化的。MarkMax 渲染器与 markdown-it 最大的差别在于 markdown-it 的输出是字符串,而 MarkMax 的输出是虚拟节点。MarkMax 虽然是参考 markdown-it 渲染器的重写,但因针对 VNode 映射 DOM 节点原理的不同,这也导致了有些方法的实现是有差异的。

到目前为止,说 MarkMax 是对于 markdown-it 的套壳毫不为过,但是对于新的插件设计机制和利用 vdom 而提供新的特性则与 markdown-it 差异会越来越大。MarkMax 是综合了我这么多年来对于 markdown 解析器、markdown 编辑器、markdown 渲染器、Vditor 插件和运行时设计、markdown-it、lute、marked.js 二次开发等等经验的产物,可能直到目前它的设计并不完美,但是一定会是更有特色的。

MarkMax 将会持续发挥 vdom 的特点。在首次渲染上,其渲染性能达不到基于字符串模板的方案,性能会稍微差一些(但是总体差距并不大)。但 MarkMax 将会提供 diff 的特性,降低 DOM 节点大量修改带来的性能损耗,针对于可能会引入编辑器的场景,MarkMax 将会采取更小粒度的节点修改。除此之外,MarkMax 会去实现版本比较的特性。普通的撤销和编辑虽然可以做到每一处修改历史记录的操作,但并不会主动去做到对于文字多次修改的历史版本保存。这个意义差距还是蛮大的,并且有望实现渲染器进行类似于 diff 的版本可视化修改比较。

MarkMax 是基于 markdown-it 和 million 的产物,在富文本编辑这块大概会引入 wangEditor 作为富文本编辑器进行定制开发。正如 MarkMax 在简介里所说的,MarkMax 是在 Web 端的一个新的 markdown 解决方案。市面上的 markdown 方案千千万万,此项目只是为了满足我设想高性能 markdown 方案实现的个人主义产物。

如果你对此项目感兴趣,可以提出参考意见或者参与开发,路过也欢迎给个 Star~

项目地址:https://github.com/HerbertHe/markmax

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • CheGuevara

    又来开新坑了吗trollface

    1 回复
  • 其他回帖
  • HerbertHe

    不算是吧。。。因为我觉得 Vditor 的工程实在是太大了,而且敏捷度不够,有些东西是很难实现的。

    MarkMax 通过 millionjs 提供了 VDOM 的特性,几乎实现了原生性能下的 markdown 渲染。体积远小于 Lute,重写了 markdown-it 的 renderer(这就导致了不支持 markdown-it 所有的插件)。不过还是蛮简单兼容了大部分 markdown-it 的插件,也可以兼容之前对于 Vditor 的插件设计,而且也提供了生命周期之类的特性 emmmm 当然也去解决 markdown-it 可能存在的 rules 冲突的问题,我感觉 docsify 等等的插件设计都存在这个问题

    设计之初还是为了解决渲染的问题,后来给 million 的反馈比较多,成了 collaborator。后来我发现玩法还可以更多,因为可以直接生成 VNode Tree,MarkMax 又可以拥有 million 所有的特性,包括兼容 Vite、使用 million/react 等等,非常的有趣。

    我有蛮多想法的,但是在准备研究生考试,所以未来一年都不打算更新代码了。PR Welcome~

HerbertHe
主营前端, 热衷于造轮子 ~ 现为西部计划服务新疆专项志愿者~ Nuco.Tech Studio 联合创始人 乌鲁木齐

推荐标签 标签

  • 996
    13 引用 • 200 回帖 • 3 关注
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 515 关注
  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    117 引用 • 99 回帖 • 199 关注
  • 正则表达式

    正则表达式(Regular Expression)使用单个字符串来描述、匹配一系列遵循某个句法规则的字符串。

    31 引用 • 94 回帖 • 1 关注
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 56 关注
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    77 引用 • 37 回帖
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖 • 6 关注
  • SOHO

    为成为自由职业者在家办公而努力吧!

    7 引用 • 55 回帖
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    554 引用 • 675 回帖
  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖 • 4 关注
  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖
  • 服务

    提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。

    41 引用 • 24 回帖
  • Bootstrap

    Bootstrap 是 Twitter 推出的一个用于前端开发的开源工具包。它由 Twitter 的设计师 Mark Otto 和 Jacob Thornton 合作开发,是一个 CSS / HTML 框架。

    18 引用 • 33 回帖 • 646 关注
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖 • 1 关注
  • 招聘

    哪里都缺人,哪里都不缺人。

    188 引用 • 1057 回帖
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    229 引用 • 1432 回帖 • 1 关注
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 415 关注
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    336 引用 • 324 回帖
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 596 关注
  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    59 引用 • 25 回帖 • 2 关注
  • 自由行
    1 关注
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    19 引用 • 23 回帖 • 738 关注
  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    23 引用 • 32 回帖
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 676 关注
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 116 关注