Jest配置不忽略bpmn-moddle模块失效,修改后编译过慢求助
我太懂你现在的糟心感受了——想让Jest处理node_modules里的bpmn-moddle模块,要么配置完全不生效,要么一生效就编译整个node_modules慢到让人崩溃。咱们来把这个问题彻底捋顺解决掉。
问题根源:正则表达式的匹配逻辑出错
你最初写的transformIgnorePatterns: ['node_modules/(?!(bpmn-moddle)/)']没起作用,核心是正则的写法有小瑕疵。Jest的transformIgnorePatterns是用来指定哪些文件不需要转译的,我们要实现的逻辑是:忽略node_modules下的所有模块,唯独不忽略bpmn-moddle。
而你后来改成的['/!node_modules\/bpmn-moddle']完全搞反了逻辑——这个写法相当于告诉Jest“只要不是node_modules/bpmn-moddle的文件都要忽略”?不对,实际效果是Jest会跳过对bpmn-moddle的忽略,但同时没限制其他node_modules模块,导致所有依赖都被强制转译,速度自然慢得离谱。
正确的配置写法
把transformIgnorePatterns改成下面这个,就能精准实现需求:只转译bpmn-moddle,其他node_modules模块依然跳过转译:
module.exports = { roots: ['<rootDir>/src'], transform: { '^.+\.tsx?$': 'ts-jest', '^.+\.js$': 'babel-jest', '\.(gql|graphql)$': 'jest-transform-graphql' }, testRegex: '(/__tests__/.*|(\.|/)(test|spec))\.(jsx?|tsx?)$', moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], testResultsProcessor: './node_modules/luis/dist/bridges/jest/reporter', watchPathIgnorePatterns: ['<rootDir>/src/summary.json', '<rootDir>/src/snapshots.js'], setupTestFrameworkScriptFile: '<rootDir>/jest.setup.js', moduleNameMapper: { '^.*[.](css|CSS)$': '<rootDir>/test/styleMock.js', '^.*[.](jpg|gif|png|ttf|eot|svg)$': '<rootDir>/test/fileMock.js' }, // 修正后的关键配置 transformIgnorePatterns: ['/node_modules/(?!bpmn-moddle)/'] };
这个正则的逻辑很清晰:
- 匹配
node_modules目录下的所有内容 - 通过
(?!bpmn-moddle)这个负向预查,排除掉bpmn-moddle目录,意思是“只有后面不跟着bpmn-moddle的路径才会被忽略”
这样Jest就只会对bpmn-moddle进行转译,其他依赖保持忽略状态,既解决了模块不被处理的问题,又不会拖慢测试速度。
快速验证方法
如果不确定配置是否生效,可以写个简单的测试用例引入bpmn-moddle,运行测试看是否有语法错误(比如模块是ES6语法但没转译的话,Jest会直接报错)。如果测试能正常运行,就说明配置已经生效了。
内容的提问来源于stack exchange,提问作者tomitrescak

