Kodokon kodokon.com

ES モジュール: import/export、プロジェクトの構成

ES モジュールの静的解析を活用し、有害なバレルと循環依存を避けることで、プロジェクトを構造化しましょう。

8 分 · 3 問

このレッスンを Kodokon で開く

ES モジュールは 静的 です。importexport 文は、コードが実行される前、ファイルが解析される時点で解決されます。これこそが ツリーシェイキング(決して import されないコードの除去)を可能にし、命名の誤りをビルド時に捕捉できるようにするものです。名前付きエクスポートか、デフォルトエクスポートか? ほぼあらゆる面で名前付きエクスポートに軍配が上がります。リファクタしやすい名前変更、信頼できる自動補完、そして同じものを10通りの別名で import する余地がないこと。デフォルトは、モジュールが 1つ の明白なものをエクスポートする場合のために取っておきましょう。

JAVASCRIPT
export const TAX_RATE = 0.2;

export function applyTax(price) {
  return price * (1 + TAX_RATE);
}

export default class Cart {
  items = [];
  add(item) {
    this.items.push(item);
    return this;
  }
}
cart.js: ユーティリティには名前付きエクスポート、中心となるクラスにはデフォルト。

消費する側には4つの形式があります。名前付き import(as による任意の別名付けあり)、デフォルト import、名前空間 import(* as)、そして名前空間の Promise を返す 動的 import import() です。最後のものは コード分割 の構成要素です。重いモジュール(エディタ、チャート、PDF)を、ユーザーが実際に必要とする瞬間にのみ読み込みます。

JAVASCRIPT
import Cart, { applyTax, TAX_RATE } from "./cart.js";
import * as cartModule from "./cart.js";

console.log(applyTax(100), TAX_RATE); // 120 0.2
console.log(cartModule.TAX_RATE); // 0.2

const lazy = await import("./cart.js");
const cart = new lazy.default();
console.log(cart instanceof Cart); // true
同じモジュールの静的な形式と動的な import。

構成については、技術的な種類別(controllers/helpers/)よりも 機能別features/cart/features/auth/)に分割することを好みましょう。一緒に変わるコードは一緒に置かれ、機能を取り除くことは1つのフォルダを削除することを意味します。各機能を狭い入口を通して公開し、その入口を迂回するあらゆる import を境界違反として扱いましょう。

理解度チェック

このレッスンの要点をしっかり覚えているか確認しましょう。

  1. ES モジュールでツリーシェイキングを可能にするものは何ですか?
    • バンドラが、何が使われているかを見るためにコードを実行する
    • import と export が静的であり、コードを実行せずに解析できる
    • ES モジュールがデッドコードを自動的に圧縮する
  2. import("./module.js") は何を返しますか?
    • モジュールの名前空間を、同期的に
    • モジュールの名前空間で解決される Promise
    • 呼び出されたときにモジュールを読み込む関数
    • モジュールのデフォルトエクスポートだけ
  3. バレルファイル(フォルダ全体を再エクスポートする index)の主なリスクは何ですか?
    • 名前付きエクスポートを不可能にする
    • たった1つの import のためにフォルダ全体を読み込むことがあり、ツリーシェイキングを妨げる
    • フォルダの動的 import を妨げる