JEST - 使用uuid库出现“SyntaxError: Unexpected token 'export'”错误

57

在使用JavaScript时,我曾经解决过类似的错误,但是现在使用Typescript时无法做到。

在安装Puppeteer之前,我的所有测试都能够正常运行,但是安装Puppeteer之后需要安装@types/jest-environment-puppeteer@types/puppeteer@types/expect-puppeteer

安装完它们后,Puppeteer测试可以完美运行,但其他测试会出现以下错误。

  D:\...\api\node_modules\uuid\dist\esm-browser\index.js:1    
    ({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,jest){export { default as v1 } from './v1.js';
                                                                                      ^^^^^^  

    SyntaxError: Unexpected token 'export'

      at Runtime.createScriptFromCode (../node_modules/jest-runtime/build/index.js:1796:14)   
      at Object.require (../node_modules/@nestjs/common/decorators/core/injectable.decorator.js:4:16)

我做了什么?

tsconfig.json上设置allowJs: true,并在jest配置中设置transformIgnorePatterns,以便jest可以编译来自node_modules/的文件。之后这个错误停止了,但测试失败了,原因很奇怪。更糟糕的是测试启动时间也增加了很多。

所以我保留了原始设置中的allowJs,并更新了jest配置。

"transform": {
   "^.+\\.(t|j)s$": "ts-jest"
}

to

"transform": {
   "^.+\\.(t)s$": "ts-jest"
}

目前,ts-jest无法编译js文件。但我认为我无法让babel选择js文件的转换。这是我的jest配置:

{
  "moduleFileExtensions": ["js", "json", "ts"],
  "rootDir": ".",
  "testEnvironment": "node",
  "testRegex": ".e2e-spec.ts$",
  "transform": {
    "^.+\\.(t)s$": "ts-jest",
    "^.+\\.(js|jsx)$": "babel-jest"
  },
  "transformIgnorePatterns": ["<rootDir>/node_modules/.+.(js|jsx)$"]
}
6个回答

92

感谢这个回复:https://dev59.com/sFgQ5IYBdhLWcg3wxGpP#54117206

我开始搜索类似的解决方案,最终在这里找到了:https://github.com/uuidjs/uuid/issues/451

这个解决了我的问题:https://github.com/uuidjs/uuid/issues/451#issuecomment-1112328417

// jest.config.js
{
//................
  moduleNameMapper: {
    // Force module uuid to resolve with the CJS entry point, because Jest does not support package.json.exports. See https://github.com/uuidjs/uuid/issues/451
    "uuid": require.resolve('uuid'),
  }
}

尽管我仍然希望能够使用jest-babel解决这个问题。

因为我不得不将jest配置从package.json移动到一个单独的.js文件中。

编辑: 根据这个github问题,兼容性问题已经在最新版本的uuid库中得到解决。


1
我一直在使用 jest.config.ts 文件,但引号总是被剥离掉 "uuid",而且修复方法也不起作用。通过将其改为 "^uuid$",这个问题得到了解决。截至2022年8月23日,最新版本的 uuid 仍然是 beta 版本,并且链接中指出它仅与 jest 的 beta 29.x 版本进行了测试,因此我认为既然我刚从 27.x 版本升级,我现在会继续使用这个解决方案。谢谢。 - Tod
1
不用谢。我非常理解你的意思 :) - damdafayton

32

对我来说,只需在jest.config.js中添加moduleNameMapper:{"^uuid$": "uuid"}即可解决问题:

瞬态依赖 uuid: ^8.3.2

jest: 28.1.3

angular: 14.0.1


不是uuid,而是这个答案对chevrotain包有帮助,该包存在相同的问题。 - undefined

0

更新到 uuidv4() 版本 9.0.0 (“uuid”:“^9.0.0”) 现在可以修复此问题。 参见SimenB的评论:https://github.com/uuidjs/uuid/issues/451#issuecomment-1377099565

我最初尝试了上面的答案,将 moduleNameMapper:{"^uuid $": "uuid"} 添加到我的 jest.config.js 中,这为我解决了问题。然后我按照上面的链接阅读更多信息,发现问题已经在 "uuid": "^9.0.0" 中得到解决。

因此,我删除了修复方法,安装了最新的版本9.0.0的 uuidv4()(包链接如下),然后它又可以正常工作了。再也没有错误,测试也再次运行良好。https://www.npmjs.com/package/uuid

在将"jest": "26.0.1"更新为"jest": "29.4.1","environment-jsdom-fifteen": "1.0.2"更新为"jest-environment-jsdom": "29.4.1"以及其他更新"ts-jest": "26.5.6"更新为"ts-jest": "^29.0.5"后,我的React应用程序开始出现问题。然而,正如上面提到的,升级到uuid版本9.0.0已经解决了这个问题。


0
日期:2023年2月15日
Jest版本:"@types/jest": "^29.4.0"
UUID版本:"uuid": "^9.0.0"
使用jest.config.ts会生成一个错误,提示“找到多个配置项”。
以下是如何覆盖该错误的方法。
/**
 * @format
 */

import 'react-native';
import React from 'react';
import App from '../src/App';
import {v4 as uuidv4} from 'uuid';

// Note: test renderer must be required after react-native.
import renderer from 'react-test-renderer';

it('renders correctly', () => {
  renderer.create(<App />);
});

jest.mock('uuid', () => {
  return {
    v4: jest.fn(() => 1)
  }
})


希望这能解决其他人的错误,如果正确答案对你不起作用 :)。

0
将以下内容添加到 package.json 文件中,问题得以解决:
"devDependencies": {
....
},
"browser": {
    "uuid": "./node_modules/uuid/dist/esm-browser/index.js"
  }

0

@damdafayton的答案对我有所帮助(谢谢),但它最终会导致另一个使用uuid的库出现问题(在我的情况下是mongoose)。我认为这个覆盖会导致mongoose选择错误的版本。

为了克服这个打地鼠游戏,我最终创建了一个顶级__mocks__/uuid.js的模拟,其中包含:

const uuid = require('../node_modules/uuid/dist');
module.exports = uuid;

......这似乎起作用了。

也许是我针对jest更具体地强制使用了uuid的版本,而没有中断正常的解析器,但很难确定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接