You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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配置即可解决问题:

  1. 在你的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'
  }
}
  1. 新建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 06:39:02