Closed6

Nuxt2 + composition-api で 特定のページだけ SSR がうまく動作しない

ピン留めされたアイテム
Ryosuke MiyamotoRyosuke Miyamoto

結論
layouts において、<nuxt><client-only> で囲うと、asyncData() はサーバーサイド実行されるが、setup() はサーバーサイドで実行されない。

Ryosuke MiyamotoRyosuke Miyamoto

nuxt2 + composition-api を利用。
今日時点(2021/10/07)、最新バージョン。

packages.json
{
  "dependencies": {
    "nuxt": "^2.15.8",
  },
  "devDependencies": {
    "@nuxtjs/composition-api": "^0.29.2",
  }
}

このページでは、SSRが動作するが
/pages/index.vue

下記のページではSSRが動作しない。
/pages/_user/index.vue
/pages/_user.vue

Ryosuke MiyamotoRyosuke Miyamoto

aysncData() では問題なく SSRされるが、 setup() がサーバー側で実行されない。よって useAsync() もフロントでしか実行されない。

/pages/_user/index.vue
setup(){
      console.log('process.server', process.server) // -> false
}

既存プロジェクトに composition-api に書き換えているので、全てのページで上記ページのみ検証中。

発生条件の仮説としては Dynamic Nested Routes 。

https://nuxtjs.org/docs/features/file-system-routing/#dynamic-nested-routes

Ryosuke MiyamotoRyosuke Miyamoto

/pages/policy.vue

の単に HTML を返すだけの静的なページで setup() がサーバー側で実行されなかった。ので、上記仮説は間違っていそう。

Ryosuke MiyamotoRyosuke Miyamoto

index.vue は layout を別のを使っていて、<client-only><nuxt/> が使われていた。

policy.vue で index.vue と同じ layout <client-only> で囲われてないものを使用したら setup がサーバーサイドで実行された。

つまり<nuxt/><client-only> で囲われると、それ以下の component はサーバーサイドで実行されないのかも。

なんか妥当な挙動な気がするし、むしろ asyncData でなんで動くのか?なんか間違ってそう

このスクラップは2021/10/07にクローズされました