[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=nodecommonjs 지정자 해결 알고리즘을 사용하는 데 사용할 수 있습니다.
    • 이것은 “기능”이 아니라 실험을위한 구현입니다. 플래그가 제거되기 전에 변경 될 것으로 예상됩니다
  • --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.jsCommonJS로 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가이를 달성하는 방법에 대한 제안은 다음과 같습니다.


답변