reactのlazy load & suspenseを試してみた
ちょっとずつしか手が出せてなかったReact.jsをニートになったのを気に学び直している
その過程でReact.lazy
とSuspense`をwebpackで試したのでそのログ
tl;dr
コード自体はここに全部おいてある
動作チェック
動かすための方法はREADME.mdに書いてあるので、そちらを参照していただくとして
実行してページを開くと一瞬「Loading...」という文字が表示され、lazyロードしたComponentが読み込まれると「Happy Birthday Nogizaka46」*1という文字が表示されます
解説
パッケージについて
基本的には上記のgithubにおいてあるコードのpackage.json
を見てもらうとして
今回dynamic importをしているので、babelでそれを扱うプラグインをインストールしている
プロジェクトコード
componentをロードするときにReact.lazy(() => import(''))
としてると、ファイルが分割されlazyロードすることができる
これで読み込んだcomponentを<Suspense>
で囲うことで、dynamic import*2が読み込まれるまではfalllback
プロパティで指定した要素(今回の場合は「Loding...」という文字列)が表示され、ロードが終わるとcomponentが普通にレンダリングされる
import React, { Suspense } from 'react' const Nogi = React.lazy(() => import(/* webpackChunkName: "Nogi" */'./Nogi')) export default function App() { return ( <div> <Suspense fallback={<div>Loading...</div>}> <Nogi /> </Suspense> </div> ) }
react-split-sample/App.js at master · yuzu-sandbox/react-split-sample · GitHub
まとめ
個人でやってるもののほんの一部に使っているだけで、Reactを仕事で使ったことがほぼなく、lazy loadが求められるほどパフォーマンスセンシティブなものを作ってないので、この対応がどこまで通用するのかはわからないがかなり簡単にコード分割が実現できるのでよかった
ただwebpackのこの辺↓と組み合わせるとどうなるのか気になるところなので、今度試したい
*1:お察しください https://twitter.com/yuzu_441/status/1098781354710294528
*2:要するにPromise