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.type
module
または_commonjs
type: "commonjs"
:
.js
CommonJSとして解析されます
- 拡張子のないエントリ ポイントのデフォルトは CommonJS です
type: "module"
:
.js
ECMAScript モジュールとして解析されます
- デフォルトでは、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.js
CommonJS として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 がこれを実現する方法について、いくつかの提案を次に示します。