ノード13.2.0以上
NodeJS 13.2.0はフラグなしのESモジュールをサポートするようになりました🎉ただし、実装はまだ実験的としてマークされているので、注意して本稼働で使用してください。
13.2.0でESMサポートを有効にするには、以下をに追加しますpackage.json
。
{
"type": "module"
}
すべては.js
、.mjs
(または拡張子のないファイル)ESMとして扱われます。
package.json
オプトイン全体以外にもさまざまなオプションがあり、すべて13.2.0のドキュメントで詳しく説明されています。
ノード13.1.0以下
Nodeの古いバージョンをまだ使用している人は、NodeJSのES Modules Specの本番環境に対応した実装であるesmモジュールローダーを試してみるとよいでしょう。
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
- jsonをインポートする唯一の方法
"type": "module"
- 有効にする
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を支えているものの概要を次に示します。基本的に、彼らは新しい仕様が主に条件付きの同期ロードであるNodeと、主に非同期であるHTMLでも機能することを確認する必要があります。
今のところ誰も確かなことはわかりませんが、レガシーコードを維持しながらimport/export
、NodeがSystem.import
動的ロードの新しいものに加えて静的ロードをサポートすることを想像しrequire
ます。
Nodeがこれを実現する方法に関するいくつかの提案を以下に示します。
node es2015 modules
は、上位結果の1つとしてgithub.com/nodejs/node/wiki/ES6-Module-Detection-in-Nodeが表示されます。