私はこれに対する明確な答えなしにインターネット中を見てきました。
現在NodeJSはモジュールをロードするためにCommonJS構文のみを使用しています、そしてもしあなたが本当に標準のES2015モジュール構文を使いたいのなら、あなたはそれを前もってコンパイルするか、あるいは実行時に外部モジュールローダーを使わなければなりません。
現在、私はこれら2つの方法のどちらかを使用することはあまりポジティブではありません、NodeJSメンテナはES2015モジュールをサポートすることさえ計画しているのですか?これについてはまったくヒントが見つかりません。
現時点でNodeJS 6.xはES2015機能の96%をサポートすると主張していますが、モジュールへの言及はありません( NodeJS ES2105サポートリンク )。
近い将来、NodeJSがすぐにこれらのモジュールをサポートするかどうか知っていますか?
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
フラグの背後にありますが、モジュールをロードする方法に大きな変更があります。
package.type
はmodule
またはcommonjs
のいずれかです。type: "commonjs"
:.js
はcommonjsとして解析されますtype: "module":
.js
はesmとして解析されます--type=[mode]
。エントリポイントのpackage.type
をオーバーライドします。.cjs
。module
モードでcommonjsをインポートすることをサポートするためです。--es-module-specifier-resolution=[type]
explicit
デフォルト)とnode
です。--es-module-specifier-resolution=node
を使ってcommonjs指定子解決アルゴリズムを有効にすることができます--experimental-json-loader
"type": "module"
のときにjsonをインポートする唯一の方法import 'thing.json'
を有効にすると、モードに依存しない実験的なローダーを通過します。package.main
を使ってモジュールのエントリポイントを設定することができます。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.js
とbar.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
基本的なことは、次のとおりです。
*.mjs
は、ユーザー入力なしでESモジュールを正確に検出できない限り、最も可能性の高い解決策のようです。- 元の回答 -
これはかなり長い間ホットポテトでした。つまり、結局、Nodeはモジュールのインポート/エクスポートのためのES2015構文をサポートするでしょう - ほとんどの場合、 モジュールのロードに関する仕様 が確定され合意されたとき)。
ここに NodeJSを支えているものの概要 があります。基本的に、新しい仕様が、主に条件付き、同期ロード、そして主に非同期のHTMLに対して機能することを確認する必要があります。
今のところ誰も確かなことを知りませんが、Nodeが動的ロードのための新しいimport/export
に加えて静的ロードのためのSystem.import
をサポートすることを想像しています - それでもなおレガシーコードのためのrequire
を保ちます。
これがNodeがこれを達成する方法についてのいくつかの提案です: