[解決済み】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がこれらのモジュールをすぐにサポートするかどうか、ご存知ですか?
どのように解決するのですか?
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 ローダーはそのままですが、フルファイルパスを使用すれば、古いローダーでも拡張機能は動作します。
-
これは特に、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
-
の場合、JSONをインポートする唯一の方法です。
-
を使用することができます。
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の人たちは、このたび
最も悪い
の解決策は
.mjs
ファイルの拡張子です。ここから得られるものは
言い換えれば、2つのファイル
foo.js
とbar.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の実装に対するブロッカーについて素晴らしい記事を書き上げました。
そこから得られる基本的なことは
- ECMAScriptのモジュールは静的解析、CommonJSは評価
- CommonJSモジュールはモンキーパッチのエクスポートが可能であるが、ECMAScriptモジュールは現在のところ不可能である
- 何がECMAScriptモジュールで何がCommonJSなのか、何らかのユーザー入力がないと判別が難しいのですが、試行錯誤しているようです。
-
*.mjs
が最も可能性の高い解決策だと思いますが、ユーザー入力なしでECMAScriptモジュールを正確に検出できるのであれば話は別です。
-- オリジナル回答
これはかなり以前からホットポテトになっています。結論から言うと、Node.js は最終的に ES2015 構文でモジュールのインポート/エクスポートができるようになります。 モジュールをロードするための仕様 が確定し、合意された。
以下は 良い概要 Node.jsを妨げている要因について。基本的には、条件付き同期ロードを主とするNode.jsと、非同期ロードを主とするHTMLで、新しい仕様が機能することを確認する必要があるのです。
今現在、確かなことは誰も知らないが、Node.jsがサポートするのは
import/export
に加えて、静的ローディングのための新しい
System.import
は動的ロードのために使用されます。
require
レガシーコード用
Nodeがこれを実現する方法について、いくつかの提案をしています。
関連
-
[解決済み】Heroku:ノードアプリで「このアプリにはデフォルトの言語が検出されませんでした」エラーがスローされる
-
[解決済み】webpack-dev-serverにリモート接続すると、「Invalid Host header」というメッセージが表示されます。
-
[解決済み】XMLパースエラー:ルート要素が見つからない コンソールの場所 FF
-
[解決済み】DOMException: サポートされているソースが見つからなかったため、読み込みに失敗しました。
-
[解決済み] Node.jsのnpmモジュールをアンインストールするにはどうすればよいですか?
-
[解決済み] ES6インポートで中括弧を使用するのはどのような場合ですか?
-
[解決済み] Node.js - SyntaxError: 予期しないトークンのインポート
-
[解決済み] Node.jsとES6におけるmodule.exportsとexport defaultの比較
-
[解決済み】Node.jsのrequireとES6のimport/exportを使い分ける。
-
[解決済み】ES6での`export const`と`export default`の比較
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Uncaught ReferenceError: angular is not defined - AngularJSが動作しない。
-
[解決済み】JavaScriptのgetElementByNameが機能しない
-
[解決済み】BootstrapのCollapseが折りたたまれない
-
[解決済み】WebpackとBabelで「このファイルタイプを扱うには適切なローダーが必要な場合があります。
-
[解決済み】Reactのeslintエラーはpropsの検証で見つからない
-
[解決済み】getElementByIdはnullを返す?[クローズド]
-
[解決済み】React-Routerの子が1つしかない。
-
[解決済み】JavaScriptで相対URLへのリダイレクトを行う
-
[解決済み】このオブジェクトの "forEach "はなぜ関数でないのですか?
-
[解決済み】Babel NodeJS ES6: SyntaxError: 予期しないトークンのエクスポート