跳到主要内容
知仓学习社ZHICANG

nuxt4-patterns

ハイドレーション安全性、パフォーマンス、ルートルール、遅延ロード、useFetchとuseAsyncDataを使ったSSR安全なデータフェッチングのためのNuxt 4アプリパターン。

联网无严重或高危命中affaan-m/ECC

它会碰到什么

扫了多少1 个文本文件,3 KB
它会碰到什么联网
命中总数3 处
命中统计严重 0 · 高 0 · 中 0 · 低 2

这一栏是扫描器报的事实,不是结论。命中多不等于有毒(安全工具、规则库、示例脚本本来就会包含危险写法),命中少也不等于干净。它和你手上的凭据、文件、网络有什么关系,需要你自己看。

技能内容

Nuxt 4パターン

SSR、ハイブリッドレンダリング、ルートルール、またはページレベルのデータフェッチングを使用してNuxt 4アプリを構築またはデバッグするときに使用する。

アクティベートするタイミング

  • サーバーHTMLとクライアントの状態の間のハイドレーション不一致
  • プリレンダリング、SWR、ISR、またはクライアントのみのセクションなどのルートレベルのレンダリング決定
  • 遅延ロード、遅延ハイドレーション、またはペイロードサイズに関するパフォーマンス作業
  • useFetchuseAsyncData、または$fetchを使ったページやコンポーネントのデータフェッチング
  • ルートパラメータ、ミドルウェア、またはSSR/クライアントの差異に結びついたNuxtルーティングの問題

ハイドレーション安全性

  • 最初のレンダリングを決定論的に保つ。SSRレンダリングされたテンプレートの状態にDate.now()Math.random()、ブラウザのみのAPI、またはストレージ読み取りを直接入れないこと。
  • サーバーが同じマークアップを生成できない場合、ブラウザのみのロジックをonMounted()import.meta.clientClientOnly、または.client.vueコンポーネントの後ろに移動する。
  • vue-routerのものではなく、NuxtのuseRoute()コンポーザブルを使用する。
  • SSRレンダリングされたマークアップを駆動するためにroute.fullPathを使用しない。URLフラグメントはクライアントのみであり、ハイドレーション不一致を引き起こす可能性がある。
  • ssr: falseは不一致のデフォルト修正としてではなく、真にブラウザのみの領域のエスケープハッチとして扱う。

データフェッチング

  • ページとコンポーネントでSSR安全なAPI読み取りにはawait useFetch()を優先する。サーバーでフェッチしたデータをNuxtペイロードに転送し、ハイドレーション時の2回目のフェッチを避ける。
  • フェッチャーが単純な$fetch()呼び出しでない場合、カスタムキーが必要な場合、または複数の非同期ソースを構成する場合はuseAsyncData()を使用する。
  • useAsyncData()にキャッシュの再利用と予測可能なリフレッシュ動作のための安定したキーを提供する。
  • useAsyncData()ハンドラを副作用なしに保つ。SSRとハイドレーション中に実行される可能性がある。
  • $fetch()はユーザーによるトリガーの書き込みまたはクライアントのみのアクションに使用し、SSRからハイドレートされるべきトップレベルのページデータには使用しない。
  • ナビゲーションをブロックすべきでない非重要データにはlazy: trueuseLazyFetch()、またはuseLazyAsyncData()を使用する。UIでstatus === 'pending'を処理する。
  • server: falseはSEOや最初のペイントに不要なデータのみに使用する。
  • pickでペイロードサイズを削減し、深いリアクティビティが不要な場合はより浅いペイロードを優先する。
const route = useRoute()

const { data: article, status, error, refresh } = await useAsyncData(
  () => `article:${route.params.slug}`,
  () => $fetch(`/api/articles/${route.params.slug}`),
)

const { data: comments } = await useFetch(`/api/articles/${route.params.slug}/comments`, {
  lazy: true,
  server: false,
})

ルートルール

レンダリングとキャッシング戦略にはnuxt.config.tsrouteRulesを優先する:

export default defineNuxtConfig({
  routeRules: {
    '/': { prerender: true },
    '/products/**': { swr: 3600 },
    '/blog/**': { isr: true },
    '/admin/**': { ssr: false },
    '/api/**': { cache: { maxAge: 60 * 60 } },
  },
})
  • prerender: ビルド時の静的HTML
  • swr: キャッシュされたコンテンツを提供しながらバックグラウンドで再検証
  • isr: サポートされているプラットフォームでの増分静的再生成
  • ssr: false: クライアントレンダリングルート
  • cacheまたはredirect: Nitroレベルのレスポンス動作

グローバルではなくルートグループごとにルートルールを選択する。マーケティングページ、カタログ、ダッシュボード、APIは通常異なる戦略が必要。

遅延ロードとパフォーマンス

  • Nuxtはすでにルートでページをコード分割している。コンポーネント分割を微小最適化する前に、ルートの境界を意味のあるものに保つ。
  • 非重要コンポーネントを動的にインポートするにはLazyプレフィックスを使用する。
  • UIが実際に必要になるまでチャンクが読み込まれないよう、v-ifで遅延コンポーネントを条件付きでレンダリングする。
  • フォールドより下または非重要なインタラクティブUIには遅延ハイドレーションを使用する。
<template>
  <LazyRecommendations v-if="showRecommendations" />
  <LazyProductGallery hydrate-on-visible />
</template>
  • カスタム戦略には、可視性またはアイドル戦略でdefineLazyHydrationComponent()を使用する。
  • Nuxtの遅延ハイドレーションは単一ファイルコンポーネントで機能する。遅延ハイドレーションコンポーネントに新しいpropsを渡すと、すぐにハイドレーションがトリガーされる。
  • Nuxtがルートコンポーネントと生成されたペイロードをプリフェッチできるよう、内部ナビゲーションにはNuxtLinkを使用する。

レビューチェックリスト

  • 最初のSSRレンダリングとハイドレートされたクライアントレンダリングが同じマークアップを生成する
  • ページデータがトップレベルの$fetchではなくuseFetchまたはuseAsyncDataを使用している
  • 非重要なデータが遅延で明示的なローディングUIがある
  • ルートルールがページのSEOと新鮮度要件に一致している
  • 重いインタラクティブアイランドが遅延ロードまたは遅延ハイドレートされている

想直接用这个技能?

本站把开放许可(MIT / Apache 等)的技能按仓库打包整理到网盘,点一下转存到你自己的网盘,不用一个个从 GitHub 拉。许可未声明的技能只给原始仓库链接,不打包。

同名技能的其他版本

有 3 个不同仓库或目录里都有叫 nuxt4-patterns 的技能。它们内容并不相同,别混用:

  • affaan-m/ECC — Nuxt 4 应用模式,涵盖水合安全、性能优化、路由规则、懒加载,以及使用 useFetch 和 useAsyncData 进行 SSR 安全的数据获取。
  • affaan-m/ECC — Nuxt 4 app patterns for hydration safety, performance, route rules, lazy loading, and SSR-