package.json의 type: module은 무엇일까?

업데이트:

발단

nodejs 프로젝트에서 ‘import’문을 사용하려고 하면, SyntaxError: Cannot use import statement outside a module 오류가 발생한다.
모듈 외부에서는 import statement를 사용할 수 없다는 말인데, 모듈이란 무엇이고 왜 import를 못쓰게 하는 것일까?

CommonJS와 ECMA Script Modules

CJS와 ESM은 모두 모듈 시스템이다. 최초의 Javascript는 모듈 시스템이 없었는데, js를 백앤드로도 사용하기 시작하면서 CommonJS 라는 모듈 시스템을 만들어 De facto로 사용했다.

CommonJS는 공식적인 표준이 아니었기 때문에 ECMA Script Modules라고 하는 모듈 시스템이 표준으로 새로 제정되었고, 모듈을 활용하기 위한 CommonJS와 다른 문법, 내부 구조를 가지고 있다.

  • 사족으로 모듈 시스템인 ESM과 ‘ES6, ES7, ES8’ 등의 ECMAScript 스펙 버전은 다른 말이다.

결론

package.json의 type이란, 현재 패키지가 어떤 모듈 시스템을 사용할 것인지 지정하는 것이다.

1
2
3
4
5
6
{
  "name": "node_jwt",
  "version": "1.0.0",
  "type": "module",
  ...
}

type: module로 지정하는 경우 모듈 시스템으로 ‘ESM’을 사용하겠다는 것이고, 따라서 ESM에 맞는 모듈 문법을 사용해야 하는 것이다.
type: commonjs 또는 아무것도 지정하지 않는 경우 CommonJS의 문법인 require()문을 사용하는 것이다.

내가 사용하고자 하는 Import from 문은 ESM의 문법이므로, 프로젝트에 type: module을 추가해주었다.

댓글남기기