
Incremark 现已支持 Solid ,至此完成了对 Vue 、React 、Svelte 、Solid 四大主流前端框架的全面覆盖。
市面上大多数 Markdown 渲染库都是针对特定框架开发的。React 生态有 react-markdown ,Vue 生态有各种 v-md 组件。这带来几个问题:
Incremark 采用不同的思路:核心逻辑与 UI 框架完全解耦。
@incremark/core 负责所有解析、转换、增量更新的工作,输出的是框架无关的数据结构。各框架包(@incremark/vue、@incremark/react、@incremark/svelte、@incremark/solid)只需要把这些数据渲染成对应框架的组件即可。
这意味着:
┌───────────────────────────────┐ │ @incremark/core │ │ │ │ 增量解析 双引擎 插件系统 │ └───────────────┬───────────────┘ │ ┌───────────────────────────────┐ │ @incremark/vue │ │ @incremark/react │ │ @incremark/svelte │ │ @incremark/solid ← NEW │ └───────────────┬───────────────┘ │ ┌───────────────────────────────┐ │ @incremark/theme │ │ │ │ 样式 主题 代码高亮 │ └───────────────────────────────┘ 传统 Markdown 渲染器在流式场景下存在性能问题:每次新内容到达都要重新解析整个文档,复杂度是 O(n)。
Incremark 只处理新增内容,已解析的块不再重复处理,复杂度降至 O(n)。
四个框架的组件 API 完全一致,只是语法风格不同:
Vue
<script setup> import { IncremarkContent } from '@incremark/vue' // ... </script> <template> <IncremarkContent :cOntent="content" :is-finished="isFinished" /> </template> React
import { IncremarkContent } from '@incremark/react' // ... <IncremarkContent cOntent={content} isFinished={isFinished} /> Svelte
<script> import { IncremarkContent } from '@incremark/svelte' // ... </script> <IncremarkContent cOntent={content} isFinished={isFinished} /> Solid
import { IncremarkContent } from '@incremark/solid' // ... <IncremarkContent cOntent={content()} isFinished={isFinished()} /> 可以看到,除了各框架本身的响应式语法差异( Vue 的 ref、React 的 useState、Svelte 的 $state、Solid 的 createSignal),组件的使用方式完全统一。
MIT 许可证。
1 beginor 2 天前 via Android 现在 Angular 都不算前段框架了么, 连 solid 和 svelte 都不如? |
2 1244943563 OP @beginor svelte 确实很火,solid 我觉得不怎么样很小众,angular 我没想好要不要适配后面有人反馈再做吧 |
3 subframe75361 2 天前 挺不错的,已 star |
| img src="https://cdn.v2ex.com/avatar/3160/2be7/57703_normal.png?m=1694079140" class="avatar" border="0" align="default" alt="jsq2627" data-uid="57703" /> | 4 jsq2627 2 天前 github 链接错了吧。是不是 AI 润色搞坏的 :doge: |
5 1244943563 OP @jsq2627 我滴乖乖,是给我搞坏了,https://github.com/kingshuaishuai/incremark |
6 1244943563 OP 感谢支持 |
7 1244943563 OP @jsq2627 感谢支持 |
8 TossPig 1 天前 我也要 Angular |
9 1244943563 OP |
10 codehz 1 天前 这个增量解析好像并不一定能提升性能。。也许是对比的文档比较短? 我这边测试最高 1.4x,最低 0.9x 4.6ms vs 4.9ms 这样 |
11 1244943563 OP @codehz 目前是解析层测性能提升,benchmark 脚本已公开,clone 仓库,按文档,将你要测试的 markdown 文件全都丢进 test-data 中,短文档 increamrk 不占优势,长文档优势巨大 原因:incremark 默认使用极速模式,也就是使用 marked 作为引擎,streamdown 与 x-markdown 也都是 marked 作为引擎,incremark 每次只解析一个块,其他的每次都全量解析,单纯从相同的 marked 角度出发,你认为 o(n) 快还是 o(n) 快。increamrk 短内容下,因为各种边界检测 + 内置的一些插件,会比默认 marked 慢的,这个文档中有描述。 测试方法文档: http://incremark.com/zh/advanced/benchmark.html |
12 orluna 1 天前 实用! |
13 nzbin 1 天前 暂时用不到,但也希望支持 Angular |
14 beginor 17 小时 47 分钟前 via Android |
15 pursuer 4 小时 3 分钟前 这么一看 preact 更小众了 |