1. ホーム
  2. ジャバスクリプト

[解決済み】Node.jsがES6(ECMAScript 2015)モジュールのインポート/エクスポートに対応予定

2022-04-19 02:49:56

質問

ネットで調べても明確な答えがない。

現在、Node.jsが使用しているのは 共通JS の構文でモジュールを読み込むことができ、どうしても ECMAScript 2015 標準のモジュール構文を使用したい場合は、事前にトランスパイルするか、実行時に外部モジュールローダーを使用する必要があります。

現状ではこの2つの方法のどちらを使ってもあまり積極的ではないのですが、Node.jsのメンテナはECMAScript 2015のモジュールをサポートする予定でもあるのでしょうか、それともないのでしょうか。これに関するヒントを全く見つけていません。

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

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

どのように解決するのですか?

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 Specificaiton を実装したもので、製品化されています。

node -r esm main.js

詳細な更新情報...

2019年4月23日(木

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

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

  • package.type のどちらかです。 module または commonjs
    • type: "commonjs" :
      • .js は次のようにパースされます。 コモンJS
      • 拡張機能を持たないエントリポイントのデフォルトは CommonJS です。
    • type: "module" :
      • .js は ECMAScript モジュールとしてパースされます。
      • は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' は、モードとは無関係に実験的ローダーを通過します。
    • に基づいています。 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 リリースでフラグを削除する予定です。

--Outdated Information. 歴史的な目的のためにここに保管されている--。

2017年9月8日(木

Node.js masterブランチが更新され、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.jsbar.mjs を使用しています。 import * from 'foo'foo.js をCommonJSとして使用する一方 import * from 'bar'bar.mjs ES6 モジュールとして

そして、タイムラインについては......。

現時点では、まだ多くの ES6 の仕様と実装の問題を解決しなければなりません。 Node.jsは、Node.jsを開始する前に、仮想マシン側で ES6モジュールのサポート可能な実装に取り組んでいます。現在、作業中です。 進行中ですが、しばらく時間がかかりそうです。 1年程度 少なくとも .

2016年10月

Node.jsの開発者の一人が最近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がこれを実現する方法について、いくつかの提案をしています。