チャンピオン: ダニエル・エーレンバーグ (
ブルームバーグ)、ニコロ・リバウド (イガリア、パートナーシップ) eyeo と Bloomberg)
ステージ 1
JavaScript モジュール宣言 (以前は「モジュール フラグメント」と呼ばれていました) は、名前付き、インラインの構文です。 JS モジュールは、モジュールのペアを 1 つの JavaScript ファイルにバンドルするための古いものである可能性があります。
JavaScript 開発者は通常、かなり多くの細かいモジュールでコードを記述し、ソース構造として ECMAScript モジュール (ESM、ES6/ES2015 で提示) の採用率が高いです。 それにもかかわらず、多くの小さなファイルは、インターネット、サーバー、またはその他の環境上にあるかどうかにかかわらず、読み込み効率の配置によって高く評価されています。 このため、開発者は「バンドル」と呼ばれるツールを使用して、1 つ (またはペア) のスクリプトまたはモジュールで多数の ES モジュールをエミュレートします。 いくつかの例は、webpack、 です。 ロールアップ、パーセル、
の必要性ESモジュールのセマンティクスを完全に仮想化するためのバンドラーは、実装にある種の複雑さを追加し、この指定は時間の経過とともに増加し、現代のモジュールの側面は 上段待ち。 また、エンジンは仮想化されたコードを介して動作する必要があり、以前のモジュール構造を凝視しなくなるため、ランタイム効率の調整によって指定されます。 説明すると、モジュールは並列バイトコード生成用のコードを分割する便利なディスプレイ シュラウドになる可能性がありますが、バンドラーが 1 つの巨大なスクリプトまたはモジュールですべてのことを達成する場合、この構造はもはや JS エンジンに見える危険なしにはなりません。 .
resource bundles は、開発者が説明で適切な JavaScript よりも余分なものを組み合わせる必要があることに起因する、JS で最も優れたバンドルの設計図よりも優先されます。 調達段階のリソースの実装には、写真、WebAssembly、および CSS のためだけのオーバーヘッドが発生することが予想されます。 それにもかかわらず、JavaScript は他のリソースよりもモジュールの優先度が非常に高くなる傾向があるため、特定の動機を持つ JS の最高の構造は、コミュニティの段階よりも合理的にモジュールの段階で非常に安価に結びつく可能性があります.
この提案は、JavaScript に構文を追加して、1 つのファイルで多数の JavaScript モジュールを有効にします。 この構造は、バンドラーによる出力としては古いものである可能性が高く、実行時のオーバーヘッドが低いため、バンドラーはもはや強力にエミュレートする必要がなくなり、JS エンジンは何が起こっているかを監視できます。 または、JavaScript 開発者が直接入力することはおそらく有用ではなく、既存のワークフローと比較してオーバーヘッドが少ない可能性があります.
} 輸出
モジュール
大文字
(
{
戻る 弦
.
to大文字
)(
); } } 輸入 { カウント
countModule;ログ(カウント輸入 {大文字} から
uppercaseModule; コンソール.
()
;// 1 コンソール.ログ
( 大文字
(「ダニエル」)); // "ダニエル"このモジュールは、一対のモジュール宣言を含み、スクリプトの手法によって HTML ファイルから参照されます。印象づける:
" dir="auto"><脚本 タイプ=モジュール
src
">
script>
モジュール宣言、エクスポートされた場合、それらが概説されているファイルの出入り口の外にある可能性が高いでしょう.
<脚本 タイプ=モジュール
> 輸入{ 大文字モジュール } から"./app.js"輸入 { 大文字;
}から 大文字モジュール
;コンソール
.ログ (大文字
("特定"
)
);
// "はい" script>ザ・countModule モジュールは、これ以上エクスポートされず、この種の古いものにすることはできません.
ModuleDeclaration は、モジュールの最上段に存在できる現代の非終端記号であるタックル 輸入
およびexport
: … ModuleDeclaration ScriptItem: … ModuleDeclaration ModuleDeclaration : モジュール [no LineTerminator here] 識別子 { ModuleBody? }”>
ModuleItem: ... ModuleDeclaration
ScriptItem : ... ModuleDeclaration
ModuleDeclaration : モジュール [no LineTerminator here] 識別子 { ModuleBody? }
モジュール宣言は、代替モジュール宣言の内部にネストされている可能性があります.
- モジュール宣言も静的にインポートされる可能性が高いでしょう.
// https://example.com/xyz.js
モジュール モッド { コンソール. ログ
(輸入.
メタ
.
URL);}
輸入 モッド;上記のコードはログに記録します
https://example.com/xyz.js .
モジュール宣言内の相対モジュール指定子は、あたかも外部モジュール。 この行為は、
現代のURL(moduleSpecifier, import.meta.url)
.この行為は に対して提案されたセマンティクスに従います) モジュール式.
大胆に サーバーが危険を冒さずに URL を再マップできるようにするため、バンドリングが古い可能性が高い可能性について 、考慮事項を表明しました 。 監視を遮断するためのプライバシー戦術、およびその他の多くの戦術を導入します。 この提案は、インターネット バンドルよりもはるかに表現力が低いため、これらの問題はそれほど大きな脅威ではありません:
JS モジュール バンドルは、適切な同一基盤に制限されます。 JS を使用しているため、一般的なバンドラーが webpack とロールアップに取り組むことで現在達成されているものと範囲が類似しており、余分な活力を追加することはありません。 宣言識別子をローテーション/フローすることは間違いありませんが、多くのモジュール宣言を 1 つの単位として含む外部モジュール全体を処理することは、非常に低い指定であり、明確なマテリアル ブロッカーがそのすべてまたはまったく両方に焦点を合わせているためです。
Mozilla の Martin Thompson は、リソースの ID を正確に指定する URL に完全に基づくバンドリング スキームを好むことを明確に述べています。 モジュール宣言を直接ロードすることはできなくなりましたが、外側のモジュールを介して最も細かく、外側のモジュールはその URL によってフェッチされるため、識別が明確に表現されます。 (TODO: MT で確認)