【つりーしぇいきんぐ】

Tree Shaking とは?

💡 「使わない枝」を振り落とす
📌 このページのポイント
ツリーシェイキング — 使わないコードを振り落とす シェイク前 app moduleA moduleB moduleC funcX funcA funcB funcC 振り落とす シェイク後 app moduleA moduleB funcA funcC 500KB(全コード含む) 200KB 未使用コードを除去してバンドルサイズを削減
ツリーシェイキングのイメージ
ひよこ ひよこ

具体的にどういう効果があるの?

ペンギン先生 ペンギン先生

例えばlodashライブラリ全体は約70KBだけど、_.uniqと_.groupByしか使っていないなら、Tree Shakingで使っている関数だけが残って数KBに削減される。date-fnsやMaterial UIなど、大きなライブラリほど効果が大きいよ

ひよこ ひよこ

なぜES Modulesじゃないと効かないの?

ペンギン先生 ペンギン先生

ES Modules(import/export)は静的に解析できる。つまりコードを実行しなくても「何がインポートされているか」がわかる。CommonJS(require)は動的で、実行時に条件分岐でrequireする書き方ができるから、ビルド時にどのコードが使われるか判断できないんだよ

ひよこ ひよこ

Tree Shakingを効かせるコツは?

ペンギン先生 ペンギン先生

①package.jsonに"sideEffects": falseを設定(副作用のないモジュールと明示)、②名前付きインポートを使う(import { map } from 'lodash-es')。デフォルトインポートだと効きにくい、③バレルファイル(index.tsで全exportをまとめる)に注意。再エクスポートが多いと効きが悪くなることがあるよ

ひよこ ひよこ

sideEffectsって何?

ペンギン先生 ペンギン先生

モジュールインポートするだけで何か影響がある(グローバル変数を変更する、CSSを読み込むなど)ことを副作用(side effects)という。"sideEffects": falseはバンドラーに「このパッケージのモジュール副作用がないから、未使用ならバンドルから安全に除去していいよ」と伝える設定。CSSファイルなど副作用があるものは"sideEffects": ["*.css"]と個別指定するよ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「Tree Shaking」って出てきたら「使っていないコードをバンドルから除去する最適化」と思えればだいたいOK!
📖 おまけ:英語の意味
「Tree Shaking」 = 木を揺する
💬 依存関係のツリー(木)をShake(揺する)と、使われていない枝(コード)が落ちる、というイメージだよ
← 用語集にもどる