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. 추가 참고 자료
- Node.js 공식 문서: ES 모듈 지원: https://nodejs.org/docs/latest-v20.x/api/esm.html