質問: nodejsはインポート/エクスポートes6(es2015)モジュールをサポートする予定です 私はこれに対する明確な答えなしにインターネット中を見てきました。現在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として解析されます 拡張子なしのエントリポイントのデフォルトは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 "type": "module"のときにjsonをインポートする唯一の方法 すべてのimport 'thing.json'を有効にすると、モードに依存しない実験的なローダーを通過します。 _(whatwg/html#4315 に基づく) package.mainを使ってモジュールのエントリポイントを設定することができます 。 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 基本的なことは、次のとおりです。 esモジュールは静的に分析され、commonjsは評価されます commonjsモジュールではモンキーパッチのエクスポートが可能ですが、esモジュールでは現在サポートされていません esモジュールとは何か、commonjsとは何かをユーザーの入力なしに検出するのは困難ですが、彼らは試みています。 *.mjsは、ユーザー入力なしでesモジュールを正確に検出できない限り、最も可能性の高い解決策のようです。 - 元の回答 -これはかなり長い間ホットポテトでした。つまり、結局、nodeはモジュールのインポート/エクスポートのためのes2015構文をサポートするでしょう - ほとんどの場合、 モジュールのロードに関する仕様 が確定され合意されたとき)。ここに nodejsを支えているものの概要 があります。基本的に、新しい仕様が、主に条件付き、同期ロード、そして主に非同期のhtmlに対して機能することを確認する必要があります。今のところ誰も確かなことを知りませんが、nodeが動的ロードのための新しいimport/exportに加えて静的ロードのためのsystem.importをサポートすることを想像しています - それでもなおレガシーコードのためのrequireを保ちます。これがnodeがこれを達成する方法についてのいくつかの提案です: .jsを守るために .mjsモジュール