Troubleshooting

Node.js에서 ES 모듈 오류 해결

sod0l 2024. 9. 26. 17:50

1. 오류 메시지

sodol@macpro section2 % node dist/index.js
(node:61269) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
(Use `node --trace-warnings ...` to show where the warning was created)
/Users/sodol/frontend/TypeScript/onebite-typescript/section2/dist/index.js:2
export {};
^^^^^^

SyntaxError: Unexpected token 'export'
    at wrapSafe (node:internal/modules/cjs/loader:1281:20)
    at Module._compile (node:internal/modules/cjs/loader:1321:27)
    at Module._extensions..js (node:internal/modules/cjs/loader:1416:10)
    at Module.load (node:internal/modules/cjs/loader:1208:32)
    at Module._load (node:internal/modules/cjs/loader:1024:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:174:12)
    at node:internal/main/run_main_module:28:49

Node.js v20.15.1

 

해석:

(node:61269) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.

 

  • Node.js가 ES 모듈을 로드하려고 하지만, 이를 위해서는 `package.json`에 `"type": "module"`을 설정하거나 파일 확장자를 `.mjs`로 변경해야 한다는 경고 메시지
(Use `node --trace-warnings ...` to show where the warning was created)
  • 경고가 발생한 위치를 찾으려면 `node --trace-warnings` 명령어를 사용하라는 안내
/Users/sodol/frontend/TypeScript/onebite-typescript/section2/dist/index.js:2
  • 오류가 발생한 파일과 줄 번호를 나타낸다. 이 경우 `/dist/index.js` 파일의 2번째 줄에서 오류가 발생했음을 보여줌
export {};
  • 오류를 발생시킨 코드로, ES 모듈에서는 `export` 구문이 문제를 일으키고 있음
SyntaxError: Unexpected token 'export'
# 'export'라는 키워드가 예상하지 못한 위치에서 발견되었음을 나타내는 구문 오류
    
    at wrapSafe (node:internal/modules/cjs/loader:1281:20)
    # 오류가 발생한 내부 함수의 경로를 보여줌
    
    at Module._compile (node:internal/modules/cjs/loader:1321:27)
    # 모듈이 컴파일되는 과정에서 오류가 발생했음을 나타냄
    
    at Module._extensions..js (node:internal/modules/cjs/loader:1416:10)
    # 파일 확장자 처리 과정에서 오류가 발생했음을 나타냄
    
    at Module.load (node:internal/modules/cjs/loader:1208:32)
    # 모듈이 로드되는 과정에서의 오류 발생을 의미함
    
    at Module._load (node:internal/modules/cjs/loader:1024:12)
    # 모듈을 불러오는 과정에서 발생한 오류를 나타냄
    
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:174:12)
    # 사용자가 지정한 진입점(entry point)에서 오류가 발생했음을 의미함
    # (프로그램이 실행되는 가장 첫 단계에서 문제를 발견했음을 나타냄)
    
    # 진입점(entry point): 애플리케이션이나 프로그램이 시작되는 지점. 
    # 보통 index.js 또는 app.js 같은 파일이 진입점이 된다.
    # Node.js 애플리케이션을 실행할 때, 이 파일이 먼저 로드되고 실행된다.
    
    at node:internal/main/run_main_module:28:49
    # Node.js의 내부 메인 모듈에서 오류가 발생한 위치를 나타냄

Node.js v20.15.1

 

 

 

2. 오류 발생 상황

  • 프로젝트나 파일 위치: `/Users/sodol/frontend/TypeScript/onebite-typescript/section2/dist/index.js`
  • 사용한 명령어: `node dist/index.js`
  • 상황 설명: Node.js로 컴파일된 TypeScript 파일을 실행하려고 했을 때, `export`구문을 사용하려 했으나 Node.js는 CommonJS 모듈 방식을 기본으로 사용하기 때문에 오류가 발생함.

 

 

3. 오류 원인 분석

  • Node.js는 기본적으로 CommonJS 방식으로 파일을 불러오고 내보낸다.
  • ES 모듈 방식으로 코드를 작성했기 때문에 Node.js가 `export` 구문을 이해하지 못함

 

 

4. 해결 방법

  • 방법 1: `package.json`에 `"type": "module"` 추가
    • 프로젝트에서 ES 모듈을 사용하려면 package.json 파일에 `"type": "module"`을 추가하여 Node.js가 ES 모듈을 인식하게 할 수 있음.
#json
{
  "type": "module"
}
  • 방법 2: 파일 확장자를 `.mjs`로 변경
    • ES 모듈 방식을 사용하고자 하는 파일의 확장자를 `.js`에서 `.mjs`로 변경하면 Node.js는 해당 파일을 ES 모듈로 처리함
  • 방법 3: CommonJS 방식으로 코드 수정
    • ES 모듈 대신 CommonJS 방식으로 코드를 작성하여 Node.js의 기본 모듈 시스템에 맞출 수 있음
#json
// ES 모듈 방식
export {};

// CommonJS 방식
module.exports = {};

 

 

5. 추가 참고 자료