Nuxt2 + composition-api で 特定のページだけ SSR がうまく動作しない
結論
layouts において、<nuxt>
を <client-only>
で囲うと、asyncData()
はサーバーサイド実行されるが、setup()
はサーバーサイドで実行されない。
nuxt2 + composition-api を利用。
今日時点(2021/10/07)、最新バージョン。
{
"dependencies": {
"nuxt": "^2.15.8",
},
"devDependencies": {
"@nuxtjs/composition-api": "^0.29.2",
}
}
このページでは、SSRが動作するが
/pages/index.vue
下記のページではSSRが動作しない。
/pages/_user/index.vue
/pages/_user.vue
aysncData() では問題なく SSRされるが、 setup() がサーバー側で実行されない。よって useAsync() もフロントでしか実行されない。
setup(){
console.log('process.server', process.server) // -> false
}
既存プロジェクトに composition-api に書き換えているので、全てのページで上記ページのみ検証中。
発生条件の仮説としては Dynamic Nested Routes 。
/pages/policy.vue
の単に HTML を返すだけの静的なページで setup() がサーバー側で実行されなかった。ので、上記仮説は間違っていそう。
ログインが必要なページかどうかを検証したが、関係なさそう
index.vue は layout を別のを使っていて、<client-only>
で <nuxt/>
が使われていた。
policy.vue で index.vue と同じ layout <client-only>
で囲われてないものを使用したら setup がサーバーサイドで実行された。
つまり<nuxt/>
が <client-only>
で囲われると、それ以下の component はサーバーサイドで実行されないのかも。
なんか妥当な挙動な気がするし、むしろ asyncData でなんで動くのか?なんか間違ってそう