有大佬曾经说过:
Any application that can be written in JavaScript, will eventually be written in JavaScript.
-- Jeff Atwood
Markdown 已经是一个非常普及的标记语言了,JavaScript 的解析和渲染可以让它在前端界发挥更大的作用。
比如用 Markdown 写博客,通过 JavaScript 实现在线预览,也就是我现在正在做的事情。
JavaScript 实现的解析器还有一个其他语言无法比拟的优势,就是通过 Node.js 可以实现前后端用同一份代码来解析,可以确保得到的结果是完全一样的。
通过对 Markdown 语法的扩展,我们还可以做更多的事情,比如用 Markdown 快速搭建一个页面,甚至通过特定语法快速实现一些复杂的交互,快速嵌入一个复杂组件,等等。
目前比较流行的 Markdown 解析库有(按照 Star 数从多到少排列):
我分别使用了一下,并稍微扒了一下他们的实现,下面我将从几个方面来比较一下他们的优劣。
设计思想:
Marked 的代码实现就一个字,烂。
这应该是一个古老的项目,感觉并没有什么设计思想,所有的代码都在一个文件中,毫无组件化、模块化,满屏都是正则表达式。这个项目如果出现bug,我是不会想去排查的。
Marked 的整个解析过程都在一个大函数里,基本无法扩展。当然,他暴露了解析的方法,我们可以自己实现一个替换它,不过那样的话,我还要这个库干啥?
解析原理:
前面已经说过了,满屏都是正则表达式。没错,Marked 就是通过正则匹配来解析 Markdown 的。讲道理,用正则来解析语法实在是不太可靠,但好在 Markdown 是用来写文档的,通常不会出现太多复杂的 edge case,所以从结果来看也能接受(中文支持不错)。
正则解析的好处:
性能:
虽然这个库的代码可读性不怎么样,但是换一个角度来看,这又未必是一件坏事。首先,代码基于 ES5,无需编译,没有组件化、模块化,减少了一些提高可读性带来的额外开销,而且各种奇技淫巧的使用,对性能的提升肯定是有帮助的。从 benchmark 来看,Marked 的速度确实是遥遥领先的。
总结:扩展性差、正则解析(中文支持好)、性能好。
总结:扩展性好、正则解析(中文支持好)、性能较差。
总结:扩展性好、逐字符解析(中文支持不好)、性能较好。
参考:
https://www.jianshu.com/p/549cace91e22
原文:https://www.cnblogs.com/makalochen/p/14464519.html