基于JavaScript的差异比较工具

76

我正在寻找一种用JavaScript编写的diff等效函数,它只返回/打印相关行。我不想看到完整文本并将差异标亮显示在一起,而是只想要实际差异(加上一些缓冲行以知道差异位置),类似于Linux diff实用程序的输出。

有人知道是否有这样的JavaScript函数吗?所有差异都应该被识别(甚至更改了空格)。谢谢。


2
没事的,你对自己太苛刻了。顺便说一下,这是个好问题,如果没有它,我不会这么容易地找到答案。 - MrBoJangles
1
如果@austincheney提出的差异大约快了4.5倍是真实的话,而我没有理由认为它不是,那么我建议您考虑将他的答案标记为已接受。还有更重要的一点(在我看来),就是突出显示每行字符差异的特征! - MrBoJangles
1
John Resig的jdiff是其中最简单和最有效的解决方案。只需要一个JavaScript文件,以及一行JavaScript代码即可实现:http://ejohn.org/projects/javascript-diff-algorithm/#postcomment - Fuzzy Analysis
1
我可能做错了什么,但实际上我目前正在使用John Resig的东西,它的问题在于它解码任何不同的内容。例如,如果标签更改,它看起来就会很混乱。 - MrBoJangles
10个回答

36

我完全重新构建了jsdifflib实用工具以提升速度。由于我的版本不需要访问DOM,因此至少快4.5倍,并且还扩展到每行字符差异的突出显示。

http://prettydiff.com/diffview.js

您可以直接在http://prettydiff.com/在线工具中测试这个工具。


2
跟进一下:我已经把这个神器(prettydiff)加入我的小型 Web 应用中,我很喜欢它。非常喜欢。 - MrBoJangles
1
@austincheney,你做得很好,但缺乏文档使你的项目难以理解。与原始网站http://cemerick.github.io/jsdifflib/demo.html相比,这简直就是地狱(请查看页面源代码)。 - Alexander Selishchev
1
如果我将 hellohel world 进行比较,它会忽略 rld - user4639281
2
嘿,你能告诉我如何在JS中使用prettydiff吗?我只需要包含prettydiff.js文件吗? - Dhara
4
好的。这件事情相当糟糕,我不知道为什么它会有那么多赞。无论怎样我都得不到任何类型的对象作为返回值。它坚持返回HTML格式,其中包括一个必须的标语广告,宣传该库本身。 - Ryan Shillington
显示剩余5条评论

34

jsdifflib 的内联模式比较,尝试调整上下文大小以仅显示您想要的更改窗口。这里有一个演示


1
上下文大小是我没有注意到的重要事情,谢谢 :) - poke
4
jsdifflib 很不错,但它不能逐字逐句地显示差异。它只展示出不同的行。 - max
2
jsdiff 是标准且活跃的 Node.js 文本差异库。 - Gagan

32

2
这使得它更易于消费,特别是在具有webpack等现代Web浏览器中:https://www.npmjs.com/package/diff-match-patch - Ryan Shillington
1
尝试了几个不同的diff库数小时后,这个确实是比较直接文本的最佳选择。需要注意的是它并不真正适用于XML/HTML。 - Ryan Shillington

8
  • Mergely 是一个值得推荐的工具,基于 CodeMirror 构建,全客户端实现。
  • 还有一个 CodeMirror 演示,需要在服务器端进行差异计算。
  • 其他答案中提到的 jsdifflibprettydiff 也是不错的选择。

2
CodeMirror现在不再需要任何服务器端的差异计算。 - Udo Klimaschewski
2
好的,那么他们也可以删除 http://codemirror.net/demo/merge.html 上仍然存在的“此插件依赖于 google-diff-match-patch 库来计算差异。”的注释。 - Daniel F
3
仍需要外部JS“https://cdnjs.cloudflare.com/ajax/libs/diff_match_patch/20121119/diff_match_patch.js”,但不再需要服务器端代码。 - Udo Klimaschewski

6

1
在较大的数据集上,它很好,但速度非常慢。 - Ulterior

5
请查看wikEd diff JavaScript库。 还有一个在线工具可用。

wikEd diff功能是内联文本比较,带有块移动突出显示和基于字符/单词的解决方案。 它针对维基百科源代码进行了优化,但也适用于任何类型的文本或代码。 该库代码完全可定制,支持Unicode,有详细注释,并在公共领域中。


4

我对Linux或IT技术不是很了解,但这可能是你在寻找的jsdifflib工具。你可以在那里找到一个实时示例,看看它是否适合你。


4

7
这个插件依赖于google-diff-match-patch库来计算差异。 - poke
1
这个演示一开始看起来相当令人印象深刻。我可能得去了解一下这个家伙。 - MrBoJangles

3

这是一个老问题,但如果你在进行Node工作或想要与requirejs/commonjs模块兼容的东西,我推荐使用https://www.npmjs.com/package/diff

console.log(diff.createPatch('some file name.txt', expected, actual));

2
对于未来的读者,这个 diff 库在比较大量文本时性能非常差。 - Brandon
1
返回翻译的文本:对于快照测试等少量几百K的数据,使用“true”非常好。总体上,大量差异检测相当缓慢,之前编写过使用字节流的代码来逐步加载大文件进行差异检测,但那不是一个现成的通用差异检测库! :) - aqm

2

jsdifflib 看起来很有前途 - 试试从那个页面链接的演示。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接