2017-02-15 113 views
11

我正在对当前没有测试的现有项目实施测试。我的测试未能编译node_modules/导入。Jest设置“SyntaxError:意外的令牌导出”

/Users/me/myproject/node_modules/lodash-es/lodash.js:10 
export { default as add } from './add.js'; 
^^^^^^ 
SyntaxError: Unexpected token export 

    at transformAndBuildScript (node_modules/jest-runtime/build/transform.js:320:12) 
    at Object.<anonymous> (app/reducers/kind_reducer.js:2:43) 
    at Object.<anonymous> (app/reducers/index.js:12:47) 

我已经找到了解决办法是在开玩笑的package.json配置“白名单” node_modules这样的:

"jest": { 
    "transformIgnorePatterns": [ 
     "!node_modules/" 
    ] 
    } 

这似乎是一个黑客,因为它需要超过1分钟,运行一个简单的测试进口node_modules/lodash-es/lodash.js

任何帮助或方向感谢,谢谢!

+0

很多节点模块出口ES5,这样的玩笑可以运行它没有变形的箱子。这就是为什么默认情况下,jest不会转换node_modules。 在这种情况下,lodash-es专门导出es模块,因此您必须让jest转换该代码。如果您在'transformIgnorePatterns'中使用'“!node_modules/lodash-es”',那么您可能会很安全,因此只能在lodash-es上运行babel。 –

回答

9

我不得不添加到我这.jestconfig

"transformIgnorePatterns": [ 
    "<rootDir>/node_modules/(?!lodash-es)" 
] 
9

张贴在这里一个更完整的答案:

玩笑默认情况下不改变node_modules因为node_modules是巨大的。大多数节点模块被打包以公开ES5代码,因为它可以在没有任何进一步转换的情况下运行(并且大部分向后兼容)。

在你的情况下,lodash-es特别暴露ES模块,这将需要由Jest通过babel构建。

您可以尝试缩小白名单,使Jest不会尝试通过babel将node_modules中的每个JavaScript文件都传递给它。

我觉得你的情况正确的配置是:

"jest": { 
    "transformIgnorePatterns": [ 
    "/!node_modules\\/lodash-es/" 
    ] 
}