Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

Deep dive into Nuxt Server Components

wattanx
October 19, 2024

Deep dive into Nuxt Server Components

Vue Fes Japan 2024

wattanx

October 19, 2024
Tweet

More Decks by wattanx

Other Decks in Technology

Transcript

  1. Agenda 3 Nuxt のレンダリングモヌドず課題 Nuxt Server Components に぀いお Nuxt Server

    Components の掻甚方法 䜜っお孊ぶ Nuxt Server Components 他の䌌たような技術ずの違い 01 02 03 04 05
  2. Nuxt のレンダリングモヌドに぀いお (Client-Side Rendering) Browser Server GET / GET /bundle.js

    Render JS をダりンロヌドする レンダリングされる 空の HTML を ダりンロヌドする HTML JS
  3. Nuxt のレンダリングモヌドに぀いお (Client-Side Rendering) • パフォヌマンス ◩ ブラりザが JavaScript をダりンロヌドし、解析・実行するのを埅

    たなければならない ◩ そのため、コンテンツが衚瀺されるたで遅い • 怜玢゚ンゞンの最適化 ◩ クロヌラヌずの盞性が悪い ◩ JavaScript を解釈できるクロヌラヌもあるが...
  4. Nuxt のレンダリングモヌドに぀いお (Server-Side Rendering) • Client-Side Rendering の課題を解決する • Server

    は完党にレンダリングされた HTML をブラりザに返す Server-Side RenderingUniversal Rendering
  5. Nuxt のレンダリングモヌドに぀いお (Server-Side Rendering) Browser Server GET / GET /bundle.js

    Hydration HTML JS レンダリング枈みの HTML をダりンロヌドする JS をダりンロヌドする Hydration される Render
  6. Nuxt のレンダリングモヌドに぀いお (Server-Side Rendering) • Server から受け取った HTML を Interactive

    にする ◩ Server から受け取った HTML はむベントリスナがセット されおいない ◩ むベントリスナをセットする䜜業が Hydration Hydration ずは
  7. Nuxt Server Components • Nuxt 3 から導入された機胜 ◩ ただ experimental

    • Server でだけレンダリングされるコンポヌネントを぀くるこずが できる Nuxt Server Components
  8. Nuxt Server Components • Server でだけ実行されお、Hydration されない ◩ Client bundle

    に䞍芁な JS も含たれない • Server が必須ではない。 ◩ ビルド時にアプリケヌションで䜿甚される Server Component を プリレンダリングする ◩ そのため、完党に静的なサむトであっおも動䜜する
  9. Nuxt Server Components Server Component 䜿わない堎合 Server Component 䜿う堎合 箄

    66.4 % æž› 詳しい゜ヌスコヌド https://github.com/wattanx/mini-nuxt-sc/pull/1
  10. Nuxt Server Components 䜿う偎は import なしで䜿甚する もしくは #components からの import

    (実際のパスから import するのはただサポヌトできおいない)
  11. Nuxt Server Components • Server Component の基盀 ◩ .server.vue は

    NuxtIsland コンポヌネントを䜿ったコヌ ドに倉換される • components/islands にコンポヌネントを䜜るず、Server で だけレンダリングできるコンポヌネントになる NuxtIsland コンポヌネント
  12. Nuxt Server Components • Async Component が䜿える • Server Component

    ず Client Component を入れ子にできる • Server Component のうち、䞀郚だけ Hydration できる Nuxt Server Components でできるこず䞀郚抜粋
  13. Nuxt Server Components の掻甚方法 • 時限匏のコンポヌネント ◩ https://www.mizdra.net/entry/2024/08/27/190853 ◩ ある特定の日に衚瀺するようなコンポヌネント

    ◩ Client Component だず Client bundle にその日たで出したくな い情報が含たれおしたう ◩ これは Nuxt Server Components においおも効果的
  14. Nuxt Server Components の掻甚方法 • 頻繁に props が倉曎されるコンポヌネント ◩ props

    が倉わるたびに Server ぞのリク゚ストが発生するため Nuxt Server Components を掻かせないもの
  15. Nuxt Server Components の掻甚方法 • Server Component 同士の入れ子 ◩ Server

    Component のレンダリングには Server ぞのリク゚ スト が必芁 ◩ なので、入れ子にするずオヌバヌヘッドが増える ◩ 理由は仕組みを理解するずわかる (このあず解説予定) 気を぀けた方がいいずころ
  16. 䜜っお孊ぶ Nuxt Server Components • Server Component の基盀である NuxtIsland •

    コンポヌネントを Server でだけレンダリングする仕組み 最終的にできあがるもの
  17. 䜜っお孊ぶ Nuxt Server Components • Vue で Server-Side Rendering できる環境

    • npm create vite-extra@latest app -- --template ssr-vue-ts 準備するもの
  18. 䜜っお孊ぶ Nuxt Server Components Browser Server GET / GET /bundle.js

    Hydration HTML JS Render GET /__nuxt_island Render component HTML Not Hydrated
  19. 䜜っお孊ぶ Nuxt Server Components Browser Server GET / GET /bundle.js

    Hydration HTML JS Render GET /__nuxt_island Render component HTML Not Hydrated 埓来のレンダリングずの差分
  20. 䜜っお孊ぶ Nuxt Server Components Nuxt Server Components の構成芁玠 • Vue

    コンポヌネントをレンダリングする゚ンドポむント • Server で Vue コンポヌネントをレンダリングする凊理 • Vue コンポヌネントをレンダリングする゚ンドポむントぞリク゚ストを投げる コンポヌネント
  21. 䜜っお孊ぶ Nuxt Server Components Nuxt Server Components の構成芁玠 • Vue

    コンポヌネントをレンダリングする゚ンドポむント 👈 たずはここ • Server で Vue コンポヌネントをレンダリングする凊理 • Vue コンポヌネントをレンダリングする゚ンドポむントぞリク゚ストを投げる コンポヌネント
  22. 䜜っお孊ぶ Nuxt Server Components Browser Server GET / GET /bundle.js

    Hydration HTML JS Render GET /__nuxt_island Render component HTML Not Hydrated ここ
  23. 䜜っお孊ぶ Nuxt Server Components URL からコンポヌネント名や props を抜出する凊理を぀くる 実際のURL /__nuxt_island/CodeExample_XdPPUtbPQW.json?props={"count":4}

    URL からコンポヌネント名: CodeExample が抜出 ク゚リパラメヌタから props: { count: 4 } が抜出
  24. 䜜っお孊ぶ Nuxt Server Components • Server-Side Rendering 䞭に利甚したいデヌタを远加できる ◩ Nuxt

    では Request Event を詰めたりしおいる ◩ useSSRContext を䜿うこずでコンポヌネント内からアクセ スできる • https://ja.vuejs.org/api/ssr.html#ssr-context SSR Context
  25. 䜜っお孊ぶ Nuxt Server Components Nuxt Server Components の構成芁玠 • Vue

    コンポヌネントをレンダリングする゚ンドポむント • Server で Vue コンポヌネントをレンダリングする凊理👈 次はここ • Vue コンポヌネントをレンダリングする゚ンドポむントぞリク゚ストを投げる コンポヌネント
  26. 䜜っお孊ぶ Nuxt Server Components Browser Server GET / GET /bundle.js

    Hydration HTML JS Render GET /__nuxt_island Render component HTML Not Hydrated ここ
  27. 䜜っお孊ぶ Nuxt Server Components createSSRApp ず renderToString、 動的にコンポヌネントをレンダリングする凊理を組み合わせる Server で

    Vue コンポヌネントをレンダリングする 動的にコンポヌネントをレンダリングする
  28. 䜜っお孊ぶ Nuxt Server Components Nuxt Server Components の構成芁玠 • Vue

    コンポヌネントをレンダリングする゚ンドポむント • Server で Vue コンポヌネントをレンダリングする凊理 • Vue コンポヌネントをレンダリングする゚ンドポむントぞリク゚ストを投げる コンポヌネント 👈 次はここ
  29. 䜜っお孊ぶ Nuxt Server Components Browser Server GET / GET /bundle.js

    Hydration HTML JS Render GET /__nuxt_island Render component HTML Not Hydrated ここ
  30. 䜜っお孊ぶ Nuxt Server Components だいぶ簡略化したコヌド /__nuxt_island ぞリク゚ストを投げる Server でレンダリングされおいるので Client-Side

    ではprops が倉わったらリク゚ストを投げる HTML 文字列 レンダリングする Hydration されない
  31. 䜜っお孊ぶ Nuxt Server Components Client Component を入れ子にするために必芁なこず • <slot />

    をビルド時に独自の placeholder に倉換する • Slot のコンテンツを Teleport で囲んでレンダリングする • placeholder 郚分に Slot のコンテンツを差し蟌む
  32. 䜜っお孊ぶ Nuxt Server Components Client Component を入れ子にするために必芁なこず • <slot />

    をビルド時に独自の placeholder に倉換する 👈 たずはここ • Slot のコンテンツを Teleport で囲んでレンダリングする • placeholder 郚分に Slot のコンテンツを差し蟌む
  33. 䜜っお孊ぶ Nuxt Server Components Client Component を入れ子にするために必芁なこず • <slot />

    をビルド時に独自の placeholder に倉換する • Slot のコンテンツを Teleport で囲んでレンダリングする 👈 次はここ • placeholder 郚分に Slot のコンテンツを差し蟌む
  34. 䜜っお孊ぶ Nuxt Server Components Client-Side Rendering 時 Server-Side Rendering 時

    Teleport 郚分をわかりやすいように曞くず以䞋のようなコヌドになる
  35. 䜜っお孊ぶ Nuxt Server Components • コンポヌネントにあるテンプレヌトの䞀郚を、そのコンポヌ ネントの DOM 階局の倖偎に存圚する DOM

    ノヌドに「テレ ポヌト」できる組み蟌みコンポヌネント • https://ja.vuejs.org/guide/built-ins/teleport.html Teleport
  36. 䜜っお孊ぶ Nuxt Server Components Server-Side でレンダリングしたずき、SSR Context の teleports に

    Teleport 内のコンテンツが公開される SSR Context は renderToString の第二匕数に枡すオブゞェクト https://ja.vuejs.org/guide/scaling-up/ssr.html#teleports
  37. 䜜っお孊ぶ Nuxt Server Components Teleport を含む NuxtIsland コンポヌネントを Server-Side Rendering

    するず以䞋のように Teleport 内のコンテンツが手に入る
  38. 䜜っお孊ぶ Nuxt Server Components Client Component を入れ子にするために必芁なこず • <slot />

    をビルド時に独自の placeholder に倉換する • Slot のコンテンツを Teleport で囲んでレンダリングする • placeholder 郚分に Slot のコンテンツを差し蟌む 👈 次はここ
  39. 䜜っお孊ぶ Nuxt Server Components • Minimal Nuxt Server Components •

    Nuxt に䟝存しないように䜜った • Vue を䜿えば䜜れる https://github.com/wattanx/mini-nuxt-sc
  40. 他の䌌たような技術ずの違い • バンドル前に事前にレンダヌされるコンポヌネント • Server がなくおも実行できる (Nuxt ず同じ) • RSC

    Payload ず呌ばれる特別なデヌタ圢匏にレンダリングされる ◩ Nuxt Server Components は HTML にレンダリングされる React Server Components
  41. 他の䌌たような技術ずの違い • 静的な郚分に動的JS で Interactiveな郚分を埋め蟌むアプロヌチ • Nuxt Server Components ずは逆

    ◩ Nuxt は動的な郚分に静的なコンテンツを埋め蟌むずいうアプロヌチ Island Architecture
  42. • Nuxt Server Components は動的な郚分に静的なコンテンツを埋め蟌 む技術 • Nuxt Server Components

    を䜿うこずで client bundle を枛らすこず ができる • Nuxt Server Components は Teleport の䜿い方がおもしろい たずめ
  43. たずめ • Remote Source もレンダリングできる • Server Page を䜜るこずができる •

    Lazy Server Component を䜜るこずができる 話せおいないこずがいっぱいある