懒加载渲染 (Lazy Render)
BaseMarkdownEditor 支持懒加载渲染模式,通过 IntersectionObserver API 实现按需渲染,显著提升大型文档的渲染性能。
何时使用
- 文档内容很长,包含大量元素
- 需要优化首屏加载性能
- 文档包含大量图片、表格等复杂元素
- 移动端或性能较低的设备
工作原理
启用懒加载后,每个编辑器元素都会被 LazyElement 组件包裹。该组件使用 IntersectionObserver 监听元素是否进入视口:
- 初始状态:元素显示为占位符,不渲染实际内容
- 进入视口:当元素即将进入视口时(可配置提前量),开始渲染实际内容
- 保持渲染:元素一旦被渲染,会保持渲染状态,不会卸载
基本使用
配置选项
通过 lazy 对象可以自定义懒加载行为:
配置说明
自定义占位符渲染
通过 renderPlaceholder 函数,你可以完全自定义懒加载时的占位符显示内容:
renderPlaceholder 参数说明
占位符样式示例
性能优化建议
1. 调整 rootMargin
rootMargin 控制提前加载的距离。较大的值可以让内容提前加载,避免用户看到占位符:
2. 设置合适的占位符高度
placeholderHeight 应该接近实际元素的高度,以减少布局抖动:
3. 只读模式下使用
懒加载特别适合只读模式的长文档:
4. 动态加载长文档内容
对于需要动态设置内容的场景,可以使用 setMDContent 方法配合 options 参数来优化长文档的加载性能:
setMDContent Options 配置说明
使用建议:
- 超长文档(10000+ 字符):启用
useRAF和适当的batchSize,避免主线程阻塞 - 实时进度显示:使用
onProgress回调显示加载进度条,进度值从 0 到 1- 边解析边插入,实时显示内容,提升用户体验
- 合理的分块:根据文档结构调整
separator(如\n\n按段落,\n#按标题) - 配合懒加载:
setMDContent的优化针对解析和插入两个阶段,配合lazy渲染可获得最佳性能
性能优化原理:
当 useRAF=true 且分块数量 > 10 时,setMDContent 会使用 RAF 边解析边插入:
- 单阶段处理:每帧解析
batchSize/10个 markdown chunks 并立即插入到编辑器 - 实时显示:内容逐步显示,用户可以看到加载过程,提升体验
- 非阻塞:使用 RAF 避免长时间阻塞主线程,保持页面响应
这样可以避免大文档解析时卡住主线程,同时提供更好的用户体验。
注意事项
- 表格元素:表格的单元格和行不会被懒加载包裹,以保持表格结构的完整性
- 编辑模式:懒加载在编辑模式下可能会影响编辑体验,建议主要在只读模式下使用
- 首屏内容:调整
rootMargin以确保首屏内容能够立即加载 - 布局抖动:设置合适的
placeholderHeight可以减少滚动时的布局跳动
加载可靠性优化
为了解决偶发加载不出来的问题,LazyElement 组件实现了双重保障机制:
- IntersectionObserver 监听:主要的加载触发机制,实时监听元素进入视口
- 后备检查机制:100ms 后自动检查元素是否在视口内,确保不会遗漏
常见场景处理:
- ✅ 初始加载时元素已在视口内:后备检查会立即触发加载
- ✅ 快速滚动:IntersectionObserver 会及时捕获
- ✅ 动态内容加载:两种机制互为补充,确保可靠性
调试建议:
如果发现元素未加载,可以检查:
方案 1:增加 rootMargin 提前加载距离
方案 2:使用自定义占位符来观察加载状态
性能对比
懒加载渲染性能
在包含 1000+ 段落的长文档测试中:
setMDContent 优化性能
在处理 50000000+ 字符的超长文档时:
最佳实践:结合懒加载渲染和 setMDContent 优化,可获得最佳的性能体验。
API
MarkdownEditorProps
EditorStore.setMDContent
动态设置编辑器内容的方法,支持性能优化配置:
使用示例:
