玩笑设置“语法错误:意外的令牌导出”

IT技术 reactjs redux jestjs
2021-04-12 23:45:06

我正在将测试实施到当前没有测试的现有项目中。我的测试无法编译node_modules/导入。

/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)

我发现的解决方法是node_modules在 package.json jest 配置中加入“白名单” ,如下所示:

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

这看起来像是一个黑客,因为运行一个简单的测试需要 1 分钟以上的时间来导入node_modules/lodash-es/lodash.js.

5个回答

如果以上解决方案都不适合您,您可以开玩笑地尝试一下

"moduleNameMapper": {
    "^lodash-es$": "lodash"
}

它将lodash-es在测试运行时替换为 commonjs 版本。

谢谢,这是唯一对我有用的解决方案。这种transformIgnorePatterns方法对我不起作用。
2021-06-01 23:45:06
@jamesthollowell 你不必直接依赖它,因为你很可能已经通过另一个包深深依赖它。我真的不建议这样做,但是如果您不想在 pkg.json 中添加另一个条目,您可以这样做。
2021-06-04 23:45:06
我讨厌这是唯一对我有用的答案。必须有比两次将 lodash 作为依赖项更好的方法
2021-06-07 23:45:06
此解决方案似乎明显快于transformIgnorePatterns. (我的测试套件使用这个运行大约需要 17 秒,使用 运行大约需要 23 秒transformIgnorePatterns。)
2021-06-13 23:45:06
@jamesthollowell,您只需要lodashindevDependencies进行测试。所以它不会影响你的包大小。您仍然可以lodash-es在整个应用程序中使用导入。
2021-06-19 23:45:06

我不得不将它添加到我的.jestconfig

"transformIgnorePatterns": [
  "<rootDir>/node_modules/(?!lodash-es)"
]
注意:如果您已经jest --watch运行了,您必须退出并重新运行 jest 才能看到transformIgnorePatterns更改生效。
2021-05-26 23:45:06
如果您有多个,则可能需要包含在同一个正则表达式中,例如(?!lodash-es|my-module). 出于某种原因,如果它们在不同的条目中,它们会相互抵消。
2021-05-31 23:45:06
扩展 Jazzy 的评论:如果您已经有一个transformIgnorePatterns: [ 'node_modules/(?!foo|bar)' ]条目,那么您必须添加lodash-es到该列表中您不能在 transformIgnorePatterns 数组中添加单独的条目,因为现有条目已经表示“忽略 node_modules 下除 foo 和 bar 之外的所有文件夹”,因此将忽略 node_modules/lodash-es。// 提示(来自github 问题评论):如果使用 jest.config.js,则可以执行const esModules = ['foo', 'bar', 'lodash-es']然后esModules.join('|')
2021-06-07 23:45:06
由于 jest 文档中的这一声明,它们必须在同一个条目中。“如果测试路径与任何模式匹配,则不会进行转换。” 所以当 my-module 被测试时,它测试 ?!lodash-es 正则表达式为真,它被忽略。
2021-06-10 23:45:06
这有效,但我必须安装babel-jestbabel-preset-envbabel-preset-react和 然后"transform": { "^.+\\.(js|jsx|mjs)$": "<rootDir>/node_modules/babel-jest" },因为 ts 和 js 文件需要不同的转换。
2021-06-16 23:45:06

在此处发布更完整的答案:

Jest 默认不转换 node_modules,因为 node_modules 很大。大多数节点module被打包以公开 ES5 代码,因为它无需任何进一步的转换即可运行(并且在很大程度上向后兼容)。

在您的情况下,lodash-es 专门公开 ES module,这些module需要由 Jest 通过 babel 构建。

您可以尝试缩小白名单的范围,这样 Jest 就不会尝试通过 babel 传递 node_modules 中的每个 JavaScript 文件。

我认为在你的情况下正确的配置是:

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

对于create-react-app正在寻找修复程序的用户,以下是对我有用的方法:

// package.json
...
  "jest": {
    "transformIgnorePatterns": [
      "<rootDir>/node_modules/(?!lodash-es)"
    ]
  },
...

覆盖jest.config.js文件中的选项对我不起作用。请记住,并非每个选项都可以被覆盖,以下是支持的选项列表:https : //create-react-app.dev/docs/running-tests#configuration

谢啦。解决了我的问题
2021-05-27 23:45:06

将 .babelrc 重命名为babel.config.js并添加transformIgnorePatterns对我有用

module.exports = {
  "presets": ["@babel/preset-env"]
}

PS我的笑话版本是:“笑话”:“24.9.0”

https://github.com/facebook/jest/issues/6229#issuecomment-419885857