如何解决“语法错误:无法在模块外部使用 import 语句”

问题描述 投票:0回答:1

这是一个使用 jest 进行测试的 nextjs 项目。我添加了

next-auth
库,当测试套件针对导入
import { signIn, signOut, useSession } from 'next-auth/react'

的文件运行时,我的测试失败了

这是错误消息:

Details:

/node_modules/next-auth/react.js:10
import { jsx as _jsx } from "react/jsx-runtime";
^^^^^^

SyntaxError: Cannot use import statement outside a module



  at Runtime.createScriptFromCode (node_modules/jest-runtime/build/index.js:1505:14)
  at Object.<anonymous> (src/shared/components/header.tsx:1767:27)
  at Object.<anonymous> (src/shared/components/header.test.tsx:22:56)

我假设这是一个 jest.config.js 问题,我的配置如下:

import nextJest from 'next/jest';
import type { Config } from 'jest';

const createJestConfig = nextJest({
  dir: './',
});

const config: Config = {
  clearMocks: true,
  collectCoverage: true,
  collectCoverageFrom: ['src/**/*.ts', 'src/**/*.tsx'],
  coverageDirectory: 'coverage',
  coveragePathIgnorePatterns: [
    'node_modules',
    'qsrkit',
    '_redux',
    'shared/utils',
    'layout',
    'page.tsx',
  ],
  moduleFileExtensions: ['js', 'jsx', 'ts', 'tsx', 'json', 'node'],
  moduleNameMapper: {
    '^@/(.*)$': '<rootDir>/src/$1',
    '^@/app/(.*)$': '<rootDir>/src/app/$1',
    '^@/shared/(.*)$': '<rootDir>/src/shared/$1',
    '^@/icons/(.*)$': '<rootDir>/src/shared/assets/icons/$1',
    '^@/utils/(.*)$': '<rootDir>/src/shared/utils/$1',
  },
  preset: 'ts-jest',
  reporters: ['default', 'jest-junit'],
  roots: ['<rootDir>'],
  setupFilesAfterEnv: ['<rootDir>/jest.setup.ts'],
  testEnvironment: 'jsdom',
  testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$',
  testPathIgnorePatterns: ['/node_modules/', '/playwright/'],
  watchPathIgnorePatterns: ['/node_modules/', '/playwright/'],
  modulePathIgnorePatterns: ['/node_modules/', '/playwright/'],
  transform: {
    '^.+\\.tsx?$': 'ts-jest',
  },
};

export default createJestConfig(config);

我想既然我已经忽略了

/node_modules/
,这不会被抓住,但显然这是行不通的。

next.js jestjs next-auth
1个回答
0
投票

Jest 默认使用 CommonJS 环境,因此不允许使用 import 语句。使用 require 代替

© www.soinside.com 2019 - 2024. All rights reserved.