type="module" のスクリプトは、async も defer も付けないとき、文書のパースが終わってから評価されます。クラシック script に defer を付けたときと同じです。ダウンロード完了次第、出現順を無視して実行されるわけではありません。
そのため module に defer を付けても効果はありません。既定で遅延しているためです。async を付けると、依存関係の取得も含めて準備ができ次第実行され、出現順の保証は弱くなります。
クラシック script の既定(async / defer / type="module" なし)はパーサブロッキングです。取得・実行が終わるまで HTML のパースが止まります。module の既定挙動とは違います。
参考文献
- HTML script element - MDN —
type=moduleは処理が deferred、deferは module に効果なし - JavaScript modules - MDN — module の読み込みと実行モデル