ホット リビルド&リロードを速くし隊
MerryXmas!🎄
これはAngular Advent Calendar 2021の24日目の記事です。
いきなりですが、他のjsフレームワークからAngularに戻るとつらいな〜と思うことが3点あります。
- component/templateを再利用したりプログラマティカリーにぶん回すのがしんどい
- 儀礼的・形式的な記述が多い
- ホット リビルド&リロードが遅い
今回はこのうち3点目の「ホット リビルド&リロードが遅い」にフォーカスしてDX(DeveloperExperienceの略)を高めます。最後に参考計測値を載せますが、筆者が関わっているプロジェクトの中では素だと合計40秒前後かかるものもあります。なにかhtmlの文字列を1文字変えただけでもそうなります、つらいです。これが簡単なオプション設定を行うだけで合計6秒前後に縮まります🎉
ホット リビルド&リロードについて
この記事では、ホット リビルド&リロードとは、ng serve
して開発しているときに何かソースファイルを変更してからブラウザに反映されるまでの工程を指しています。
- hot rebuild: ソースファイルをre-compileする
- hot reload: ブラウザに通知してページをre-loadする
TIPS
いずれもng serve
のコマンドオプション、ないしはangular.json
で設定できるものです。
optimization=false
にする
- ホットリビルドを速めます。
-
angular.json
で設定できます。- 本来は
ng build
用のオプションなので、ng serve
でONにするためには"build"
の"configrations"
にserve専用のセットを用意して、"serve"
の"browserTarget"
で指定します。 - https://angular.io/guide/workspace-config#configuring-builder-targets
- 本来は
- いくつかのオプションをセットにしたお便利エイリアスです。jsやcssの最小化を辞める、cssやフォントのインライン化を辞める、ツリーシェイキングを辞めるを行います。
現時点だとAoTオプションが必須になっていますが、aotオプションをfalseにするよりもoptimizationオプションをfalseにする方が劇的に速くなります。AoTオプションはv10からデフォルトになっているようにそのままで良いと思います。ng newした素の状態からだと設定が若干大変ですが、がんばりましょう。
hmr=true
にする
- ホットリロードを速めます。
-
ng serve
とangular.json
の両方で設定できます。 - webpackのhmr(Hot Module Replacement)オプションにパスするものです。
これがないとブラウザでフルリロードが走りchromeでは一度画面が真っ白になりますが、それが無くなります。たまにコケていることがあって手動でリロードしないといけないことがある気がします。
NG_PERSISTENT_BUILD_CACHE=1
にする
- ホットリビルドを速めます。
-
ng serve
で設定できます。v13だとangular.json
の設定だけになるようです。- アドベントカレンダーの4日目でnaotaro0123さんが記事を書かれていてこちらが詳しいです。「Angular12と13でbuild cache設定は違うよ」
- ビルド結果をキャッシュします。
参考実測値
どのオプションがどれだけ威力を発揮するかの実測数値を掲載します。試行するたびにかなりブレるので、あくまでどのオプションがどの程度効くかを相対的に比較することが最大の目的です。
リポジトリの規模感
- Angular v12
-
*.component.ts
331ファイル -
*.modue.ts
71ファイル
As-Is
- ホットリビルド 30秒前後
- ホットリロード 10秒前後
合計40秒前後...
After
-
optimization=false
→ホットリビルドが6秒前後 -
hmr=true
→ホットリロードが1秒前後 -
NG_PERSISTENT_BUILD_CACHE=1
→ホットリビルドが20秒前後
3つすべて実施すると合計6秒前後です🎉
圧倒的に効くのが一つ目のoptimization=false
です。2つ目は安定。3つ目は変更内容によるものでキャッシュヒットするか次第かなという所感です。
余談
余談ですが、初めに上げた3つの辛みポイントすべてを改善してくれそうなStandalon componentのRFCが起こされています。期待しましょう!
ng-japan OnAirの解説。わかりやすいです!
Discussion