使用 PNPM 的情况下,Jest 解决 ESM 依赖库的报错问题
环境
从 karma 转移到 Jest 遇到了如下报错
主要原因是 “node_modules” 文件夹中 ESM(ECMAScript Modules) 库不被 Jest 支持。
鉴于 Jest ESM 支持还在几乎不可用的试验阶段,而目前我主要是在公司项目上迁移到 Jest。所以本文主要采用 transformIgnorePatterns
和 moduleNameMapper
两种配置来解决这个问题。
以下配置主要以 lodash-es 作为参考。
官方文档的解释是:正则表达式模式字符串的数组,在转换之前与所有源文件路径匹配。如果文件路径与任何模式匹配,则不会对其进行转换。
即 transformIgnorePatterns
用于指定在进行代码转换时应该忽略的文件或文件夹。
而在 NX 默认的 Jest 配置中,配置为 node_modules/(?!.*\\.mjs$)
。
这个正则表达式的含义是,匹配以 node_modules/
开头的文件夹路径,但排除那些以 .mjs
为扩展名的文件夹路径。?!
是一个否定预查,表示不匹配这样的文件夹路径。
以上配置意思就是将会把以 .mjs
为扩展名的文件从 ESM 转换为 CommonJS,以支持 Jest。
添加转换 lodash-es
顺便支持一下 PNPM
转换后 failed 数量从 15 减少到 11,但是这么做会有一个转换的过程会有额外的支出,需要 51s。不过第一次转换完后貌似就会缓存然后就不用转换了。
支出更少的方法 moduleNameMapper
这种方法需要库本身有对应的 CommonJS,就不需要转换了。可以跑到 12s
最终配置参考如下
参考
- Jest setup "SyntaxError: Unexpected token export"
- Configuring Jest · Jest
- ECMAScript Modules · Jest
- Configuring Jest · Jest