NodeJS는 가져 오기 / 내보내기 es6 (es2015) 모듈을 지원할 계획입니다


275

나는 이것에 대한 명확한 대답없이 인터넷을 통해 찾고 있습니다.

현재 NodeJS는 CommonJS 구문 만 사용하여 모듈을로드하며, 표준 ES2015 모듈 구문을 실제로 사용하려면 미리 변환하거나 런타임에 외부 모듈 로더를 사용해야합니다.

현재 두 가지 방법 중 하나를 사용하기에 너무 긍정적이지 않습니다. NodeJS 관리자는 ES2015 모듈을 지원할 계획이 있습니까? 나는 이것에 대한 힌트를 전혀 찾지 못했습니다.

현재 NodeJS 6.x는 ES2015 기능의 96 %를 지원한다고 주장하지만 모듈에 대한 참조는 없습니다 ( NodeJS ES2105 지원 링크 ).

가까운 시일 내에 NodeJS가 이러한 모듈을 즉시 지원할 수 있는지 알고 있습니까?


2
Googling for node es2015 modules는 다음 결과를 최고의 결과 중 하나로 표시합니다 : github.com/nodejs/node/wiki/ES6-Module-Detect-in-Node .
Felix Kling 2016 년

6
개인적으로 나는이 질문을“너무 현지화”된 것으로 표명하기를 원하지만 그 근거는 더 이상 존재하지 않습니다. Node가 내일 ES6 모듈을 구현한다고 가정 해 봅시다. 더 이상 관련이 없기 때문에 질문을 삭제 하시겠습니까? 아니면 적어도 업데이트 하시겠습니까? 구식이거나 "곧"업데이트되어야한다는 것을 이미 알고 있다면 질문이 SO에 적합하다고 생각하지 않습니다. 그러나 그것은 단지 내 의견 일 뿐이며 반대되는 생각을하는 다른 사람들이있는 것 같습니다. :) (fwiw, 그 자체로 문제는 물론 중요하고 흥미 롭습니다)
Felix Kling

2
그래도 Stack Universe에는 이와 같은 질문이있을 수 있기를 바랍니다. 여기에는 기술적으로 적합하지 않지만 실제로는 "의견 기반"이라는 것에 동의하지 않습니다. OP는 특정 질문에 대한 특정 답변을 찾고 있지만 (어느 시점에서) 구식 인 답변을 찾고 있습니다.
Sane Wonko

5
이 질문의 다른 표현 : "ES6 모듈에 대한 node.js 상태는 무엇입니까?" 많은 SO 질문에 대한 답변은 기술이 발전함에 따라 시간이 지남에 따라 변합니다. 나도 여기에 도착할 때까지 답을 찾는 데 어려움을 겪었다.
Joe Lapp

4
@FelixKling이 질문을 끝내고 싶었던 것은 지금까지 211 명이 투표하기에 충분히 문제가있는 것으로 판명 되었기 때문에 매우 잘못된 결정이었을 것입니다.
Muhammad Umer

답변:


302

노드 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가이를 달성하는 방법에 대한 제안은 다음과 같습니다.


38
.mjs확장 정보 : We have affectionately called these “Michael Jackson Script” files in the past. JS 대화 중에 누군가가 팝 아티스트에 대해 이야기하는 것을 듣는 경우를 대비하여.
Jeewes

1
왜 가져 오기 구문을 변경하는 것만으로는 충분하지 않은지 모르겠습니다. es를 가져 오는 구문 ( '올바른'구문)과 cjs를 가져 오는 구문은 무엇입니까? 다시 말해, foo.js와 bar.js라는 두 파일이 주어지면 import * from 'foo'CommonJS import * as bar from 'bar'가 bar.js를 ES6 모듈로 취급하는 것처럼 foo.js를 처리 할 것입니다. 누군가 설명 할 수 있습니까?
Corey Alix

1
@CoreyAlix 구문은 일반적으로 환경을 지원하기 위해 변경되지 않습니다. 이것은 결국 노드에만 영향을 미칩니다. 또한 구문은 직관적이지 않습니다. 제안 된 구문으로 내보내기에 어떻게 액세스합니까?
CodingIntrigue

분명히, 그것은 "나의"제안이 아니며, 이미 타이프 스크립트가하고있는 것을 복사하고 있습니다. 질문에 대답하려면 "bar"를 사용하여 내보내기에 액세스하십시오. bar.foobar () import "./foo"의 import {foo as Foo}는 ES6 모듈을 식별하는 메커니즘입니다. var Foo = require (“./ foo”)는 CJS 모듈을 식별하는 메커니즘입니다. Typescript에서 commonjs 출력은 다음과 같습니다. var mod1_1 = require ( "./ mod1"); exports.mod1 = mod1; ES6 출력은 다음과 같습니다. import {mod1} from“./mod1”; 수출 {mod1}
Corey Alix

1
이 답변에 대한 Node 10 업데이트에서 정말 흥미로울 것입니다. 지형지 물이 잘렸습니까, 아니면 여전히 깃발 뒤에 있습니까?
채점
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.