Skip to content

Commit 46c967d

Browse files
splendentejay-es
andauthored
3.5: lazy hydration (#2275)
* 3.5: lazy hydration * Update src/guide/components/async.md Co-authored-by: Jun Shindo <[email protected]> * Update src/guide/components/async.md Co-authored-by: Jun Shindo <[email protected]> * Update src/guide/components/async.md Co-authored-by: Jun Shindo <[email protected]> * Update src/guide/components/async.md Co-authored-by: Jun Shindo <[email protected]> * fix: add supplement * Update src/guide/components/async.md Co-authored-by: Jun Shindo <[email protected]> --------- Co-authored-by: Jun Shindo <[email protected]>
1 parent d091e8a commit 46c967d

File tree

1 file changed

+99
-0
lines changed

1 file changed

+99
-0
lines changed

src/guide/components/async.md

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,105 @@ const AsyncComp = defineAsyncComponent({
108108

109109
エラーコンポーネントが与えられた場合、ローダー関数から返された Promise が reject されたときに表示されます。リクエストが長すぎる場合にエラーコンポーネントを表示するために、timeout を指定することもできます。
110110

111+
## 遅延ハイドレーション <sup class="vt-badge" data-text="3.5+" /> {#lazy-hydration}
112+
113+
> このセクションは[サーバーサイドレンダリング](/guide/scaling-up/ssr)を使用している場合のみ適用されます。
114+
115+
Vue 3.5 以降では、非同期コンポーネントはハイドレーション戦略を提供することでいつハイドレートされるかを制御できます。
116+
117+
- Vue は複数のビルトインのハイドレーション戦略を提供しています。これらのビルトイン戦略は使用されていない場合にツリーシェイキングするために個別にインポートする必要があります。
118+
119+
- 柔軟性を持たせるために設計は意図的に低レベルになっています。将来的にコアまたは高レベルのソリューション(例: Nuxt)で、コンパイラーのシンタックスシュガー(糖衣構文)がこれに基づいて構築される可能性があります。
120+
121+
### アイドル状態でハイドレート
122+
123+
`requestIdleCallback` を使用してハイドレートします:
124+
125+
```js
126+
import { defineAsyncComponent, hydrateOnIdle } from 'vue'
127+
128+
const AsyncComp = defineAsyncComponent({
129+
loader: () => import('./Comp.vue'),
130+
hydrate: hydrateOnIdle(/* タイムアウトの上限を渡すこともできます(省略可能) */)
131+
})
132+
```
133+
134+
### 表示時にハイドレート
135+
136+
`IntersectionObserver` を使用して要素が表示されたときにハイドレートします。
137+
138+
```js
139+
import { defineAsyncComponent, hydrateOnVisible } from 'vue'
140+
141+
const AsyncComp = defineAsyncComponent({
142+
loader: () => import('./Comp.vue'),
143+
hydrate: hydrateOnVisible()
144+
})
145+
```
146+
147+
オブザーバーに対してオブジェクト値を渡すことができます(省略可能):
148+
149+
```js
150+
hydrateOnVisible({ rootMargin: '100px' })
151+
```
152+
153+
### メディアクエリーでハイドレート
154+
155+
指定されたメディアクエリーに一致したときにハイドレートします。
156+
157+
```js
158+
import { defineAsyncComponent, hydrateOnMediaQuery } from 'vue'
159+
160+
const AsyncComp = defineAsyncComponent({
161+
loader: () => import('./Comp.vue'),
162+
hydrate: hydrateOnMediaQuery('(max-width:500px)')
163+
})
164+
```
165+
166+
### インタラクションでハイドレート
167+
168+
コンポーネント要素に指定されたイベントがトリガーされたときにハイドレートします。ハイドレーションが完了すると、ハイドレーションをトリガーしたイベントも再生されます。
169+
170+
```js
171+
import { defineAsyncComponent, hydrateOnInteraction } from 'vue'
172+
173+
const AsyncComp = defineAsyncComponent({
174+
loader: () => import('./Comp.vue'),
175+
hydrate: hydrateOnInteraction('click')
176+
})
177+
```
178+
179+
複数のイベントタイプをリストにすることもできます:
180+
181+
```js
182+
hydrateOnInteraction(['wheel', 'mouseover'])
183+
```
184+
185+
### カスタム戦略
186+
187+
```ts
188+
import { defineAsyncComponent, type HydrationStrategy } from 'vue'
189+
190+
const myStrategy: HydrationStrategy = (hydrate, forEachElement) => {
191+
// forEachElement はコンポーネントのハイドレートされていない DOM の中にある
192+
// 全てのルート要素を反復処理するためのヘルパーです。ルート要素は単一の要素ではなく
193+
// フラグメントである可能性があるためです
194+
forEachElement(el => {
195+
// ...
196+
})
197+
// 準備が整ったときに `hydrate` を呼び出します
198+
hydrate()
199+
return () => {
200+
// 必要であれば、後処理(teardown)の関数を返します
201+
}
202+
}
203+
204+
const AsyncComp = defineAsyncComponent({
205+
loader: () => import('./Comp.vue'),
206+
hydrate: myStrategy
207+
})
208+
```
209+
111210
## Suspense での使用 {#using-with-suspense}
112211

113212
非同期コンポーネントは、ビルトインコンポーネント `<Suspense>` と使用することもできます。`<Suspense>` と非同期コンポーネント間のインタラクションについては、[`<Suspense>` のページ](/guide/built-ins/suspense) にドキュメントがあります。

0 commit comments

Comments
 (0)