노드 13.2.0 이상
NodeJS 13.2.0은 이제 플래그없이 ES 모듈을 지원합니다. 그러나 구현은 여전히 실험적인 것으로 표시되어 있으므로 프로덕션 환경에서주의해서 사용하십시오.
13.2.0에서 ESM 지원을 활성화하려면 다음을 추가하십시오 package.json
.
{
"type": "module"
}
모든 .js
, .mjs
(또는 확장자가없는 파일) ESM으로 처리됩니다.
전체 package.json
옵트 인 이외의 여러 가지 옵션 이 있으며 모두 13.2.0 설명서에 자세히 설명되어 있습니다.
노드 13.1.0 이하
여전히 이전 버전의 Node를 사용하는 사용자는 esm 모듈 로더 를 사용해 볼 수 있습니다 . 이는 NodeJS에 대한 ES 모듈 사양의 프로덕션 지원 구현입니다.
node -r esm main.js
상세 업데이트 ...
2019 년 4 월 23 일
최근에 PR 모듈이 ES 모듈 감지 방법을 변경하기 위해 방문했습니다 :
https://github.com/nodejs/node/pull/26745
여전히 --experimental-modules
플래그 뒤에 있지만 모듈을로드하는 방법에 큰 변화가 있습니다.
package.type
어느 쪽이든 module
또는commonjs
type: "commonjs"
:
.js
commonjs로 구문 분석됩니다
- 확장자가없는 진입 점의 기본값은 commonjs입니다.
type: "module"
:
.js
esm으로 파싱
- 기본적으로 JSON 또는 네이티브 모듈로드를 지원하지 않습니다
- 확장명이없는 진입 점의 기본값은 esm입니다.
--type=[mode]
진입 점에서 유형을 설정할 수 있습니다. package.type
진입 점을 무시 합니다.
- 새로운 파일 확장자
.cjs
.
- 이것은 특히
module
모드 에서 commonjs 가져 오기를 지원하기위한 것 입니다.
- 이것은 esm 로더에만 있으며 commonjs 로더는 그대로 유지되지만 전체 파일 경로를 사용하면 확장 프로그램이 이전 로더에서 작동합니다.
--es-module-specifier-resolution=[type]
- 옵션은
explicit
(기본값)과node
- 기본적으로 로더는 가져 오기에서 선택적 확장을 허용하지 않습니다. 확장이있는 경우 모듈의 경로에 확장이 포함되어야합니다
- 기본적으로 로더는 색인 파일이있는 디렉토리를 가져올 수 없습니다
- 개발자는
--es-module-specifier-resolution=node
commonjs 지정자 해결 알고리즘을 사용하는 데 사용할 수 있습니다.
- 이것은 "기능"이 아니라 실험을위한 구현입니다. 플래그가 제거되기 전에 변경 될 것으로 예상됩니다
--experimental-json-loader
- 때 JSON을 가져 오는 유일한 방법
"type": "module"
- 모든
import 'thing.json'
모드가 모드와 상관없이 실험용 로더를 통과 할 때
- whatwg / html # 4315 기반
package.main
모듈의 진입 점을 설정하는 데
사용할 수 있습니다
- main에서 사용되는 파일 확장자는 모듈 유형에 따라 결정됩니다.
2019 년 1 월 17 일
노드 11.6.0은 여전히 플래그 뒤에 ES 모듈을 실험적으로 나열합니다.
2017 년 9 월 13 일
플래그 뒤에 mjs 파일을 지원하는 NodeJS 8.5.0 이 릴리스되었습니다.
node --experimental-modules index.mjs
이를위한 계획은 v10.0 LTS 릴리스에 대한 플래그를 제거하는 것입니다.
-오래된 정보. 역사적인 목적으로 여기에 보관했습니다.
2017 년 9 월 8 일
NodeJS 마스터 분기가 ESM 모듈에 대한 초기 지원으로 업데이트되었습니다.
https://github.com/nodejs/node/commit/c8a389e19f172edbada83f59944cad7cc802d9d5
최신 야간에 사용할 수 있어야 합니다 (기존 설치와 함께 실행하기 위해 nvm 을 통해 설치할 수 있음 ).
https://nodejs.org/download/nightly/
그리고 --experimental-modules
깃발 뒤에서 가능해졌습니다 .
package.json
{
"name": "testing-mjs",
"version": "1.0.0",
"description": "",
"main": "index.mjs" <-- Set this to be an mjs file
}
그런 다음 다음을 실행하십시오.
node --experimental-modules .
2017 년 2 월 :
https://medium.com/@jasnell/an-update-on-es6-modules-in-node-js-42c958b890c#.6ye7mtn37
NodeJS 직원은 가장 나쁜 해결책은 .mjs
파일 확장자 를 사용하는 것이라고 결정했습니다 . 이것으로부터의 테이크 아웃은 :
즉, 두 개의 파일이 주어 foo.js
지고 bar.mjs
를 사용 import *
from 'foo'
하면 foo.js
CommonJS로 import * from 'bar'
취급 bar.mjs
되고 ES6 모듈로 취급 됩니다.
그리고 타임 라인은 ...
현재 시점에서 Node.js가 ES6 모듈의 지원 가능한 구현을 시작하기 전에 ES6 및 가상 머신 측면에서 발생해야하는 많은 사양 및 구현 문제가 여전히 있습니다. 작업이 진행 중이지만 시간이 좀 걸릴 것입니다. 현재 최소 1 년 정도는보고 있습니다.
2016 년 10 월 :
Node.JS의 개발자 중 한 명이 최근 TC-39 회의에 참석하여 Node.JS 구현에 대한 훌륭한 기사를 작성했습니다.
https://hackernoon.com/node-js-tc-39-and-modules-a1118aecf95e
기본 테이크 아웃은 다음과 같습니다.
- ES 모듈은 정적으로 분석되고 CommonJS는 평가됩니다
- CommonJS 모듈은 원숭이 패치 내보내기를 허용하지만 ES 모듈은 현재
- 어떤 사용자 입력없이 ES 모듈과 CommonJS가 무엇인지 감지하기는 어렵지만 시도하고 있습니다.
*.mjs
사용자 입력없이 ES 모듈을 정확하게 감지 할 수 없다면 가장 가능성이 높은 솔루션 인 것 같습니다.
-원래 답변-
이것은 꽤 오랫동안 뜨거운 감자였습니다. 가능성이 가장 높은 때 - 결론이 예는, 노드는 결국 모듈을 / 가져 오기, 내보내기위한 ES2015 구문을 지원하는 것입니다 로드 모듈에 대한 사양이 확정 동의합니다.
다음은 NodeJS를 유지하는 것에 대한 좋은 개요 입니다. 본질적으로, 새로운 사양은 주로 조건부, 동기식 로딩 인 노드와 주로 비동기식 인 HTML에 작동해야합니다.
아무도 지금 당장 알지 못하지만 Node가 동적 로딩을위한 import/export
새로운 기능 외에도 정적 로딩 을 지원할 것이라고 생각하지만 레거시 코드는 System.import
계속 유지 require
합니다.
Node가이를 달성하는 방법에 대한 제안은 다음과 같습니다.
node es2015 modules
는 다음 결과를 최고의 결과 중 하나로 표시합니다 : github.com/nodejs/node/wiki/ES6-Module-Detect-in-Node .