Redirected: You are redirected from
/GROWI勉強会/20201005/TS/Next.js/SWR化
.Functional Component 化
- hooks を使えるようにするには必須
- 大変そうであれば、とりあえずラップするだけでも意味はある
ラッピング例:
class MyComponentSubstance extends React.Component { ... } const MyComponent = (props) => { const { t } = useTranslation(); ... return ( <MyComponentSubstance {...props} t={t} /> ); }; export default MyComponent;
TypeScript 化
- やらなくても動くけどやる
- js は動かすまで正常動作するかどうかがわからない
const result = axios.get(...); const { pages } = result; pages.forEach(page => ...);
- TS なら書いている途中で動かないことがわかる
- js は動かすまで正常動作するかどうかがわからない
📝 簡単に SSR とか CSR とか SPA とか
- HTTP
- 1req - 1res
- MVCフレームワーク
- 1req - 1res(w/ HTML)
- ページ遷移も 1req - 1res(w/ HTML)
- jquery や部分的な React 化されたシステム
- 1req - 1res(w/ HTML) の後、CSR
- CSR = DOM操作したり shadow DOM 使ってコンポーネントレンダリングしたり
- ページ遷移も 1req - 1res(w/ HTML)
- レンダリングの度に js 初期化が走る
- 1req - 1res(w/ HTML) の後、CSR
- SPA
- 1req - 1res(w/ HTML) の後、CSR
- 「ページ遷移」は擬似的
- js がページ遷移したかのように見せる
- 必ずしも HTTP req は発生しない
- SSR
- 1req - 1res(w/ HTML and Server-Side-Redered Component) の後、CSR]
- CSR 時は、SSR されたコンポーネントとの突合も行う
- 1req - 1res(w/ HTML and Server-Side-Redered Component) の後、CSR]
- SSR するが SPA ではないシステム
- GROWI.cloud はこれ
- React Router に触りたくなかった
- GROWI もこれになる
- GROWI.cloud はこれ
📝 なぜ SPA にしないのか
- GROWI では「一般ユーザー向けページ」と「管理者ユーザー向けページ」を SPA に統合する必要がない
- 同様にログインページや
/me
など特殊なページに関しても同様のことが言える
- 同様にログインページや
📝 Optimization for js/css
- Optimize とは
- js ファイルの分割、minify, uglify
- css ファイルの分割、minify, uglify
- 適切なページで適切なアセットをロードする必要がある
- Next.js を使わなかったら…
- Next.js での考え方
- https://nextjs.org/blog/next-9-2 external_link
- Next.js の人達が職人芸をやってくれていることを信じよう
- もし Next.js を使わないなら?
- 上記のようなことをどのフレームワークがやってくれるのかを意識する
- よしなにやってくれるフレームワークを使っていなければ、自身で検討する必要がある
📝 GROWI を Next.js 化するには
- SSR 可能なコンポーネントを作る = Universal Code
- 非 Universal なコードとは?
- https://github.com/weseek/growi/blob/master/src/client/js/components/Navbar/PersonalDropdown.jsx external_link
- クライアントサイドのサービス層・グローバルステートストアとなる unstated に依存している
- 戦略: ➡️ Universal Component の境界を考え、
import dynamic from 'next/dynamic';
を使う - 解: ➡️ PersonalDropdown.jsx, PersonalDropdownMenu.jsx
- https://github.com/weseek/growi/blob/master/src/lib/util/helpers.js external_link
__dirname
が一意であることを前提にしている- 戦略: どちらでも使えるように改修
- 解: ➡️ project-dir-utils.ts
- https://github.com/weseek/growi/blob/master/src/client/js/components/Navbar/PersonalDropdown.jsx external_link
SWR 化
- SWR とは?の前に...
ステート管理
- React との闘いは、ステートとの闘い
- コンポーネント props, state との闘い
- バケツリレーとの闘い
- グローバルステートとの闘い
グローバルステート管理手法
第1世代(勝手に命名)
- 基礎技術は?
- React Component State
- フレームワーク・ライブラリは?
- redux
import { createStore } from 'redux';
- unstated
- redux
- 要するに?
- What: state の塊
- How: HOC
- Provider で囲って、Subscriber で囲って…
HOC…滅びよ… 💀 💀 💀 💀 💀
- Higher-Order Components
- Decorator パターン
- 型やインターフェースなんて JS の世界にはないのに wrap してしまうので「モノが変わる」
第1.5世代(勝手に命名)
- Mobx なら decorator (= annotation, ≠ Decorator パターン) で DI できる
第2世代(勝手に命名)
- 基礎技術は?
- React Hooks
- 脱HOC!!!
- React Context
- React Hooks
- フレームワーク・ライブラリは?
- (使わない)
- unstated-next
- 要するに?
- What: state の塊なのは変わらず
- How: Hooks
第3世代(勝手に命名)
- 基礎技術は?
- React Hooks
- React Context
- React Hooks
- フレームワーク・ライブラリは?
- Recoil
- 要するに?
- What: K/V, Atom
- How: Hooks
第3.5世代(勝手に命名)
- 基礎技術は?
- React Hooks
- React Context
- React Hooks
- フレームワーク・ライブラリは?
- 要するに?
- What: (K/V, Atom) x (Auto Caching, Auto Refetching)
- How: Hooks
Tips