[javascript] NodeJS는 가져 오기 / 내보내기 es6 (es2015) 모듈을 지원할 계획입니다
나는 이것에 대한 명확한 대답없이 인터넷을 통해 찾고 있습니다.
현재 NodeJS는 CommonJS 구문 만 사용하여 모듈을로드하며, 표준 ES2015 모듈 구문을 실제로 사용하려면 미리 변환하거나 런타임에 외부 모듈 로더를 사용해야합니다.
현재 두 가지 방법 중 하나를 사용하기에 너무 긍정적이지 않습니다. NodeJS 관리자는 ES2015 모듈을 지원할 계획이 있습니까? 나는 이것에 대한 힌트를 전혀 찾지 못했습니다.
현재 NodeJS 6.x는 ES2015 기능의 96 %를 지원한다고 주장하지만 모듈에 대한 참조는 없습니다 ( NodeJS ES2105 지원 링크 ).
가까운 시일 내에 NodeJS가 이러한 모듈을 즉시 지원할 수 있는지 알고 있습니까?
답변
노드 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 기반
- 때 JSON을 가져 오는 유일한 방법
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가이를 달성하는 방법에 대한 제안은 다음과 같습니다.