TypeScript项目接入Jest测试时无法找到fs/promises模块如何解决
根因分析
你遇到的报错是Node 12版本特性和Jest模块解析逻辑共同导致的:
- Node 12只有12.10及以后的小版本才支持
import fs/promises这种直接子模块导入的写法,更低的12.x版本只能通过require('fs').promises调用promise化的fs接口 - Jest的模块解析器没有做这层兼容,当你导入
fs/promises时,会直接去文件系统找对应路径的模块,找不到就直接抛出错误,还不会执行你写的mock逻辑 - 业务代码本身运行正常,说明你的生产运行环境要么是更高版本的Node,要么是打包工具做了兼容处理,仅Jest测试环境未做适配。
解决方法
方法一:配置Jest模块名映射(无侵入业务代码,推荐)
不需要修改现有业务代码,仅调整Jest配置即可解决问题:
- 在你的
jest.config.js中新增moduleNameMapper配置项:
module.exports = { preset: 'ts-jest', testEnvironment: 'node', testPathIgnorePatterns: [ '/node_modules/', '/out/', ], moduleDirectories: [ '.', 'node_modules' ], moduleFileExtensions: [ 'ts', 'tsx', 'js', 'jsx' ], // 新增以下配置 moduleNameMapper: { '^fs/promises$': '<rootDir>/src/utils/fs-promises-compat.ts' } }
- 新建
src/utils/fs-promises-compat.ts兼容文件,内容如下:
import fs from 'fs' export default fs.promises
后续Jest会自动把所有fs/promises的导入重定向到该兼容文件,不影响业务逻辑的正常执行。
方法二:升级Node版本(一劳永逸)
Node 14及以上版本已经稳定支持fs/promises的直接导入,将你的Node版本升级到14.x或更高,删除上面的模块映射配置即可原生支持该写法。
方法三:修改业务代码导入写法
如果不想调整Jest配置,可以把所有业务代码里的import fsp from 'fs/promises'统一替换为兼容写法:
import fs from 'fs' const fsp = fs.promises
该写法在所有Node 12小版本、更高版本Node以及Jest环境下都可以正常运行。
内容的提问来源于stack exchange,提问作者John James
相关产品推荐
相关产品推荐

