跳到正文
DevTools / 文本对比

文本对比

对比两个版本的文件本来是件平常事,直到改动很小而文件很大,此时只有字符级的视图才能回答问题。本对比工具完全在浏览器内运行,支持行、词、字符三种粒度,既能输出统一的 patch 也能并排显示,会把改动定位到行内具体的一段而不是把整行标红,还能忽略大小写与空白,以免格式化差异淹没真正的修改。

完全在浏览器本地运行——不会上传任何内容。

原始文本
对比文本

工作原理

底层算法先计算两个输入的最长公共子序列,再据此推导最短编辑脚本——也就是把一个文本变成另一个所需的最少插入与删除集合。先按行粒度运行是输出可读的关键:一段被重新折行的文字会产生一行改动,而不是两百处字符改动。每处改动被归类为相同、新增、删除或替换,各类计数会被汇总,让你在细读之前先看到改动规模。

行内高亮是第二遍处理。当某行被判定为“替换”时,会把该行的旧版本与新版本再按词粒度做一次对比,并在行内强调差异片段。没有这一步,一个长行里改了一个字符就会把整行标记为改动,什么信息也没提供;有了它,改动立刻可见。这也是配置文件改动可被评审的原因:某一行只改了一个端口号时,只有两个数字被高亮,其余部分不变。

粒度是真实的选择而非外观问题。行粒度适合源码和配置,因为那里的行结构承载语义;词粒度适合被重新折行的散文,那里的换行是噪声;字符粒度用于一个字节也至关重要的场景——哈希、密钥、编码后的数据块——也是唯一能让长 token 中一处字符变化变得可见的设置。切换粒度会重新执行对比,不需要重新输入。

忽略大小写与空白是在对比之前做的规范化,而不是之后。两个文本先被规范化,再做差异计算,这正是让格式化后的文件显示为“无改动”而真实修改依然清晰的原因。代价是高亮输出显示的是规范化后的文本,因此若某处改动仅仅是大小写变化,看起来会像没有改动。当你检查的恰恰就是空白或大小写时,请关闭这些选项。

常见应用场景

  • 对比两个版本的配置文件,找出环境之间的差异。
  • 检查两份接口响应是否不同,若不同则定位到具体位置。
  • 确认格式化或转译工具没有在语义上改动文件。
  • 逐字符对比两个长 token 或密钥,找出其中的拼写错误。
  • 复核手工编辑过的数值列表,确认只有预期的条目被改动。
  • 生成统一 diff,粘贴进代码评审或缺陷报告。

最后更新: 2026-10-14

常见问题解答

我的文本会被上传到服务器吗?

不会。对比完全在浏览器内的 JavaScript 中执行,两份输入的任何部分都不会被传输,运行期间打开浏览器网络面板即可确认。这一点尤其重要,因为需要做文本对比的内容往往恰恰不该外发:私钥、许可证文件、环境配置以及客户数据导出。

行、词、字符应该选哪个?

源码、配置和日志用行粒度,那里的语义单位就是行。散文用词粒度,尤其是被重新折行过的段落,因为那里的换行只是编辑器的产物而非内容。token、哈希、密钥以及任何“一个字节就是全部差异”的短字符串用字符粒度。如果对比结果噪声大得无法阅读,原因通常是粒度选错了,而不是数据本身。

最大能处理多大的文件?

每侧几百 KB 的文本可以轻松处理。最坏情况下对比复杂度是平方级的——病态输入是两个毫无共同之处的长文本——但真实输入总有共享结构,运行会快得多。MB 级文件建议使用命令行 diff,二进制文件则应直接比较哈希,因为对二进制数据做文本对比没有意义。

为什么只是重新格式化的文件会显示大量改动?

因为缩进和行尾空白都是真实字符,逐行对比会看到它们。有两个选项可以解决:开启“忽略空白”会把连续空格与制表符视为等价;改用词粒度则完全绕开行结构。如果目标是评审一个同时被重新格式化过的文件里的语义改动,请先用格式化工具把两侧都处理一遍再对比。

相关工具