Warning

Failed to load module script: Expected a JavaScript module script but the server responded with a MIME type of "text/html"

마시멜로를찾아서 2025. 5. 8. 11:21
반응형

Nuxt 3 프로젝트를 **정적 SPA(Static Single Page Application)**로 빌드하고, 백엔드(API 서버)와 연동하려는 상황이군요. 아래에 전체 흐름과 반드시 필요한 설정, 그리고 MIME 오류 방지 + 백엔드 API 호출 연동 방법을 체계적으로 정리


✅ 1. Nuxt 3 정적 SPA 빌드 방법

npx nuxi generate
  • 결과: .output/public/ 또는 dist/ 경로 안에
    • index.html
    • /_nuxt/*.js, .css 등 정적 자산 생성됨

👉 이 구조는 npx serve .output/public로 즉시 실행 테스트 가능


✅ 2. 디플로이 구조 개요

역할구성
정적 SPA Nuxt에서 빌드한 index.html, /_nuxt/*.js
API 서버 별도 백엔드 서버 (예: Spring, NestJS, Express 등)
호스팅 대상 NGINX, AWS S3+CloudFront, SAP BTP, 혹은 자체 Node.js 서버
 

 


✅ 3. 서버에서 정적 자산 서빙할 때 주의점

반드시 정적 자산이 존재하는 경로에서 서빙해야 합니다:

  • ✅ /index.html → HTML
  • ✅ /_nuxt/*.js → JS with Content-Type: application/javascript
  • ❌ JS 요청인데 HTML을 반환 → MIME 오류

✅ 4. Nuxt에서 API 서버 연동 설정

📄 .env 파일

NUXT_PUBLIC_API_BASE=https://api.example.com

📄 nuxt.config.ts

export default defineNuxtConfig({
  ssr: false, // SPA 모드
  nitro: {
    preset: "static"
  },
  runtimeConfig: {
    public: {
      apiBase: process.env.NUXT_PUBLIC_API_BASE
    }
  },
  app: {
    baseURL: "/", // 일반적 SPA라면 루트
    buildAssetsDir: "/_nuxt/",
  },
})

✅ 5. $fetch나 axios 사용할 때 API base 설정

예: $fetch 사용하는 유틸 함수

export function useApiFetch<T>(url: string, options = {}) {
  const config = useRuntimeConfig();
  return $fetch<T>(url, {
    baseURL: config.public.apiBase,
    ...options,
  });
}
// 사용 예시
await useApiFetch("/api/v1/login", {
  method: "POST",
  body: { username, password },
});

✅ 6. 정적 SPA 라우팅 문제 방지 (서버 측 설정)

정적 SPA는 브라우저 라우팅이므로, 서버는 항상 index.html을 반환해야 합니다 (404 말고!)

📄 예: NGINX 설정

location / {
  root /var/www/html;
  index index.html;
  try_files $uri $uri/ /index.html;
}

location /_nuxt/ {
  root /var/www/html;
  access_log off;
}

✅ 7. MIME 오류 해결 포인트

요청 경로응답 내용MIME 타입
/index.html HTML text/html
/_nuxt/*.js JavaScript application/javascript ✅
잘못된 경로 요청 시 HTML ❌ MIME 오류 발생
 

즉, /_nuxt/*.js 요청을 반드시 해당 파일이 실제 존재하는 경로에서 제공해야 하며, HTML을 반환하면 안 됩니다.


🧪 체크리스트

  • nuxi generate로 index.html, _nuxt/*.js가 생성되었는가?
  • 서버가 JS 요청에 대해 HTML이 아닌 JS로 응답하는가?
  • API 호출은 useRuntimeConfig().public.apiBase를 사용했는가?
  • 상대 경로(/api/...)가 아니라 절대 경로로 API 호출 중인가?
  • history fallback (try_files /index.html)이 설정되어 있는가?
반응형