markstream-vue 0.0.4-beta.1 → 0.0.4-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -104,6 +104,38 @@ enableMermaid()
104
104
  enableKatex()
105
105
  ```
106
106
 
107
+ If you load KaTeX via CDN and want KaTeX rendering in a Web Worker (no bundler / optional peer not installed), inject a CDN-backed worker:
108
+
109
+ ```ts
110
+ import { createKaTeXWorkerFromCDN, setKaTeXWorker } from 'markstream-vue'
111
+
112
+ const { worker } = createKaTeXWorkerFromCDN({
113
+ mode: 'classic',
114
+ // UMD builds used by importScripts() inside the worker
115
+ katexUrl: 'https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/katex.min.js',
116
+ mhchemUrl: 'https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/contrib/mhchem.min.js',
117
+ })
118
+
119
+ if (worker)
120
+ setKaTeXWorker(worker)
121
+ ```
122
+
123
+ If you load Mermaid via CDN and want off-main-thread parsing (used by progressive Mermaid rendering), inject a Mermaid parser worker:
124
+
125
+ ```ts
126
+ import { createMermaidWorkerFromCDN, setMermaidWorker } from 'markstream-vue'
127
+
128
+ const { worker } = createMermaidWorkerFromCDN({
129
+ // Mermaid CDN builds are commonly ESM; module worker is recommended.
130
+ mode: 'module',
131
+ workerOptions: { type: 'module' },
132
+ mermaidUrl: 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs',
133
+ })
134
+
135
+ if (worker)
136
+ setMermaidWorker(worker)
137
+ ```
138
+
107
139
  ### Nuxt quick drop-in
108
140
 
109
141
  ```ts
@@ -210,6 +242,8 @@ function addChunk(chunk: string) {
210
242
 
211
243
  This avoids re-parsing SSR content while letting later SSE/WebSocket chunks continue the stream.
212
244
 
245
+ > Tip: when you know the stream has ended (the message is complete), use `parseMarkdownToStructure(buffer.value, md, { final: true })` or pass `:final="true"` to the component. This disables mid-state (`loading`) parsing so trailing delimiters (like `$$` or an unclosed code fence) won’t get stuck showing perpetual loading.
246
+
213
247
  ## ⚙️ Performance presets
214
248
 
215
249
  - **Virtual window (default)** – keep `max-live-nodes` at its default `320` to enable virtualization. Nodes render immediately and the renderer keeps a sliding window of elements mounted so long docs remain responsive without showing skeleton placeholders.
@@ -226,6 +260,7 @@ Pick one mode per surface: virtualization for best scrollback and steady memory
226
260
  - `batchRendering`: fine-tune batches with `initialRenderBatchSize`, `renderBatchSize`, `renderBatchDelay`, `renderBatchBudgetMs`.
227
261
  - `enableMermaid` / `enableKatex` / `enableMonaco`: opt-in heavy deps when needed.
228
262
  - `parse-options`: reuse parser hooks (e.g., `preTransformTokens`, `requireClosingStrong`) on the component.
263
+ - `final`: marks end-of-stream; disables mid-state loading parsing and forces unfinished constructs to settle.
229
264
  - `custom-html-tags`: extend streaming HTML allowlist for custom tags and emit them as custom nodes for `setCustomComponents` (e.g., `['thinking']`).
230
265
  - `custom-components`: register inline Vue components for custom tags/markers.
231
266
 
@@ -274,7 +309,8 @@ Parse hooks example (match server + client):
274
309
 
275
310
  ## ❓ FAQ (quick answers)
276
311
 
277
- - Mermaid/KaTeX not rendering? Install the peer (`mermaid` / `katex`) and pass `:enable-mermaid="true"` / `:enable-katex="true"` or call the loader setters.
312
+ - Mermaid/KaTeX not rendering? Install the peer (`mermaid` / `katex`) and pass `:enable-mermaid="true"` / `:enable-katex="true"` or call the loader setters. If you load them via CDN script tags, the library will also pick up `window.mermaid` / `window.katex`.
313
+ - CDN + KaTeX worker: if you don't bundle `katex` but still want off-main-thread rendering, create and inject a worker that loads KaTeX via CDN (UMD) using `createKaTeXWorkerFromCDN()` + `setKaTeXWorker()`.
278
314
  - Bundle size: peers are optional and not bundled; import only `markstream-vue/index.css` once. Use Shiki (`MarkdownCodeBlockNode`) when Monaco is too heavy.
279
315
  - Custom UI: register components via `setCustomComponents` (global) or `custom-components` prop, then emit markers/placeholders in Markdown and map them to Vue components.
280
316
 
package/README.zh-CN.md CHANGED
@@ -103,6 +103,38 @@ enableMermaid()
103
103
  enableKatex()
104
104
  ```
105
105
 
106
+ 如果你是用 CDN 引入 KaTeX,并且希望公式在 Web Worker 中渲染(不打包 / 不安装可选 peer),可以注入一个“CDN 加载 KaTeX”的 worker:
107
+
108
+ ```ts
109
+ import { createKaTeXWorkerFromCDN, setKaTeXWorker } from 'markstream-vue'
110
+
111
+ const { worker } = createKaTeXWorkerFromCDN({
112
+ mode: 'classic',
113
+ // worker 内通过 importScripts() 加载的 UMD 构建
114
+ katexUrl: 'https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/katex.min.js',
115
+ mhchemUrl: 'https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/contrib/mhchem.min.js',
116
+ })
117
+
118
+ if (worker)
119
+ setKaTeXWorker(worker)
120
+ ```
121
+
122
+ 如果你是用 CDN 引入 Mermaid,并且希望 Mermaid 的解析在 worker 中进行(用于渐进式 Mermaid 渲染的后台解析),可以注入 Mermaid parser worker:
123
+
124
+ ```ts
125
+ import { createMermaidWorkerFromCDN, setMermaidWorker } from 'markstream-vue'
126
+
127
+ const { worker } = createMermaidWorkerFromCDN({
128
+ // Mermaid CDN 构建通常是 ESM,推荐 module worker。
129
+ mode: 'module',
130
+ workerOptions: { type: 'module' },
131
+ mermaidUrl: 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs',
132
+ })
133
+
134
+ if (worker)
135
+ setMermaidWorker(worker)
136
+ ```
137
+
106
138
  ### Nuxt 快速接入
107
139
 
108
140
  ```ts
@@ -209,6 +241,8 @@ function addChunk(chunk: string) {
209
241
 
210
242
  这样无需重新解析 SSR 内容,同时还能通过 SSE/WebSocket 持续追加后续片段。
211
243
 
244
+ > 提示:当你明确知道流已结束(消息已完整)时,建议用 `parseMarkdownToStructure(buffer.value, md, { final: true })` 或在组件上设置 `:final="true"`,以关闭解析器的中间态(loading)策略,避免末尾残留分隔符(如 `$$`、未闭合 code fence)导致永久 loading。
245
+
212
246
  ## ⚙️ 性能模式
213
247
 
214
248
  - **默认虚拟化窗口**:保持 `max-live-nodes` 默认值(`320`),渲染器会立即渲染当前窗口的节点,同时只保留有限数量的 DOM 节点,实现平滑滚动与可控内存,占位骨架极少。
@@ -225,6 +259,7 @@ function addChunk(chunk: string) {
225
259
  - `batchRendering`:用 `initialRenderBatchSize`、`renderBatchSize`、`renderBatchDelay`、`renderBatchBudgetMs` 微调批次。
226
260
  - `enableMermaid` / `enableKatex` / `enableMonaco`:按需启用重型依赖。
227
261
  - `parse-options`:在组件上复用解析钩子(如 `preTransformTokens`、`requireClosingStrong`)。
262
+ - `final`:标记“最终态/流结束”,关闭中间态 loading 解析并强制收敛未闭合结构。
228
263
  - `custom-html-tags`:扩展流式 HTML 白名单并将这些标签输出为自定义节点,便于 `setCustomComponents` 直接映射(如 `['thinking']`)。
229
264
  - `custom-components`:为自定义标签/标记注册内嵌 Vue 组件。
230
265
 
@@ -273,7 +308,8 @@ setCustomComponents({
273
308
 
274
309
  ## ❓ 快问快答
275
310
 
276
- - Mermaid / KaTeX 不显示?安装对应 peer(`mermaid` / `katex`),并传入 `:enable-mermaid="true"` / `:enable-katex="true"` 或调用 loader 设置函数。
311
+ - Mermaid / KaTeX 不显示?安装对应 peer(`mermaid` / `katex`),并传入 `:enable-mermaid="true"` / `:enable-katex="true"` 或调用 loader 设置函数。如果你是用 CDN `<script>` 引入,库也会自动读取 `window.mermaid` / `window.katex`。
312
+ - CDN + KaTeX worker:如果你不打包 `katex` 但仍希望公式在 worker 中渲染(不占主线程),可以用 `createKaTeXWorkerFromCDN()` 创建一个“CDN 加载 KaTeX”的 worker,然后通过 `setKaTeXWorker()` 注入。
277
313
  - 体积问题:可选 peer 不会被打包,CSS 只需导入一次;对代码块可用 Shiki(`MarkdownCodeBlockNode`)替代 Monaco 以减轻体积。
278
314
  - 自定义 UI:通过 `setCustomComponents`(全局)或 `custom-components` prop 注册组件,在 Markdown 中放置占位标记并映射到 Vue 组件。
279
315