287

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

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

Node.js のメンテナーは ECMAScript 2015 モジュールのサポートを計画しているのでしょうか? これについてのヒントはまったく見つかりませんでした。

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

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

4

1 に答える 1

322

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 以下

Node の古いバージョンをまだ使用している人[esm][3]は、Node.js の ES Modules Specificationaiton の本番環境対応の実装であるモジュール ローダーを試してみることをお勧めします。

node -r esm main.js

詳細な更新...

2019年4月23日

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

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

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

2019年1月17日

Node.js 11.6.0では、ES モジュールはまだ実験的であり、フラグの後ろにリストされています。

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、 usingimport * from 'foo'foo.jsCommonJS としてimport * from 'bar' 扱わbar.mjsれ、 は ES6 モジュールとして扱われます

そして時系列については…

現時点では、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.importは維持されます。require

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

于 2016-05-10T08:07:58.283 に答える