使用NextJS搭配Jest时出现package.json解析失败问题求助
NextJS + Jest 遇到「Can't resolve main package.json file」问题求助
在使用NextJS搭配Jest开发时,出现了「Can't resolve main package.json file」的错误。采用基于Babel的jest.config.js配置可正常运行,但使用next/jest的配置方案却无法生效,希望获得解决方案。
当前失效的 jest.config.js
const nextJest = require('next/jest') const { pathsToModuleNameMapper } = require('ts-jest') const { compilerOptions } = require('./tsconfig.json') const createJestConfig = nextJest({ dir: '/' }) const customJestConfig = { moduleDirectories: ["node_modules", "<rootDir>/", "<rootDir>/src"], moduleNameMapper: pathsToModuleNameMapper(compilerOptions.paths), testEnvironment: "jest-environment-jsdom" } module.exports = createJestConfig(customJestConfig)
package.json(仅展示相关部分)
{ // 省略无关内容 "scripts": { "test": "jest --watch", }, "dependencies": { "next": "^13.1.1", "react": "18.2.0", "react-dom": "18.2.0", "typescript": "4.9.4" }, "devDependencies": { "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@types/jest": "^29.2.6", "@types/react-redux": "^7.1.25", "identity-obj-proxy": "^3.0.0", "jest": "^29.3.1", "jest-environment-jsdom": "^29.4.2", "ts-jest": "^29.0.5" } }
tsconfig.json
{ "compilerOptions": { "target": "esNext", "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, "strict": true, "forceConsistentCasingInFileNames": true, "noEmit": true, "esModuleInterop": true, "module": "esnext", "moduleResolution": "node", "resolveJsonModule": true, "isolatedModules": true, "jsx": "preserve", "incremental": true, "baseUrl": ".", "paths": { "@/*": ["./src/*"], "@@/*": ["./*"], "@fb/*": ["./firebase/*"] } }, "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "src/components/Header/__tests__/header.test.tsx", "jest.config.js"], "exclude": ["node_modules"] }
错误信息
运行测试时抛出错误:Can't resolve main package.json file
可正常运行的基于Babel的 jest.config.js
module.exports = { collectCoverage: true, coverageProvider: 'v8', collectCoverageFrom: [ '**/*.{js,jsx,ts,tsx}', '!**/*.d.ts', '!**/node_modules/**', '!<rootDir>/out/**', '!<rootDir>/.next/**', '!<rootDir>/*.config.js', '!<rootDir>/coverage/**', ], moduleNameMapper: { '^.+\\.module\\.(css|sass|scss)$': 'identity-obj-proxy', '^.+\\.(css|sass|scss)$': '<rootDir>/__mocks__/styleMock.js', '^.+\\.(png|jpg|jpeg|gif|webp|avif|ico|bmp|svg)$/i': `<rootDir>/__mocks__/fileMock.js`, '^@/(.*)$': '<rootDir>/src/$1', '^@/components/(.*)$': '<rootDir>/components/$1', }, testPathIgnorePatterns: ['<rootDir>/node_modules/', '<rootDir>/.next/'], testEnvironment: 'jsdom', transform: { '^.+\\.(js|jsx|ts|tsx)$': ['babel-jest', { presets: ['next/babel'] }], }, transformIgnorePatterns: [ '/node_modules/', '^.+\\.module\\.(css|sass|scss)$', ], }
内容的提问来源于stack exchange,提问作者MGlower
相关产品推荐
相关产品推荐

