web-dev-qa-db-ja.com

ES6の `import`構文では、モジュールはどのように正確に評価されますか?

ABCDの4つのモジュールがあるとします。

モジュールA

console.log("A evaluated")
function AClass {
  console.log("A constructor")
}
var aObj = new AClass()
export default aObj;

モジュールB

import aObj from A
export default "B"

モジュールC

import aObj from A
export default "C"

モジュールD

import b from B
import c from C
import aObj from A

では、モジュールDが評価されると、A evaluatedA constructorはコンソールに何回出力されますか?

この動作はES6標準で説明されていますか?直接または間接的にインポートされた回数に関係なく、モジュールを1回だけ評価したい場合はどうすればよいですか?誰かがこれについて何か考えがありますか?

30
Hanfei Sun

Dモジュールが実行されると、コンソールは次のメッセージを出力します。

A evaluated
A constructor

つまり、Aモジュールは、他のモジュールによって複数回インポートされた場合でも、一度だけ評価されました。

ES6 modulesの評価ルールは、commonjs形式の場合と同じです。

  • モジュールは、ロードされると実行されるコードの一部です。これは、モジュールがメインバンドルに含まれていない場合、評価されないことを意味します
  • モジュールはシングルトンです。モジュールが複数回インポートされた場合、そのモジュールのinstanceは1つだけ存在し、ロード時に1回だけ評価されます。

モジュールの同じインスタンスをインポートするの動作について説明します HostResolveImportedModule ECMAScript6仕様のセクション。
それは言及します:

この操作(インポート操作)は、正常に完了する場合はべき等である必要があります。特定のreferencingModule、指定子ペア(import <a> from <source>)を引数として呼び出すたびに、同じModuleRecordインスタンスを返す必要があります。

モジュールのシングルタイム評価の動作は、 ModuleEvaluation 、ポイント4および5でEvaluatedブールフラグを使用して説明されています。
各モジュールにはEvaluatedフラグがあり、モジュールコードを1回だけ評価するようになっています。

26
Dmitri Pavlutin