玩转Markdown——数据的分离存储与组件的原生渲染
前言
最近笔者把之前写的文章( markdown )数据,全部同步到数据库里,来交给多端去实时渲染。在同步的过程中,却出现了一些问题。
笔者这里举个例子,让大家有所感受:
而且通过这个思路,还演化出 MDX 这个格式,大大的增强了 JSX 与 Markdown 混合书写时的开发体验,增强了它的表现能力。
怎么做到的呢?
我们知道,原生 Markdown 功能很少,不会做任何花哨的事情,这导致它无法满足大量的场景。于是乎,大量的开发人员充分发挥了 主观能动性 ,定制了许多的 Markdown 编译器。
以著名的 Typora 为例,它就集成了 flowchart.js , mermaid 这类的图表库。我们可以在 md 里快速的生成一些简单的图表,但是遇到复杂的 case 时,可操控性还是远远弱于代码的。(这种情况,通常会在编辑器外部,先把图表做好,再把导出,插入 md 里)
甚至还出现了 nodeppt 这样,使用 markdown 来制作 ppt 的包。笔者曾经使用过一段时间,认为使用的场景,还是以部门内部的分享为主。受限于许多难记的语法和 md 自身的表现力,在遇到高自定义化的场景时,制作成本会远远超出 powerpoint 。
markdown 数据的分离存储
那么进入正题了,如何对 markdown 内不同的数据进行归类呢?
我们知道,不进行预处理的话,直接存进数据库里,无非就是一堆字符串。这堆字符串里藏着的数据,去实时处理,就是对计算机算力的浪费。
许多的 markdown 解析器,也都能够支持像 yaml , json , toml , csv 等数据格式,此时预先把它们存进数据库就很有必要了。
怎么解析呢? 通常的做法就2字, 标记 ,在编写时,把它们用特殊的 flag 标识起来,比较通用的做法有:
--- {{code}} --- => yaml
---toml {{code}} --- => toml
---json {{code}} --- => json
这种做法本质上,和代码染色类似:
```js(染色语言) {{code}} ```
于是在标记出来之后,我们就可以非常容易的,对这堆字符串,进行 截取解析 再 分发给不同的解析引擎处理 了。现有的实现也很多,比如 gray-matter 。
但是这只解决了数据分离的问题,还有一个组件渲染的问题没有解决。
组件的原生渲染
在谈这个之前,先看看 md 是如何转成 html 的:
以 markded , markdown-it , unified(remark) 为例
它们无非是 把 md 先解析成 tokens/mdast , 例如:
然后再交给 html 的 renderer 去处理的,上述的例子可以很容易的看出它的结果。
那么非转化成 html ,而去转化为原生标签怎么做呢?解决方案也有很多。
先说一下我实现的方案:
即 这一段字符串原封不动的存入数据库中,
然后在其他平台的场景,都去编写或者移植一个 Markdown 解析器,接着呢
这种做法本质就是 条件渲染 ,相当于一个 if 分支。
这个解决方案需要在不同的平台上,把 icebreaker-love-music 这个组件都实现一遍,并作为插件挂载在 Markdown 解析器中。
它的缺点也是很明显的:
另一种的畅想
另外一种则是我的畅想了,我们能否把组件本身,进行编译,变成一种 IL (Intermediate Language)的存在,交给各个端,进行原生渲染呢?
比如我们知道, web component 浏览器端原生支持
vue 组件可以被 @vue/web-component-wrapper 转化为 web-component
react 则有 react-web-component
那么 web-component 有可能,能依托一个像 QuickJS 这样的 Javascript Engine ,在原生环境进行实时的编译渲染吗?
以上这些就是笔者的一些愚见,如有想法,欢迎大家讨论和指点。
附录(ast的生成与转化)
syntax-tree
mdast-util-from-markdown
mdast-util-to-hast
MD歌曲伴奏
让?这绝不可能,自本田首先在北美市场建立阿库拉品牌以来,日系另外两大车厂也紧随其后,战火从本土烧到了国外,从中端烧到了高端。但对于中国市场,本田与日产似乎没有丰田动作快,相对于雷克萨斯车型,国内的讴歌与英菲尼迪算是后来者,但这些都不重要,重要的是你有什么样的产品,因为从目前来看,中国市场还有很大的容量,只要是有个性的,必然得到国人的认同。讴歌MDX与英菲尼迪FX35,这个对中国大多数老百姓来说不是很熟知的品牌,但是在国内爱车一族中早有口碑,两者都是极具个性的代表,随着两个厂家在中国的销售渠道的铺开,认知的人会越来越多。
油价一直上涨,但豪华SUV市场业绩不降反升,为什么?原因很简单,中国的富有阶级总有“逆反”心理,油越贵越要SUV,这样才能显示出与众不同的“气质”,我们尚且不论这样的行为是否得当,但市场就是这样运行。而PCauto编辑部纯粹从车的角度出发,对这两款日系豪华SUV做对比测试,解决存在大家心中已久的疑问……
关于品牌名称,笔者认为还是尊崇国内应有的口味为佳,当然本田的“讴歌”早在进入中国之前“阿库拉”就已经被人抢注,取名“讴歌”是不得以而为之。但关于英菲尼迪,笔者认为早前的用户还是习惯用于“无限”,毕竟通过原来的非正规渠道,已经建立起十分良好的口碑,取名英菲迪尼后需要再用很多的精力再做品牌宣传。其实,将这样名称传承下去有什么不好呢?正如奔驰与宝马一般,是不是它们进入国内后也要采取直接音译方式?事实没有,奔驰还是奔驰,宝马还是宝马。当然,事已至此,下面要做的就是做好品牌宣传,因为我们坚信,车绝对没有问题,它们都代表了各自的最高水平。
相视对望 战火一触即发
讴歌MDX是一款在北美完成设计、开发和生产的讴歌主力车型。MDX的名称来源于“Multi Dimension X”,寓意“高度融合多元要素,具有无限可能性的SUV”。第一代MDX于2000年推出后,在北美市场引起了巨大的轰动。作为一款三排七人座的SUV车型,讴歌MDX将操控性与舒适性完美结合,开创了SUV车型的新理念。
买一张MD空白碟,把MP3上的歌曲传到电脑上,在电脑上装上MD的驱动碟上的软件,用md机提供的软件将电脑上的歌曲导入到曲目集上然后将曲目集上的歌曲导入到MD机上。如果机子有光纤输入口还可以用光纤输入,将光纤与CD随身听或音响等有光纤输出的设备连接,按下或拨动录音键然后播放音源。(MD机分单放和录放的两种,如果是单放的就没有办法了,或找一个可录放的机子录完再在你的机子上放)机子如果是机子是hi-md 买盘的时候要买hi-md碟(1G容量) 也兼容MD碟。
鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com
图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!