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

[解決済み】Node.jsのrequireとES6のimport/exportを使い分ける。

2022-03-23 03:23:33

質問

私が共同研究しているプロジェクトで、どのモジュールシステムを使うか、2つの選択肢があります。

  1. を使用してモジュールをインポートします。 require を使用し、エクスポートは module.exportsexports.foo .
  2. ES6を使ったモジュールのインポート import およびES6を使用したエクスポート export

一方を使用することでパフォーマンス上の利点はありますか?また、NodeのモジュールではなくES6のモジュールを使用する場合、他に知っておくべきことはありますか?

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

更新情報

Node v12(2019年4月)以降、ESモジュールのサポートがデフォルトで有効になり、Node v15(2020年10月)以降、安定しています(参考:Node v15 こちら ). ノードモジュールを含むファイルの末尾は .mjs または最も近い package.json ファイルには "type": "module" . その ノードのドキュメント には、CommonJSとESモジュールの相互運用に関する、より多くの情報があります。

パフォーマンス面では、新しい機能が既存の機能ほど最適化されていない可能性が常にあります。しかし、モジュールファイルは一度しか評価されないので、パフォーマンス面はおそらく無視できます。結局のところ、いずれにせよ明確な答えを得るためには、ベンチマークを実行する必要があるのです。

ESモジュールは import() 関数を使用します。とは異なり require これはプロミスを返します。


前回の回答
<ブロッククオート

一方を使用することでパフォーマンス上の利点はありますか?

ES6モジュールをネイティブにサポートするJavaScriptエンジンがまだ存在しないことを念頭に置いてください。Babelを使用しているとご自身でおっしゃっていましたね。Babelは以下のように変換します。 importexport の宣言を CommonJS ( require / module.exports ) をデフォルトで使用します。ですから、たとえES6モジュール構文を使ったとしても、Nodeでコードを実行すれば、ボンネットの下でCommonJSを使うことになります。

CommonJSとES6モジュールには技術的な違いがあり、例えばCommonJSではモジュールを動的にロードすることができます。ES6ではこれができない。 しかし、そのためのAPIが開発されています .

ES6モジュールは標準の一部なので、私ならそれを使いますね。