Node.js は ES6 (ECMAScript 2015) モジュールのインポート/エクスポートをサポートする予定です。質問する

Node.js は ES6 (ECMAScript 2015) モジュールのインポート/エクスポートをサポートする予定です。質問する

私はインターネット中をいろいろ調べましたが、これに対する明確な答えは見つかりませんでした。

現在Node.jsはコモンJSモジュールをロードするための構文は、ECMAScript 2015 の標準モジュール構文を実際に使用したい場合は、事前にトランスパイルするか、実行時に外部モジュール ローダーを使用する必要があります。

現時点では、これら 2 つの方法のどちらも使用するかどうかはわかりません。Node.js のメンテナーは ECMAScript 2015 モジュールをサポートする予定があるのでしょうか? これについてはまったくヒントが見つかりません。

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

近い将来、Node.js がこれらのモジュールをすぐにサポートするかどうかご存知ですか?

ベストアンサー1

Node.js 13.2.0 以上

Node.js 13.2.0フラグ��なしの ES モジュールをサポートするようになりました。ただし、実装はまだ実験的なものとしてマークされているため、本番環境では注意して使用してください。

13.2.0 で ECMAScript モジュール (ESM) サポートを有効にするには、 に以下を追加しますpackage.json

{
  "type": "module"
}

すべての.js.mjs(または拡張子のないファイル) は ESM として扱われます。

package.json完全なオプトイン以外にもさまざまなオプションがあり、それらはすべて13.2.0 のドキュメント

Node.js 13.1.0 以下

[esm][3]まだ古いバージョンの Node を使用している場合は、Node.js の ES モジュール仕様の製品対応実装であるモジュール ローダーを試してみるとよいでしょう。

node -r esm main.js

詳細な更新...

2019年4月23日

ECMAScript モジュールの検出方法を変更する PR が最近公開されました。https://github.com/nodejs/node/pull/26745

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

  • package.typeまたはmodulecommonjs
    • type: "commonjs":
      • .jsは次のように解析されますコモンJS
      • 拡張子のないエントリポイントのデフォルトはCommonJSです
    • type: "module":
      • .jsECMAScriptモジュールとして解析される
      • デフォルトではJSONまたはネイティブモジュールの読み込みをサポートしていません
      • 拡張子のないエントリポイントのデフォルトはECMAScriptモジュールです
  • --type=[mode]エントリ ポイントでタイプを設定できるようにします。package.typeエントリ ポイントに対してオーバーライドされます。
  • 新しいファイル拡張子.cjs
    • これは特に、モードでの CommonJS のインポートをサポートするためのものですmodule
    • これは ECMAScript モジュール ローダーのみで、CommonJS ローダーは変更されませんが、完全なファイル パスを使用すると、拡張機能は古いローダーでも機能します。
  • --es-module-specifier-resolution=[type]
    • オプションはexplicit(デフォルト)とnode
    • デフォルトでは、ローダーはインポート時にオプションの拡張子を許可しません。モジュールのパスには拡張子が含まれている必要があります。
    • デフォルトでは、ローダーはインデックスファイルを持つディレクトリのインポートを許可しません。
    • --es-module-specifier-resolution=node開発者はCommonJS指定子解決アルゴリズムを有効にするために使用できる
    • これは「機能」ではなく、実験的な実装です。フラグが削除される前に変更される予定です。
  • --experimental-json-loader
    • JSONをインポートする唯一の方法は"type": "module"
    • 有効にすると、モードに関係なくすべてがimport 'thing.json'実験的なローダーを通過します。
    • に基づくhtml#4315 より
  • package.mainモジュールのエントリポイントを設定するために 使用できます
    • mainで使用されるファイル拡張子はモジュールの種類に基づいて解決されます

2019年1月17日

Node.js 11.6.0ES モジュールは依然として実験的なものとしてフラグ付きでリストされています。

2017年9月13日

Node.js 8.5.0フラグの背後で mjs ファイルのサポートがリリースされました:

node --experimental-modules index.mjs

このための計画は、v10.0 LTS リリースのフラグを削除することです。

--古い情報です。歴史上の目的でここに保存されています--

2017年9月8日

Node.js マスター ブランチが更新され、ESM モジュールの初期サポートが追加されました。https://github.com/nodejs/node/commit/c8a389e19f172edbada83f59944cad7cc802d9d5

これは最新のナイトリーで利用可能になるはずです(これはnvm経由でインストール既存のインストールと並行して実行します):https://nodejs.org/download/nightly/

そして、--experimental-modulesフラグの背後で有効になっています:

パッケージ.json

{
  "name": "testing-mjs",
  "version": "1.0.0",
  "description": "",
  "main": "index.mjs" <-- Set this to be an mjs file
}

次に以下を実行します:

node --experimental-modules .

2017年2月:

Node.js の ES6 モジュールのアップデート

Node.js の開発者たちは、ファイル拡張子を使用するのが最も良い.mjs解決策であると判断しました。このことからわかることは、次のとおりです。

つまり、2つのファイルfoo.jsとが与えられた場合bar.mjs、 はCommonJSとしてimport * from 'foo'扱い、 はES6モジュールとして扱います。foo.jsimport * from 'bar'bar.mjs

タイムラインについては...

現時点では、Node.js が ES6 モジュールのサポート可能な実装に取り​​掛かる前に、ES6 と仮想マシン側で解決する必要がある仕様と実装の問題がまだいくつかあります。作業は進行中ですが、時間がかかるでしょう。現時点では少なくとも1 年ほどかかると見込んでいます。

2016年10月:

Node.js の開発者の 1 人が最近 TC-39 会議に出席し、Node.js の実装を阻害する要因に関する優れた記事を書きました。

Node.js、TC-39、モジュール

そこから得られる基本的な教訓は次のとおりです。

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

-- 元の回答 --

これはかなり長い間議論されてきた問題です。結論としては、Node.jsは最終的にES2015モジュールのインポート/エクスポートの構文 - おそらく、モジュールのロード仕様最終決定され、合意されます。

ここは良い概要Node.js の進捗を妨げている原因について。基本的に、新しい仕様が、主に条件付きで同期的にロードする Node.js と、主に非同期的にロードする HTML の両方で機能することを確認する必要があります。

現時点では誰も確実には知りませんが、Node.js は新しい動的読み込みimport/exportに加えて静的読み込みもサポートし、レガシーコードも維持するだろうと私は想像しています。System.importrequire

Node がこれを実現する方法についてのいくつかの提案を次に示します。

おすすめ記事