작성
·
63
·
수정됨
0
[문제점]
MSW의 nodejs Server를 Server-Side 에서 실행하려고 할 때
Module not found Error '_http_common'
와 같은 에러 발생으로 빌드가 실패하는 상황을 겪고 있습니다. 저만 겪고 있는 상황인지 싶지만 질문 드립니다.
[현상황]
아래와 같이 SSR Component안에서 API를 사용하여 데이터를 받아온 후 화면을 그리고나면,
export const Home = async () => {
const res = await fetch("https://api.github.com/users/zerocho");
const data = await res.json();
return (
<div className="flex flex-1 items-center justify-center">
<h1>{data.name}</h1>
<img src={data.avatar_url} alt={data.name} className="rouneded" />
</div>
);
};
아래와 같은 화면을 확인 할 수 있습니다.
이를 MSW의 Server-side를 사용하기 위해서 Layout단에서 server를 listen하도록 실행하면
if (
process.env.NEXT_RUNTIME === "nodejs" &&
process.env.NODE_ENV !== "production"
) {
const { server } = require("@/mocks/http");
server.listen();
}
export default function RootLayout({
children
}: {
children: React.ReactNode;
}): JSX.Element {
return (
<html lang="en">
<body className={inter.className}>
<MSWProvider>
<Suspense>{children}</Suspense>
</MSWProvider>
</body>
</html>
);
}
아래와 같은 Build Error로 Module not found: Can't resolve '_http_common' 나게 됩니다.
[찾아본 원인?]
_http_common
이 Node.js built-in module인데, Next.js Webpack의 config에서 해당 module을 자동 import 하지 않아서 발생하는 에러라고 합니다. (출처:https://github.com/mswjs/msw/issues/2291)
[시도한 해결 방안 1]
- src/instrumentation.ts 파일을 아래와 같이 추가.
export async function register() {
if (process.env.NEXT_RUNTIME === "nodejs") {
const { server } = await import("./mocks/http");
server.listen();
}
}
- next.config.js를 아래와 같이 수정
/** @type {import('next').NextConfig} */
module.exports = {
reactStrictMode: true,
transpilePackages: ["@repo/ui"],
experimental: {
instrumentationHook: true
},
};
결과 동일
[시도한 해결방안 2]
- next.config.js에 webpack 내용 추가
/** @type {import('next').NextConfig} */
module.exports = {
reactStrictMode: true,
transpilePackages: ["@repo/ui"],
experimental: {
instrumentationHook: true
},
webpack: (config, { isServer }) => {
if (isServer) {
if (Array.isArray(config.resolve.alias))
// server일시 browser를 제외 시킨다
config.resolve.alias.push({ name: "msw/browser", alias: false });
else config.resolve.alias["msw/browser"] = false;
} else {
if (Array.isArray(config.resolve.alias))
config.resolve.alias.push({ name: "msw/node", alias: false });
else config.resolve.alias["msw/node"] = false;
}
return config;
}
};
결과 동일
[추가 조사한 내용들]
- 현재 github issue에 아래와 같이 등록되어 있습니다.
https://github.com/mswjs/msw/issues/2291
Server-Side를 사용하지 않고도 MSW를 사용할 수는 있지만, 해결 방안이 있을지 해서 질문드립니다!
답변 3
0
안녕하세요 저도 해당 문제 겪어서 해결했습니다. 공유해드립니다
node: 18버전
next: 14.2.5버전
"dependencies": {
...
"next": "14.2.5",
"react": "^18.3.1",
"react-dom": "^18"
},
"devDependencies": {
"@types/node": "^20",
"@types/react": "^18.3.1",
"@types/react-dom": "^18",
"msw": "^2.4.3",
...
},
원래 msw 2.7.0버전에서 2.4.3버전으로 버전을 낮추고, next.config.mjs에서 밑에 링크에 들어가서 복사붙여넣기해서 해결했습니다.
// src/app/layout.tsx
import type { Metadata } from 'next';
import './globals.css';
import appleSdGothic from '@/components/AppleSdGothic';
import MSWComponent from '@/components/MSWComponent';
import ReactQueryProviders from '@/hooks/useReactQuery';
export default function RootLayout({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
return (
<html lang="ko">
<body className={`${appleSdGothic.className}`} suppressHydrationWarning={true}>
<ReactQueryProviders>
<MSWComponent>{children}</MSWComponent>
</ReactQueryProviders>
</body>
</html>
);
}
참고
0
안녕하세요, 인프런 AI 인턴입니다.
문제를 읽어보니 MSW(Mock Service Worker)를 사용하여 서버 사이드에서 모킹(mocking)을 시도할 때 모듈을 찾지 못하는 문제를 겪고 계시네요. 이와 관련된 몇 가지 사항을 고려해 볼 수 있습니다.
HTTP Common Module: _http_common
모듈은 일반적으로 Node.js 환경에서 사용되는 내부 모듈입니다. 이 모듈과 관련된 문제가 발생하는 이유는 MSW 서버 사이드 모킹이 브라우저와 Node.js 환경을 각각 다르게 처리해야 하기 때문입니다.
환경 변수 확인: MSW가 서버 사이드에서 제대로 작동하도록 하려면, Node.js 환경에서만 서버를 시작해야 합니다. 이를 위해 process.env.NEXT_RUNTIME
과 같은 변수를 활용하고 있는데, 이 값이 올바르게 설정됐는지 확인이 필요합니다.
Webpack 설정: _http_common
오류는 Next.js에서 node
환경에서 동작하도록 설정된 코드가 브라우저 번들로 포함될 때 발생할 수 있습니다. Webpack 설정에서 서버-사이드 전용으로 모듈을 처리하도록 설정될 필요가 있습니다. next.config.js
에서 webpack
옵션을 사용하여 특정 노드 모듈을 외부화(externalize) 하거나 서버 전용으로 설정할 필요가 있습니다.
MSW 설정 확인: MSW가 제대로 설정되지 않았다면 오류가 발생할 수 있습니다. 서버와 클라이언트 환경에서 각각 다른 설정이 필요할 수 있으니 이를 확인해야 합니다.
위 링크들을 참고하여 문제 해결의 단서를 찾기를 바랍니다. MSW와 관련된 문제는 설정과 환경 차이에 의해 발생하는 경우가 많기 때문에, 문제의 증상과 환경 정보를 놓고 정확히 접근하는 것이 중요합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
아하 넵넵!! 14.2.3 버전에서 작업하고 있었습니다. 알겠습니다!