[{"data":1,"prerenderedAt":152},["ShallowReactive",2],{"markdown-doc:\u002Fguide\u002Fperformance":3},{"id":4,"title":5,"body":6,"description":140,"extension":141,"keywords":142,"locale":143,"meta":144,"navigation":145,"order":146,"path":147,"section":148,"seo":149,"stem":150,"__hash__":151},"docs\u002Fguide\u002Fperformance.zh-CN.md","增量渲染与性能",{"type":7,"value":8,"toc":131},"minimark",[9,13,17,32,35,58,61,88,91,115,118,121,128],[10,11,12],"p",{},"大多数接入无需先调整缓存。保留稳定的消息标识和配置，让组件复用未变化的内容即可。本页用于添加自定义阅读贡献，或排查长文档更新成本。",[14,15,16],"h2",{"id":16},"默认会复用哪些内容",[10,18,19,23,24,27,28,31],{},[20,21,22],"code",{},"QuireMarkdown"," 和 ",[20,25,26],{},"MdProse"," 默认缓存完整顶层块的 Vue 投影。复用须同时满足原生 Tree\n身份、源码位置、引用目的地、脚注编号\u002F导航与渲染配置不变；后置定义仍可更新旧块。\n正在增长的段落、列表或表格会重新投影，未实现表格行、单元格或嵌套块的独立缓存。\n",[20,29,30],{},":cache=\"false\""," 可关闭投影缓存作对照，不影响增量解析。",[14,33,34],{"id":34},"自定义内容需要声明什么",[10,36,37,38,41,42,45,46,49,50,53,54,57],{},"自定义阅读贡献缺省保守重投影，因为 codec、render、load 都可能读取整篇文档。\n",[20,39,40],{},"cacheKey(document)"," 可声明节点外源码和外部状态的完整依赖，返回值用 ",[20,43,44],{},"Object.is"," 比较。\n只有局部源码、attrs 与 locale 的贡献可以用 ",[20,47,48],{},"cacheKey: () => null","，如上面的 Status 示例。\n依赖某个引用目标时，应在 key 中包括解析状态和目标值；读取外部配置时应返回它的版本\n或稳定身份。不要用常量 key 隐藏实际依赖。内置引用与脚注仍自动检查。\n",[20,51,52],{},"renderNode"," 对应 ",[20,55,56],{},"renderNodeKey(state)","；未提供 key 时保守重投影全部块。\nHTML 的 allowLink\u002FallowImage 回调所在块也保持重投影，以持续观察响应式策略。",[14,59,60],{"id":60},"读取工作量与限制缓存",[10,62,63,64,67,68,71,72,75,76,79,80,83,84,87],{},"高级消费者可从 Vue 入口创建每个阅读实例独占的 ",[20,65,66],{},"MarkdownRenderer","，调用\n",[20,69,70],{},"renderer.render(state, locale, prefix, onError, options)"," 并读取 ",[20,73,74],{},"renderer.work","。\n更换文档或卸载时调用 ",[20,77,78],{},"clear()","，由 Vue 卸载负责释放资源；保持 onError 函数身份稳定。\n",[20,81,82],{},"renderMarkdown(...)"," 始终执行完整投影。默认缓存最多 2048 块、累计 2,000,000 个\nUTF-16 源码单元，可通过构造参数 ",[20,85,86],{},"maxBlocks\u002FmaxSourceUnits"," 限制保留量；超额继续投影。\n这些计数和预算不等于 JS 堆字节、解析耗时或浏览器绘制时间。",[14,89,90],{"id":90},"其他接入方式",[10,92,93,94,99,100,104,105,107,108,114],{},"本包不兼容早期 Incremark 的 API，算法差异见",[95,96,98],"a",{"href":97},"\u002Fguide\u002Fcomparison","与 Incremark 比较","；\nremark\u002Frehype 插件和 MDC 模板也需要独立适配。React 使用",[95,101,103],{"href":102},"\u002Fguide\u002Freact","独立适配包","共用解析与缓存规则；任意 HTML 模板执行与内容集合\u002F路由不属于阅读入口。编辑器产品的 ",[20,106,26],{}," 共用本包阅读实现，\n并继续提供它自己的图形节点与旧 API，见",[95,109,113],{"href":110,"rel":111},"https:\u002F\u002Fmsfe.quirekit.com\u002Fguide\u002Fmd-editor",[112],"nofollow","MD Editor","。",[14,116,117],{"id":117},"怎样复现性能对照",[10,119,120],{},"在生产构建中使用相同文档、20 个 UTF-16 单元 \u002F 30ms 的追加序列，分别运行 cache=true\u002Ffalse；每种配置先预热，再重复测量。\n两边都必须核对最终正文、链接目的地、脚注数量与回链，额外检查每个中间前缀和停止后的原文。",[10,122,123,124,127],{},"分别统计解析、VNode 投影、Vue 提交和强制布局。不要把回放总时长当作解析耗时，也不要把强制布局等同于浏览器绘制。\n大型列表、表格或单段落仍可能是一个重投影块；顶层块遍历和全局引用检查仍存在，不能承诺每次追加恒定耗时。\n",[20,125,126],{},"MarkdownRenderer.work"," 只统计最近一轮投影工作；本站 Playground 不显示未经隔离的“引擎速度排名”。",[10,129,130],{},"旧工作树的测量不能代表当前发布版本。正式比较需同时记录源码版本、文档哈希、浏览器、硬件、预热与重复次数，并与正确性检查一起保存。",{"title":132,"searchDepth":133,"depth":133,"links":134},"",2,[135,136,137,138,139],{"id":16,"depth":133,"text":16},{"id":34,"depth":133,"text":34},{"id":60,"depth":133,"text":60},{"id":90,"depth":133,"text":90},{"id":117,"depth":133,"text":117},"了解默认缓存、声明自定义依赖，以及如何测量实际更新成本。","md",null,"zh-CN",{},true,8,"\u002Fguide\u002Fperformance","参考",{"title":5,"description":140},"guide\u002Fperformance.zh-CN","HpLSSpOxFMMSq-wa9LJdsNkXB8tozEQS2lXlwpq3Dv4",1793045321581]