Nuxt2のSSGで静的サイトを作っているけど、
一部のコンポーネントが非同期に読み込まれてるっぽい感じに。。
調べてみると、named slotsを使っていると、
Hydrationがうまく行かず、クライアントサイドでレンダリングされるよう。。
使ってたコード
以下のような感じで、ヘッダにロゴを配置するだけのコンポーネント
<!-- MyHeader.vue --> <template> <header> <slot name="logo"></slot> </header> </template>
<!-- page/index.vue --> <template> <MyHeader> <template #logo> <MyLogo /> </template> </MyHeader> </template>
期待するのはこんな感じだけど、
<!-- page/index.vue --> <template> <header> <MyLogo /> </header> </template>
読み込んだ瞬間は、こんな感じになる。。
<!-- page/index.vue --> <template> <header> </header> </template>
各パッケージのバージョンはこんな感じ。
- nuxt ... v2.15.3
- @nuxt/components ... v2.1.3
- vue ... v2.6.12
- @nuxt/vue-renderer ... v2.15.3
- vue-server-renderer ... v2.6.12
やったこと
いくつかのissueが上がっていて、vue-server-rendererの問題っぽい。
ワークアラウンドとして、{ loading: true }
オプションを付けるとよいらしい。
// nuxt.config.ts import { NuxtConfig } from "@nuxt/types"; const config: NuxtConfig = { components: { loader: true, dirs: [{ path: "@/components", pathPrefix: false }] }, }; export default config;
これでクライアントサイドで再レンダリングされなくなった(*´ω`*)
ほかのvue-server-rendererの問題だと、
コンポーネント名がHTML5のタグ名と同じ場合だと発生するよう。
今回はなかったのでこれではないっぽかった(*´ω`*)
以上!! むずい。。(*´ω`*)
参考にしたサイト様
- Alternative to confusing async component loading behavior · Issue #193 · nuxt/components
- Hydration error with scoped slots · Issue #164 · nuxt/components
- $refs empty in mounted callback when another component is a parent · Issue #8879 · nuxt/nuxt.js
- Hydration error with scoped slots and component discovery (async components) · Issue #8904 · nuxt/nuxt.js