0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

prodビルドはイベント名も節約

Last updated at Posted at 2018-09-13

事象

angularでページ遷移時に子画面にバインドしてるオブジェクトを更新し、描画を更新したい。
ところが、ローカル実行時や--aotビルドした時は問題なく動くが、--prodビルドした時だけ動かない。

原因

処理の実行判定を、イベントオブジェクトのコンストラクタ名で行っていたため。
最適化によって、イベントオブジェクトの中身も削減されるようだ。


this.router.events.subscribe(event => {
  // ひとまずイベントが発生してるか確かめる
  console.log(event.constructor.name);
  
  if (event.constructor.name === 'NavigationEnd') {
    ... // 画面にバインドしてるオブジェクトを更新
    console.log('base navEnd');
  }
});

↓↓↓

ng serve(local)

image.png

--prod

image.png

えっ…省略されすぎじゃね…?
数を合計してみたところ、発生イベントそのものは変化してなさそう。
こんなところまで最適化してくれるんだね。すげー。

対応

まあ、そもそもイベント名をハードコードしてる実装がイケてないわけでして。


this.router.events.subscribe(event => {
  // ひとまずイベントが発生してるか確かめる
  console.log(event.constructor.name);
  
  if (event instanceof NavigationEnd) {
    ... // 画面にバインドしてるオブジェクトを更新
    console.log('base navEnd');
  }
});

↓↓↓

image.png

やったー!直ったー!

このハードコード判定ロジック、あちこちのクラスに判子コピーされてるから
直すとこ他にもいっぱいあるんやけどね…:scream:

おわりに

誰がこんな実装して、そんでコードレビュー通ったのかわからんけど
実装のやり方次第で、後から問題が発覚するケースもあるんだなぁ、と。

僕なら、共通クラス作ってまとめてると思う。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?