ShopOne / Shitforces

くそなぞなぞコンテストサイト
shitforces.vercel.app
MIT License
27 stars 13 forks source link

[Frontend]lazy loadによるコード分割 #202

Closed no-yan closed 3 years ago

no-yan commented 3 years ago

コード分割

各ページのスクリプトを、リンクをユーザーがクリックしたタイミングで取得するよう変更しました。これにより、はじめに配信されるJavaScriptのサイズが300kbから220kbに削減できました。

React.lazyとSuspenseの機能を使ってコード分割を実現しています(正確にはこうするとwebpackが勝手に分割してくれる)。 <Suspense fallback="">のfallbackを指定することでロード中の画面を指定することが出来ますが今は手抜きです。

デフォルトインポート

React.lazyがnamed import import {hoge} from 'hoge' に未対応なので、必要な部分をデフォルトインポートに変更しました


不要なimport React from 'react'を削除

Reactはv17からJSXの変換にReact.createElementを使わなくなり、それに伴ってReactのimportが必要なくなりました https://ja.reactjs.org/blog/2020/09/22/introducing-the-new-jsx-transform.html


eslintを更新

Eslint側が新しいjsx変換法にデフォルトで対応していないので設定を変更しました。 https://ja.reactjs.org/blog/2020/09/22/introducing-the-new-jsx-transform.html#eslint おそらくこの変更の影響でprettierの動作がちょっと変わってしまい、app.tsxのコンポーネント内がシングルクォートからダブルクォートになってます。

React.FCをVFCに変更

React.FCは型定義でchildrenを定義しているので、VFCに変更しました。 (そこまで大きな問題点ではないですが)なにが問題になるかというと、childrenを持たないはずのコンポーネントのPropsにchildrenをもたせてもエラーが出ないことです。 もしFC型を使いながらchildrenが入るとエラーを出したいなら、type Props = {children: never;}とする必要があります。 VFCはchildrenが定義されていないReact.FCです。FCと全く同じ感覚で使うことができ、上記の点に関してエラーを出してくれます。 別にVFCを使えと強制するものではないです。

追記

当たり前かもですが、実験してみるとimport React from 'react'は消す前と消したあとでビルドサイズが変わりませんでした。デットコード削減だと思うので、今後は気にせずReact.FCとか使います。