我尝试使用 Jest 运行一些 TypeScript 测试,但速度很慢,需要 10 秒才能运行以下测试:
import "jest"
test("good", () => {
expect(2).toBe(2)
})
test("bad", () => {
expect(2).toBe(3)
})
我也在 --watch 模式下运行它,并且当文件更改时它运行了相同的 10 秒。
我在一个大型项目中使用 TypeScript。虽然示例文件中没有导入任何模块,但 tsconfig.json 具有整个项目的路径。
如何确定 Jest 运行如此缓慢的原因,以便找出加快速度的方法?
如果我创建一个具有相同测试的 .js 文件,并删除导入行,速度会很快。这可能表明与 TypeScript 方面有关。
通过在配置中使用
isolatedModules: true
,我获得了显着的加速。
我的配置现在如下所示:
/** @type {import('@ts-jest/dist/types').InitialOptionsTsJest} */
module.exports = {
preset: "ts-jest",
testEnvironment: "node",
globals: {
"ts-jest": {
isolatedModules: true,
},
},
transform: {
"^.+\\.jsx?$": "babel-jest",
},
moduleNameMapper: {
// ...removed...
},
moduleDirectories: ["js", ".", "node_modules"],
}
设置
isolatedModules: true
也加快了我的测试速度(它似乎禁用了打字稿编译器类型检查)。
由于在
ts-jest
下定义 globals
配置已被弃用,最好使用 transform
设置它:
transform: {
'^.+\\.ts?$': ['ts-jest', { isolatedModules: true }],
},
考虑用
SWC Jest替换默认的
ts-jest
跑步者。它似乎是一个直接替代品,但速度更快。就我而言,对于一个简单的测试,执行时间从 5 秒下降到 1 毫秒。
首先安装SWC Jest:
npm i -D jest @swc/core @swc/jest
然后在你的
jest.config.js
中使用它:
module.exports = {
transform: {
"^.+\\.(t|j)sx?$": "@swc/jest",
},
};
与
isolatedModules: true
技巧不同,这实际上可以在不与 module
和 moduleResolution
混淆的情况下工作(参见 here)。