jest-diff

中文文档
30.5.2发布于 2026/09/18MITTypeScriptESM + CJS近 30 天下载 3.1亿

清晰显示差异,以便人们可以自信地审查变化.

中文使用文档
文档目录35 节
  1. 安装
  2. 使用时间 diff()
  3. 实例 diff()
  4. 边际案件 diff()
  5. 使用 diffStrings 统一
  6. DiffStrings 实例
  7. DiffStrings的性能统一
  8. 单行道的使用
  9. 单行线示例
  10. DiffLines的边缘病例 统一或diffStrings
  11. DiffLine 统一使用 2
  12. DiffLine 实例统一2
  13. DiffStringsRaw 的使用法
  14. 有清理的 diffStringsRaw 示例
  15. 未清理的 diffStringsRaw 示例
  16. DiffStringsRaw 高级导入
  17. DiffLinesRaw的使用量
  18. DiffLineRaw 实例
  19. DiffLinesRaw 边缘案例
  20. 拆分方法示例
  21. 拆分Lines0 函数示例
  22. 选项
  23. 选项对象的属性
  24. 标签选项示例
  25. 已更改行的颜色选项示例
  26. 已更改子字符串的颜色选项示例
  27. 格式化后缀空格的选项示例
  28. 无颜色选项示例
  29. 指标备选方案实例
  30. 限制常见行的选项示例
  31. 补丁标记颜色选项示例
  32. 包含更改计数的选项示例
  33. 删除注释行的选项示例
  34. 空出第一行或最后一行的选项示例
  35. 排序对象密钥的选项示例

欢呼声

清晰显示差异,以便人们可以自信地审查变化.

这个 diff 命名导出序列化 JavaScript 数值,然后返回包含比较线的字符串.

比较两个命名的出口 字符串 逐个字符 :

  • diffStringsUnified 返回字符串.
  • diffStringsRaw 返回数组 Diff 对象.

3个出口名称比较 字符串数组 按行数 :

  • diffLinesUnified 财务报告和审定财务报表 diffLinesUnified2 返回字符串.
  • diffLinesRaw 返回数组 Diff 对象.

安装

要添加此软件包作为工程的依赖, 请运行以下任一命令 :

  • npm install jest-diff
  • yarn add jest-diff

使用时间 diff()

给定 Java 脚本 数值, (中文(简体) ), diff(a, b, options?) 执行下列规定:

  1. 序列化 使用 pretty-format 软件包
  2. 比较 使用 diff-sequences 软件包
  3. 格式 使用 chalk 软件包

要使用此函数,请写出以下任一部分:

  • const {diff} = require('jest-diff'); 在共同JS模块中
  • import {diff} from 'jest-diff'; 在ECMAScript模块中

实例 diff()

const a = ['delete', 'common', 'changed from'];
const b = ['common', 'changed to', 'insert'];

const difference = diff(a, b);

回来的 字符串 包括:

  • 注释行: 描述两个带有标签的更改指标, 和一个空白行
  • 比较线:类似于GitHub上的“统一”观点,但 Expected 线路是绿色的, Received 行为红色,常见行为暗色(默认情况下,见选项)
- Expected
+ Received

  Array [
-   "delete",
    "common",
-   "changed from",
+   "changed to",
+   "insert",
  ]

边际案件 diff()

以下是返回值的边框:

  • ' Comparing two different types of values. …' 如果争论有 不同类型 根据 jest-get-type 软件包(不同类别的软件包有相同的 'object' 类型)
  • 'Compared values have no visual difference.' 如果这些论点有 优惠身份 根据 Object.is 方法或 相同的序列化 根据 pretty-format 软件包
  • null 如果这两个论点都是所谓的 非对称匹配者 在茉莉花或欢乐

使用 diffStrings 统一

鉴于 字符串, (中文(简体) ), diffStringsUnified(a, b, options?) 执行下列规定:

  1. 比较 使用 diff-sequences 软件包
  2. 清理 小(常为偶发)常见的下弦,又名相花
  3. 格式 使用 chalk 软件包

虽然这个功能主要用于 多线 字符串,可以比较任意字符串.

写以下任一:

  • const {diffStringsUnified} = require('jest-diff'); 在共同JS模块中
  • import {diffStringsUnified} from 'jest-diff'; 在ECMAScript模块中

DiffStrings 实例

const a = 'common\nchanged from';
const b = 'common\nchanged to';

const difference = diffStringsUnified(a, b);

回来的 字符串 包括:

  • 注释行: 描述两个带有标签的更改指标, 和一个空白行
  • 比较线:类似于GitHub上的“统一”观点,以及 更改子字符串 有过 反转 前景和背景颜色(即, from 有白绿相间 to 有正对正对正红,以下示例未显示)
- Expected
+ Received

  common
- changed from
+ changed to

DiffStrings的性能统一

获得好处 更改子字符串 在比较行内,逐个字符比较的计算成本(时间和空间)高于逐行比较.

如果输入字符串可以 任意长度,我们建议调用代码设定一个限制, 超过这个限制,再分弦,然后调用 diffLinesUnified 换句话说 例如,Jest如果任意一个字符串的长度大于20K字符,则会回落到逐行比较.

单行道的使用

鉴于 字符串数组, (中文(简体) ), diffLinesUnified(aLines, bLines, options?) 执行下列规定:

  1. 比较 使用 diff-sequences 软件包
  2. 格式 使用 chalk 软件包

当字符串被分割成行而不需要在行内看到已更改的子字符串时,您可能会调用此函数 .

单行线示例

const aLines = ['delete', 'common', 'changed from'];
const bLines = ['common', 'changed to', 'insert'];

const difference = diffLinesUnified(aLines, bLines);
- Expected
+ Received

- delete
  common
- changed from
+ changed to
+ insert

DiffLines的边缘病例 统一或diffStrings

以下是参数和返回值的边缘实例:

  • 两者 a 财务报告和审定财务报表 b 是空字符串:没有比较线
  • 仅限 a 是空字符串: 所有比较行都有 bColor 财务报告和审定财务报表 bIndicator (见选项)
  • 仅限 b 是空字符串: 所有比较行都有 aColor 财务报告和审定财务报表 aIndicator (见选项)
  • a 财务报告和审定财务报表 b 等同非空字符串: 所有比较线都有 commonColor 财务报告和审定财务报表 commonIndicator (见选项)

DiffLine 统一使用 2

两个 双对 数组弦, diffLinesUnified2(aLinesDisplay, bLinesDisplay, aLinesCompare, bLinesCompare, options?) 执行下列规定:

  1. 比较 一对 Compare 使用 diff-sequences 软件包
  2. 格式 组合中的对应行 Display 使用 chalk 软件包

Jest称,如果唯一的区别是缩进,则将此函数视为通行而非更改.

您可以将此函数称为大小写不敏感或Unicode等同的行比较 .

DiffLine 实例统一2

import {format} from 'pretty-format';

const a = {
  text: 'Ignore indentation in serialized object',
  time: '2019-09-19T12:34:56.000Z',
  type: 'CREATE_ITEM',
};
const b = {
  payload: {
    text: 'Ignore indentation in serialized object',
    time: '2019-09-19T12:34:56.000Z',
  },
  type: 'CREATE_ITEM',
};

const difference = diffLinesUnified2(
  // serialize with indentation to display lines
  format(a).split('\n'),
  format(b).split('\n'),
  // serialize without indentation to compare lines
  format(a, {indent: 0}).split('\n'),
  format(b, {indent: 0}).split('\n'),
);

这个 text 财务报告和审定财务报表 time 属性是常见的,因为他们唯一的区别是缩进:

- Expected
+ Received

  Object {
+   payload: Object {
      text: 'Ignore indentation in serialized object',
      time: '2019-09-19T12:34:56.000Z',
+   },
    type: 'CREATE_ITEM',
  }

前面的例子说明了为什么(至少对于缩进来说)函数返回来自 bLinesDisplay 数组而不是从 aLinesDisplay 阵列.

DiffStringsRaw 的使用法

鉴于 字符串 和布尔的选项, diffStringsRaw(a, b, cleanup) 执行下列规定:

  1. 比较 使用 diff-sequences 软件包
  2. 可选择 清理 小(常为偶发)常见的下弦,又名相花

因为 diffStringsRaw 返回差数为 数据 而不是字符串,您可以按应用程序的要求格式化它(例如,在浏览器的HTML标记上加注,而不是在控制台的逃生序列上加注).

回来的 数组 将子字符串描述为 Diff 类,该类的调用代码可以像数组拖动一样访问:

指数值 0 属于下列情况之一:

价值命名导出说明
0DIFF_EQUAL内 a 内 b
-1DIFF_DELETE内 a 但没有在 b
1DIFF_INSERT内 b 但没有在 a

指数值 1 是一个子串 a 或者说 b 或两者兼有.

有清理的 diffStringsRaw 示例

const diffs = diffStringsRaw('changed from', 'changed to', true);
idiffs[i][0]diffs[i][1]
00'changed '
1-1'from'
21'to'

未清理的 diffStringsRaw 示例

const diffs = diffStringsRaw('changed from', 'changed to', false);
idiffs[i][0]diffs[i][1]
00'changed '
1-1'fr'
21't'
30'o'
4-1'm'

DiffStringsRaw 高级导入

这是所有你可能需要的商品 diffStringsRaw 函数 :

  • const {DIFF_DELETE, DIFF_EQUAL, DIFF_INSERT, Diff, diffStringsRaw} = require('jest-diff'); 在共同JS模块中
  • import {DIFF_DELETE, DIFF_EQUAL, DIFF_INSERT, Diff, diffStringsRaw} from 'jest-diff'; 在ECMAScript模块中

写一个 格式化 函数,您可能需要命名常数(和 Diff 在 TypeScript 说明中.

如果您写入了应用程序 清理 算法,那么你可能需要调用 Diff 构造器 :

const diffCommon = new Diff(DIFF_EQUAL, 'changed ');
const diffDelete = new Diff(DIFF_DELETE, 'from');
const diffInsert = new Diff(DIFF_INSERT, 'to');

DiffLinesRaw的使用量

鉴于 字符串数组, (中文(简体) ), diffLinesRaw(aLines, bLines) 执行下列规定:

  • 比较 使用 diff-sequences 软件包

因为 diffLinesRaw 返回差数为 数据 而不是字符串,您可以根据应用程序的要求格式化它.

DiffLineRaw 实例

const aLines = ['delete', 'common', 'changed from'];
const bLines = ['common', 'changed to', 'insert'];

const diffs = diffLinesRaw(aLines, bLines);
idiffs[i][0]diffs[i][1]
0-1'delete'
10'common'
2-1'changed from'
31'changed to'
41'insert'

DiffLinesRaw 边缘案例

如果你打电话 string.split('\n') 用于空字符串 :

  • 结果 [''] 包含空字符串的数组
  • 改为 [] 空数组

根据申请,你可能会打电话 diffLinesRaw 使用任意一个阵列.

拆分方法示例

import {diffLinesRaw} from 'jest-diff';

const a = 'non-empty string';
const b = '';

const diffs = diffLinesRaw(a.split('\n'), b.split('\n'));
idiffs[i][0]diffs[i][1]
0-1'non-empty string'
11''

您可以格式化如下:

- Expected  - 1
+ Received  + 1

- non-empty string
+

拆分Lines0 函数示例

对于边缘案件的行为,如 diffLinesUnified 函数,您可以定义 splitLines0 函数,该函数给出了空字符串,返回 [] 空数组 :

export const splitLines0 = string =>
  string.length === 0 ? [] : string.split('\n');
import {diffLinesRaw} from 'jest-diff';

const a = '';
const b = 'line 1\nline 2\nline 3';

const diffs = diffLinesRaw(a.split('\n'), b.split('\n'));
idiffs[i][0]diffs[i][1]
01'line 1'
11'line 2'
21'line 3'

您可以格式化如下:

- Expected  - 0
+ Received  + 3

+ line 1
+ line 2
+ line 3

相对于 diffLinesRaw 函数 diffLinesUnified 财务报告和审定财务报表 diffLinesUnified2 函数 自动 转换由字符串计算的数组参数 split 方法,所以呼叫者这样做 没有 需要一个 splitLine0 函数.

选项

默认选项是当断言失败时的报表 expect jest 使用的软件包.

对于其他应用程序,您可以提供一个选项对象作为第三个参数:

  • diff(a, b, options)
  • diffStringsUnified(a, b, options)
  • diffLinesUnified(aLines, bLines, options)
  • diffLinesUnified2(aLinesDisplay, bLinesDisplay, aLinesCompare, bLinesCompare, options)

选项对象的属性

名称默认
aAnnotation'Expected'
aColorchalk.green
aIndicator'-'
bAnnotation'Received'
bColorchalk.red
bIndicator'+'
changeColorchalk.inverse
changeLineTrailingSpaceColorstring => string
commonColorchalk.dim
commonIndicator' '
commonLineTrailingSpaceColorstring => string
compareKeysundefined
contextLines5
emptyFirstOrLastLinePlaceholder''
expandtrue
includeChangeCountsfalse
omitAnnotationLinesfalse
patchColorchalk.yellow

关于这些选项的更多信息,见以下例子.

标签选项示例

如果应用程序是代码修改, 您可以替换标签 :

const options = {
  aAnnotation: 'Original',
  bAnnotation: 'Modified',
};
- Original
+ Modified

  common
- changed from
+ changed to

这个 jest-diff 软件包不假定两个标签的长度相等.

已更改行的颜色选项示例

为了与大多数diff工具保持一致,您可以交换颜色:

import chalk from 'chalk';

const options = {
  aColor: chalk.red,
  bColor: chalk.green,
};

已更改子字符串的颜色选项示例

虽然对已更改的子字符串来说, 前景和背景颜色的默认反向很难击败 在行内,特别是因为它突出空格,如果您想要在黄色背景颜色上加粗体字体重:

import chalk from 'chalk';

const options = {
  changeColor: chalk.bold.bgYellowBright,
};

格式化后缀空格的选项示例

因为 diff() 不在行内显示下行差异,格式化可以帮助您看到,当行因存在或缺少后行空格而出现差异时 /\s+$/ 正则表达式.

  • 如果修改行有背景颜色,则可以看到后方的空格.
  • 如果常见行带有默认暗色,则无法看到后方空格。 你可能希望黄色的背景颜色看到它们.
const options = {
  aColor: chalk.rgb(128, 0, 128).bgRgb(255, 215, 255), // magenta
  bColor: chalk.rgb(0, 95, 0).bgRgb(215, 255, 215), // green
  commonLineTrailingSpaceColor: chalk.bgYellow,
};

色彩选项的值是一个函数,它给出了字符串,返回字符串.

如果您想要用中点字符替换后端空格 :

const replaceSpacesWithMiddleDot = string => '·'.repeat(string.length);

const options = {
  changeLineTrailingSpaceColor: replaceSpacesWithMiddleDot,
  commonLineTrailingSpaceColor: replaceSpacesWithMiddleDot,
};

如果您需要颜色选项的类型脚本 :

import {DiffOptionsColor} from 'jest-diff';

无颜色选项示例

要将差异存储在文件中, 不为颜色设置逃生代码, 提供身份功能 :

const noColor = string => string;

const options = {
  aColor: noColor,
  bColor: noColor,
  changeColor: noColor,
  commonColor: noColor,
  patchColor: noColor,
};

指标备选方案实例

与《公约》保持一致 diff 命令,您可以替换指标 :

const options = {
  aIndicator: '<',
  bIndicator: '>',
};

这个 jest-diff 一揽子假设(但不执行)3个指标的长度相等.

限制常见行的选项示例

默认情况下,输出包括所有常见行.

为了强调这些变化,你可能会限制常见的“文字”行的数目:

const options = {
  contextLines: 1,
  expand: false,
};

类似补丁标记 @@ -12,7 +12,9 @@ 用于省略的普通行.

补丁标记颜色选项示例

如果您希望补丁标记的颜色与常见行相同:

import chalk from 'chalk';

const options = {
  expand: false,
  patchColor: chalk.dim,
};

包含更改计数的选项示例

在注释行右侧显示更改行数 :

const a = ['common', 'changed from'];
const b = ['common', 'changed to', 'insert'];

const options = {
  includeChangeCounts: true,
};

const difference = diff(a, b, options);
- Expected  - 1
+ Received  + 2

  Array [
    "common",
-   "changed from",
+   "changed to",
+   "insert",
  ]

删除注释行的选项示例

只显示比较线:

const a = 'common\nchanged from';
const b = 'common\nchanged to';

const options = {
  omitAnnotationLines: true,
};

const difference = diffStringsUnified(a, b, options);
  common
- changed from
+ changed to

空出第一行或最后一行的选项示例

如果 第一个 或者说 最后一个 比较线是 空,因为内容是空的,指示器是空的,所以你可能不会注意到它.

替换选项是默认值为 '' 空字符串.

因为Jest在匹配器失败时会剪切报告,所以删除了一行空的最后一行.

因此,杰斯特将下行箭头和左角作为占位符:

const options = {
  emptyFirstOrLastLinePlaceholder: '↵', // U+21B5
};

如果一个内容行是空的,那么相应的比较行会自动被修剪去除默认指标的比值空间(下面作为中间点表示):

指标未调整修剪
aIndicator'-·''-'
bIndicator'+·''+'
commonIndicator' ·'''

排序对象密钥的选项示例

当比较两个对象时,默认按字母顺序打印它们的密钥. 如果这不是密钥的原始顺序, diff 将更难被读取, 因为密钥不在其原始位置 .

使用 compareKeys 来传递一个在排序对象密钥时使用的函数.

const a = {c: 'c', b: 'b1', a: 'a'};
const b = {c: 'c', b: 'b2', a: 'a'};

const options = {
  // The keys will be in their original order
  compareKeys: () => 0,
};

const difference = diff(a, b, options);
- Expected
+ Received

  Object {
    "c": "c",
-   "b": "b1",
+   "b": "b2",
    "a": "a",
  }

视实施情况而定 compareKeys 任意排序顺序都可以使用.

const a = {c: 'c', b: 'b1', a: 'a'};
const b = {c: 'c', b: 'b2', a: 'a'};

const options = {
  // The keys will be in reverse order
  compareKeys: (a, b) => (a > b ? -1 : 1),
};

const difference = diff(a, b, options);
- Expected
+ Received

  Object {
    "a": "a",
-   "b": "b1",
+   "b": "b2",
    "c": "c",
  }

版本与发布记录

jest-diff 共发布 255 个版本,首次发布于 2016/07/02;过去 12 个月发布了 6 个版本。

版本发布日期距今
30.5.2latest2026/09/181 个月前
30.5.12026/09/012 个月前
30.5.02026/08/282 个月前
30.4.12026/05/085 个月前
30.4.02026/05/085 个月前
30.3.02026/03/107 个月前

其他发布通道:next → 30.0.0-rc.1。

关于 jest-diff 的常见问题

jest-diff 是什么?

清晰显示差异,以便人们可以自信地审查变化.

如何安装 jest-diff?

在项目目录运行 npm install jest-diff,或使用 pnpm add / yarn add / bun add。

jest-diff 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

jest-diff 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

jest-diff 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

jest-diff 可以商用吗?

jest-diff 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

jest-diff 的下载量有多少?

根据 npm 官方下载统计,jest-diff 在 2026/10/05 – 2026/11/03 这 30 天内被下载 305,354,739 次,日均约 10,178,491 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

jest-diff 还在维护吗?

最新版本 30.5.2 发布于 2026/09/18(1 个月前);至今共发布 255 个版本,其中过去 12 个月发布了 6 个;首次发布于 2016/07/02。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。