웹/프론트엔드
Next.js + jest 설정 시 react/swiper 해석이 안되는 이슈
이민훈
2024. 4. 22. 03:45
Next.js에서 jest를 설정하던 도중 react-swiper 라이브러리 때문에 꾀나 애 먹었습니다.
먼저 swiper/css 를 해석하지 못하는 부분입니다.
moduleNameMapper: {
...jestConfig.moduleNameMapper,
"swiper/css": "identity-obj-proxy",
},
css 모듈을 해석할 수 있도록 identity-obj-proxy 라이브러리를 사용해 주면 됩니다.
해당 문제가 해결되니, Cannot use import statement outside a module 에러가 발생합니다.
해당 부분에 대한 이슈를 검색해 보니
transformIgnorePatterns: ["node_modules/(?!(swiper|ssr-window|dom7)/)"],
구문을 추가하라는 답변이 많아 추가 해주었습니다.
하지만 여전히 같은 이슈가 발생했는데 기본적으로 해당 에러 구문은 ESM 모듈을 해석하지 못해 발생하기 때문에
mjs(swiper-react.mjs) 파일 또한 ts-jest가 해석할 수 있도록 세팅을 바꾸었더니 성공적으로 jest를 실행할 수 있었습니다.
// ts|tsx|js|jsx 외에 .mjs 확장자도 ts-jest가 해석할 수 있도록 추가
transform: {
"^.+\\.(ts|tsx|js|jsx|mjs)$": [
"ts-jest",
{
tsconfig: "<rootDir>/tsconfig.test.json",
},
],
},
// jest.config.ts
import type { Config } from "jest";
import nextJest from "next/jest.js";
const createJestConfig = nextJest({
dir: "./",
});
const customJestConfig: Config = {
setupFilesAfterEnv: ["<rootDir>/jest.setup.js"],
testEnvironment: "jest-environment-jsdom",
preset: "ts-jest",
moduleNameMapper: {
"^@/(.*)$": "<rootDir>/src/$1",
},
};
const config: () => Promise<Config> = async () => {
const jestConfig = await createJestConfig(customJestConfig)();
return {
...jestConfig,
moduleNameMapper: {
...jestConfig.moduleNameMapper,
"swiper/css": "identity-obj-proxy",
},
transformIgnorePatterns: ["node_modules/(?!(swiper|ssr-window|dom7)/)"],
transform: {
"^.+\\.(ts|tsx|js|jsx|mjs)$": [
"ts-jest",
{
tsconfig: "<rootDir>/tsconfig.test.json",
},
],
},
};
};
export default config;
// jest.setup.js
import "@testing-library/jest-dom";
// tsconfig.test.json
{
"extends": "./tsconfig.json",
"compilerOptions": {
"jsx": "react-jsx"
}
}