Nuxt.jsでは、外部サーバ等から非同期でデータを取得・表示する場合にも asyncData
を使ってあげることでクライアントサイドはもちろん、サーバサイドでもデータを取得し、HTMLで出力することが出来ます。
SSRできる本番環境があれば何の問題もないのですが、SSRせずプリレンダリングのみで運用する場合には、 asyncData
は静的ファイルをgenerateした時点でしか走っておらず、ページロード時にデータが更新されていない問題が起こり得ます。
例えばコーポレートサイト等で、別のサーバにWordPressが設置してあり、トップページのお知らせとしてWordPressから記事を取得するような場合を想定すると、こんな感じで作ってあげることで解決できます
// 非同期でデータを取ってくる関数
async function getPostData() {
return { data } = await axios.get('https://blog.example.com/wp-json/wp/v2/posts');
}
export default {
async asyncData(context) {
const obj = {};
if (context.isServer) { // asyncDataするのはサーバサイド(プリレンダリング時)のみ
obj.posts = await getPostData();
}
return obj;
},
async created() {
if (!this.$isServer) { // クライアントサイドはここで更新をかける
this.posts = await getPostData();
}
},
};
要は asyncData
を使うのはサーバサイド(プリレンダリング時)のみ。
クライアントサイドでは created
でデータの更新をかけてあげるわけです。
こうすることでプリレンダリング運用でも、一応(少し古いかもしれないけど)非同期データのHTMLもプリレンダリングされていて、ブラウザで訪れた際にはちゃんと最新の情報に更新されます。