Incremark Solid 版本上线: Vue/React/Svelte/Solid 四大框架,统一体验

1 月 11 日
 1244943563

Incremark 现已支持 Solid ,至此完成了对 Vue 、React 、Svelte 、Solid 四大主流前端框架的全面覆盖。

为什么要做框架无关

市面上大多数 Markdown 渲染库都是针对特定框架开发的。React 生态有 react-markdown ,Vue 生态有各种 v-md 组件。这带来几个问题:

  1. 重复造轮子:每个框架社区都在独立实现相似的功能
  2. 能力不一致:不同框架的实现质量参差不齐
  3. 团队切换成本:换框架意味着重新学习新的 API

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 许可证。

2904 次点击
所在节点    程序员
24 条回复
dassh
1 月 17 日
next.js 16

import "@incremark/theme/styles.css";
会导致


Build Error



Parsing CSS source code failed
./node_modules/.pnpm/@incremark+theme@0.3.7/node_modules/@incremark/theme/dist/styles.css (837:20)

Parsing CSS source code failed
835 | overflow-x: auto;
836 | }
> 837 | .mermaid-svg :deep(svg) {
| ^
838 | max-width: 100%;
839 | height: auto;
840 | }

'deep' is not recognized as a valid pseudo-class. Did you mean '::deep' (pseudo-element) or is this a typo?

Import trace:
Client Component Browser:
./node_modules/.pnpm/@incremark+theme@0.3.7/node_modules/@incremark/theme/dist/styles.css [Client Component Browser]
./components/ui/streaming-markdown.tsx [Client Component Browser]
./components/script-guide/storyboard.tsx [Client Component Browser]
./components/script-guide/index.tsx [Client Component Browser]
./app/t/[storyId]/page.tsx [Client Component Browser]
./app/t/[storyId]/page.tsx [Server Component]
1244943563
1 月 20 日
@dassh 已修复,特别抱歉,没及时看到
xiaoz
6 月 27 日
感谢,已经用上了。
xiaoz
6 月 27 日
我遇到 2 个问题:
1. 全国英文+数字组合的情况下,内容溢出边框
2. 表格在手机上被强制压缩换行,建议改为横线滚动条滑动展示表格

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.ih06.com/t/1184558

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX