web-dev-qa-db-ja.com

NodeJSはインポート/エクスポートes6(es2015)モジュールをサポートする予定です

私はこれに対する明確な答えなしにインターネット中を見てきました。

現在NodeJSはモジュールをロードするためにCommonJS構文のみを使用しています、そしてもしあなたが本当に標準のES2015モジュール構文を使いたいのなら、あなたはそれを前もってコンパイルするか、あるいは実行時に外部モジュールローダーを使わなければなりません。

現在、私はこれら2つの方法のどちらかを使用することはあまりポジティブではありません、NodeJSメンテナはES2015モジュールをサポートすることさえ計画しているのですか?これについてはまったくヒントが見つかりません。

現時点でNodeJS 6.xはES2015機能の96%をサポートすると主張していますが、モジュールへの言及はありません( NodeJS ES2105サポートリンク )。

近い将来、NodeJSがすぐにこれらのモジュールをサポートするかどうか知っていますか?

254
Zorgatone

tl; dr

最新のNodeJS はまだESモジュールを実験的なものとして、フラグの後ろに記載しています。

この問題に対する解決策を探している人は、 esm module loaderを試してみるとよいでしょう。これは、NodeJS用のESモジュール仕様の本番用の実装です。

node -r esm main.js

詳細なアップデート...

2019年4月23日

ESモジュールが検出される方法を変更するために最近PRが上陸しました: https://github.com/nodejs/node/pull/26745

まだ--experimental-modulesフラグの背後にありますが、モジュールをロードする方法に大きな変更があります。

2019年1月17日

ノード11.6.0 はまだESモジュールを実験用として、フラグの後ろにリストしています。

2017年9月13日

NodeJS 8.5.0 はフラグの後ろにmjsファイルをサポートしてリリースされました:

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ファイル拡張子を使うことであると判断しました。これからの持ち帰りは:

つまり、2つのファイルfoo.jsbar.mjsがある場合、import * from 'foo'を使用するとfoo.jsはCommonJSとして処理され、import * from 'bar'bar.mjsをES6モジュールとして処理します。

そしてタイムラインに関しては...

現時点では、Node.jsがES6モジュールのサポート可能な実装の作成を開始する前に、ES6側と仮想マシン側で発生する必要がある仕様上および実装上の問題がまだいくつかあります。作業は進行中ですが、しばらく時間がかかります - 私たちは現在1年前後を見ています少なくとも

2016年10月:

Node.JSの開発者の1人が最近TC-39の会議に出席し、Node.JSの実装に対するブロッカーに関する素晴らしい記事を書きました。

https://hackernoon.com/node-js-tc-39-and-modules-a1118aecf95e

基本的なことは、次のとおりです。

  • ESモジュールは静的に分析され、CommonJSは評価されます
  • CommonJSモジュールではモンキーパッチのエクスポートが可能ですが、ESモジュールでは現在サポートされていません
  • ESモジュールとは何か、CommonJSとは何かをユーザーの入力なしに検出するのは困難ですが、彼らは試みています。
  • *.mjsは、ユーザー入力なしでESモジュールを正確に検出できない限り、最も可能性の高い解決策のようです。

- 元の回答 -

これはかなり長い間ホットポテトでした。つまり、結局、Nodeはモジュールのインポート/エクスポートのためのES2015構文をサポートするでしょう - ほとんどの場合、 モジュールのロードに関する仕様 が確定され合意されたとき)。

ここに NodeJSを支えているものの概要 があります。基本的に、新しい仕様が、主に条件付き、同期ロード、そして主に非同期のHTMLに対して機能することを確認する必要があります。

今のところ誰も確かなことを知りませんが、Nodeが動的ロードのための新しいimport/exportに加えて静的ロードのためのSystem.importをサポートすることを想像しています - それでもなおレガシーコードのためのrequireを保ちます。

これがNodeがこれを達成する方法についてのいくつかの提案です:

283
CodingIntrigue