前回のプロジェクトでbabelでes2015を使い始めました。 import
条件内でexport
またはif
を実行しようとすると、エラー'import' and 'export' may only appear at the top level
。私はそのための多くのケースを見ており、require
でうまく動作しますが、es2015モジュールでは動作しません。この制限の理由はありますか?
JavaScriptはES6モジュールの静的分析を実行します。これは、インポートまたはエクスポートを動的に実行できないことを意味します。 詳細については、この記事のセクション4.2をお読みください :
モジュールの構造が静的であるということは、コンパイル時にインポートとエクスポートを(静的に)決定できることを意味します。ソースコードを見るだけで、実行する必要はありません。
このアプローチには多くの理由がありますが、そのうちのいくつかは、ソースファイルを静的に分析できる機能に依存する将来の機能のためにJavaScriptを準備することです。つまり、macrosおよびtypes(前述の記事で説明)。
別の興味深い このトピックに関する記事 言及循環依存性および高速ルックアップ理由として。
______
モジュールのネストされたブロック内でexport
を実行する場合は、モジュールの記述方法を再検討し、ほぼ確実に必要ではないため、そのAPI /内部を公開します。 ES5コードのネストされたブロック内で現在require
ingモジュールを使用している場合も同様です。モジュールの上部にあるrequire
/import
とconsumeネストされたブロック内のAPI /内部を使用しないのはなぜですか?少なくとも読みやすさの観点から、このアプローチの主な利点は、require
呼び出しのソースをスキャンする必要なく、モジュールの依存関係を知ることができることです。