A
、B
、C
、D
の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 evaluated
とA constructor
はコンソールに何回出力されますか?
この動作はES6標準で説明されていますか?直接または間接的にインポートされた回数に関係なく、モジュールを1回だけ評価したい場合はどうすればよいですか?誰かがこれについて何か考えがありますか?
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回だけ評価するようになっています。