inflearn logo
강의

講義

知識共有

Next + React Query で SNS サービスを作成する

[ERROR] MSW Server-Side 적용 실패 에러 / (Module not found Error '_http_common')

471

jy ko

投稿した質問数 1

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>
  );
};

아래와 같은 화면을 확인 할 수 있습니다.

image.png

이를 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' 나게 됩니다.

image.png

[찾아본 원인?]

_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를 사용할 수는 있지만, 해결 방안이 있을지 해서 질문드립니다!

react next.js msw

回答 3

0

yho79555

안녕하세요 저도 해당 문제 겪어서 해결했습니다. 공유해드립니다
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>
  );
}

 

 

참고

https://github.com/mswjs/msw/issues/2291

0

zerocho

next 몇버전이신가요? 최신 버전에서는 해결된 이슈입니다.

0

jy ko

아하 넵넵!! 14.2.3 버전에서 작업하고 있었습니다. 알겠습니다!

0

zerocho

14버전은 서버사이드 msw 쓰셔야할겁니다 ㅠㅠ

0

wndtlr10248980

엥 저 nextjs15버전이고 msw는 2.7.3인데 찾을수없다는 에러가 뜨는데
최신버전에서는 해결된거맞나요?ㅠㅠ

0

zerocho

https://github.com/vercel/next.js/issues/70262

이 이슈긴 합니다. msw 2.4.3을 쓰거나

next.config.js에서 수정할 수도 있습니다

0

wndtlr10248980

답변감사합니다.

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다.

문제를 읽어보니 MSW(Mock Service Worker)를 사용하여 서버 사이드에서 모킹(mocking)을 시도할 때 모듈을 찾지 못하는 문제를 겪고 계시네요. 이와 관련된 몇 가지 사항을 고려해 볼 수 있습니다.

핵심 문제 및 해결 방향

  1. HTTP Common Module: _http_common 모듈은 일반적으로 Node.js 환경에서 사용되는 내부 모듈입니다. 이 모듈과 관련된 문제가 발생하는 이유는 MSW 서버 사이드 모킹이 브라우저와 Node.js 환경을 각각 다르게 처리해야 하기 때문입니다.

  2. 환경 변수 확인: MSW가 서버 사이드에서 제대로 작동하도록 하려면, Node.js 환경에서만 서버를 시작해야 합니다. 이를 위해 process.env.NEXT_RUNTIME과 같은 변수를 활용하고 있는데, 이 값이 올바르게 설정됐는지 확인이 필요합니다.

  3. Webpack 설정: _http_common 오류는 Next.js에서 node 환경에서 동작하도록 설정된 코드가 브라우저 번들로 포함될 때 발생할 수 있습니다. Webpack 설정에서 서버-사이드 전용으로 모듈을 처리하도록 설정될 필요가 있습니다. next.config.js에서 webpack 옵션을 사용하여 특정 노드 모듈을 외부화(externalize) 하거나 서버 전용으로 설정할 필요가 있습니다.

  4. MSW 설정 확인: MSW가 제대로 설정되지 않았다면 오류가 발생할 수 있습니다. 서버와 클라이언트 환경에서 각각 다른 설정이 필요할 수 있으니 이를 확인해야 합니다.

관련된 기존 질문과 답변

위 링크들을 참고하여 문제 해결의 단서를 찾기를 바랍니다. MSW와 관련된 문제는 설정과 환경 차이에 의해 발생하는 경우가 많기 때문에, 문제의 증상과 환경 정보를 놓고 정확히 접근하는 것이 중요합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

캡처링부분 질문있습니다.

0

74

2

깃에 소스코드를 찾을 수 없습니다.

0

113

2

useInfiniteQuery promise와 react use 사용시 페이지 무한 로딩

0

98

1

import 파일 경로를 찾지 못 해서 에러가 발생합니다.

0

109

2

css 라이브러리 추천 부탁드립니다

0

140

2

팔로우 추천 목록이 빈 배열로 들어옵니다.

0

130

1

게시물 업로드 시 userId가 undefined로 들어가는 오류

0

119

1

useSuspenseQuery 사용 시 SSR 401 이슈 관련

0

171

1

리액트 쿼리 useinfinitequery 무한스크롤 구현 시 페이지가 이동할 경우 데이터가 보존되게 할 수 있나요??

0

184

3

폴링이 필요없는 이유

0

93

2

next Request Memoization과 react cache

0

108

2

seo 최적화 기준은 데이터 fetching인가요 아님 데이터 렌더링인가요?

0

84

2

next.js 서버fetch 에러 fallback ui 구현 방법

0

173

2

프레임워크 여론 파악법

0

125

2

필터옵션이 많은 페이지에서 서버 fetch를 하는게 맞는걸까요??

0

103

2

서버 fetch suspense 로 감싸고 새로고침 시 잠시 빈 화면이 노출된 후 fallback ui가 노출됩니다.

0

102

2

template.tsx 내 서버fetch 응답값과 클라이언트 컴포넌트 상태값 싱크가 맞지 않는 이슈

0

66

2

Auth.js 사용 시 authorize 함수가 호출되지 않습니다

0

131

2

next.js 에서 로그인에 관하여

0

138

1

Next의 route handler에 대한 질문이 있습니다.

0

101

2

게시판 리스트 만들때 use client를 어디서부터 집어넣어야할지 모르겠습니다

0

97

2

프라이빗 폴더를 해야 하는 이유가 모호한 것 같아요.

0

85

2

vanilla-extract 못찾는 문제

0

229

2

fetch 캐싱과 revalidate 관련

0

84

2