generated at
Tree Shaking
Bundlerがbundleする過程で不要なコードを取り除く
本当に利用されているコードだけを残すことで、bundle sizeを小さくする

Rollup.jsで初めて登場して、Webpackもv2から入った
その後、その周辺のbundlerには機能として含まれてるものが多い



bundler固有の話?
Dead Code Eliminationとそんな変わらない?
tree shkingはその中でも特にimpoet/export関連飲みの話ということ?
どの単位で消す?
関数レベル?
モジュールレベル?
importした上で、その関数を使っていない場合はそのimportも無視される?
JS固有の話?
webpack固有の話?
esm固有の話?
副作用は誰がどのようにして決定するのか
設定ファイルに書くにしても、開発者が手動でやるの怖すぎないか

Webpackのdocs



副作用
Webpack sideEffects
ES6 classの副作用

アプリケーション開発者の tree shaking 対応 ref
webpack を利用している場合
4 未満を利用中の場合は、 4 にアップグレードする
UglifyJS を使う場合、 pure_funcs を指定する
package.json で sideEffects を指定することを検討する
webpack、 Rollup 共通
UglifyJS を使う場合、 compress オプションに passes=3 を指定するといいことがあるかも
Babel や TypeScript のようなトランスパイラで、 ES Modules を CommonJS に変換しないよう注意する
TypeScript を使っている場合は、以下のいずれかの方法で ES6 class を tree shaking できるようにする
UglifyJS を使う場合、 /** @class */ を /*@__PURE__*/ に置換する

tree shaking概要
ざっくりした仕組みの解説
なぜrequireでは無理なのか、など
具体例
lodashを用いて実際どれぐらいのバンドルサイズの差になるのかの例



ESM で Import されないモジュールを削除する機能
webpack と terser が担ってる
rollup なら単体でできる
ライブラリの中から、importしていない関数たちを削除する漢字科
ESM を使うことにより、未使用のモジュールを検知しバンドル時に分解する
Tree Shakingではコードが消されない
案外、Tree Shakingという名前は昔からあり、1990年代のLISPにさかのぼります。
詳しそう

tree shaking対応のlibraryを作る