Skip to content

大文件 ​

VMark 能秒开绝大多数 Markdown 文件,但是非常大的文件需要额外处理才能保持响应流畅。本页介绍 VMark 是如何处理这类文件的,以及你如何调整这一行为。

什么算"大文件" ​

VMark 在打开文件之前会先按文件大小分级,对 Markdown 还会同时参考估算的块数:

大小或块数分级行为
< 1 MB 且估算少于 1,200 块小立即以 WYSIWYG(富文本)模式打开。
1 MB – 5 MB,或估算 1,200 块以上大默认以 源码模式 打开 —— 亚秒级响应。状态栏会提供"切换到 WYSIWYG"。
5 MB – 50 MB巨大先弹出确认对话框。仅以源码模式打开。
≥ 50 MB拒绝VMark 拒绝打开。请改用 less、bat 或类似工具。

文件大小通过操作系统获取,无需读取文件内容。对于小于 1 MB 的 Markdown 文件,VMark 随后会逐行扫描文件字节来估算块数 —— 这不是 Markdown 解析 —— 因此判断依然很快,也绝不会把文档载入 WebView。

为什么大文件用源码模式 ​

源码模式使用 CodeMirror 配合视口虚拟化 —— 只渲染文档中可见的部分。WYSIWYG 模式使用 Tiptap/ProseMirror,必须为文档中的每一个块构建一个 DOM 节点。在一份 1.4 MB / 约 2,250 块的 Markdown 文件上,首次打开大约要 15 秒;源码模式打开同一份文件则不到一秒。

决定视图构建成本的是块的多少,而不是文件大小。三份大小几乎相同(377–397 KB)、只是字节被切分成块的密度不同的测试文档,在 601、1,201、3,401 块时分别用 3.6、5.2、18 秒打开。一份由 3,773 个短块组成的 524 KB 文档在那台机器上耗时超过 30 秒 —— 低于 1 MB 的字节阈值,却远远超过了窗口停止响应的临界点。正因如此,块数估算本身就能把文件导向源码模式。

大部分时间花在构建视图和排版上,而不是解析。在一台慢速机器上实测一篇较长的中日韩文档,解析占编辑器打开开销的四分之一到五分之二。

打开文档的过程中 ​

VMark 会先让窗口能够响应菜单、快捷键和关闭按钮,再构建文档的富文本视图,文档随后出现。过去会先构建长文档,在慢速机器上这可能让窗口迟迟无法就绪:菜单响应迟缓,日志中显示 menu commands did not mount within 5000ms。

WYSIWYG 在打开时所做的工作也与文档规模相称:

  • 图片在接近可见区域时才加载。
  • 中日韩字符间距(设置 → 编辑器 → 排版)在关闭时(默认)不做任何工作,开启时只扫描文档一次。
  • 代码高亮、中日韩间距、lint 标记等装饰的开销与文档长度大致成线性关系。过去超长文档的开销是平方级的。

状态栏提示 ​

  • 以 WYSIWYG 打开大文件时: 状态栏左侧会出现一个不确定进度的转圈,标签为 "正在打开大文件(N MB)…",直到编辑器挂载完成、可交互为止才消失。
  • 文件被自动以源码模式打开时: 状态栏会显示 "以源码模式打开(大文件)。",并附上一个 切换到 WYSIWYG 链接。点击该链接会把当前标签页翻到 WYSIWYG。关闭并重新打开该文件后,会回到源码模式 —— 该覆盖只在当前会话内生效。
  • WYSIWYG 无法显示的文档: 引用块或列表嵌套超过 1000 层的文档,无论文件大小,都无法解析为富文本。它会以源码模式打开,并弹出提示说明嵌套深度;状态栏显示 "已以源码模式打开(无法在 WYSIWYG 模式下显示)。"。减少嵌套层级后,再点击 切换到 WYSIWYG。

设置 ​

打开 设置 → 编辑器 → 大文件:

  • 将大文件自动以源码模式打开 (默认开启) —— 覆盖超过 1 MB 的文件以及块密度高的 Markdown。关闭后,VMark 会让 5 MB 以下的文件都以 WYSIWYG 打开,代价是更长的打开时间。
  • 打开超过 5 MB 的文件前先警告 (默认开启) —— 关闭后,5 MB 至 50 MB 之间的文件会跳过确认对话框,但仍以源码模式打开。

50 MB 的硬性拒绝阈值不可调。Webview 无法在不冒内存溢出风险的前提下安全地容纳任意大小的字符串。

小贴士 ​

  • 如果你确实必须在 WYSIWYG 中持续编辑非常大的文件,考虑把它拆成更小的多份文件,通过一份索引文档相互链接。Markdown 当作一组小章节使用效果很好。
  • 如果你只是想阅读或搜索一份大文件,源码模式配合行号槽和 查找(Mod + F)通常是最快的工作流。
  • 在源码模式的文档上,格式 → 中日韩文字 → 格式化整个文件 等针对全文的命令仍然能正确运行。

边界情况 ​

  • 文件在打开后变大。 VMark 是按打开时刻的大小决定分级的。一份你在编辑过程中长到 2 MB 的文件,会保持你最初选择的模式。
  • 符号链接。 大小反映的是目标文件,因此一个指向 10 MB 文件的符号链接会被当作"巨大"对待。
  • 空文件。 零字节文件被算作"小",并以 WYSIWYG 打开。
  • 文件在体积检查与读取之间消失。 此时会触发常规的"找不到文件"错误 —— 不会有额外警告。

已知限制 ​

  • 块数只是估算,不是解析:以空行分隔的正文、标题、列表项、表格行,以及每个围栏代码块都算一个块;围栏内的代码和 frontmatter 行不计入。结构特殊的文档可能会在 WYSIWYG 本来足够快时被导向源码模式;切换到 WYSIWYG 只需一次点击。非 Markdown 文件从不按块数分级。
  • 所见即所得模式在打开时仍会构建文档的每一个块 —— 只有图片和行内公式会等到接近可见区域时才加载或渲染 —— 因此把大文件切换到所见即所得时,需要付出上文所述的完整打开时间。