web-dev-qa-db-ja.com

es2015でエクスポート/インポート宣言をトップレベルにする必要があるのはなぜですか?

前回のプロジェクトでbabelでes2015を使い始めました。 import条件内でexportまたはifを実行しようとすると、エラー'import' and 'export' may only appear at the top level。私はそのための多くのケースを見ており、requireでうまく動作しますが、es2015モジュールでは動作しません。この制限の理由はありますか?

19

JavaScriptはES6モジュールの静的分析を実行します。これは、インポートまたはエクスポートを動的に実行できないことを意味します。 詳細については、この記事のセクション4.2をお読みください

モジュールの構造が静的であるということは、コンパイル時にインポートとエクスポートを(静的に)決定できることを意味します。ソースコードを見るだけで、実行する必要はありません。

このアプローチには多くの理由がありますが、そのうちのいくつかは、ソースファイルを静的に分析できる機能に依存する将来の機能のためにJavaScriptを準備することです。つまり、macrosおよびtypes(前述の記事で説明)。

別の興味深い このトピックに関する記事 言及循環依存性および高速ルックアップ理由として。

______

モジュールのネストされたブロック内でexportを実行する場合は、モジュールの記述方法を再検討し、ほぼ確実に必要ではないため、そのAPI /内部を公開します。 ES5コードのネストされたブロック内で現在requireingモジュールを使用している場合も同様です。モジュールの上部にあるrequire/importconsumeネストされたブロック内のAPI /内部を使用しないのはなぜですか?少なくとも読みやすさの観点から、このアプローチの主な利点は、require呼び出しのソースをスキャンする必要なく、モジュールの依存関係を知ることができることです。

16
sdgluck