You are browsing Nuxt 2 docs. Go to Nuxt 3 docs, or learn more about Nuxt 2 Long Term Support.

翻訳されたページ このページのコンテンツは古い可能性があります。

サーバーサイドレンダリング

サーバーサイドレンダリング(SSR)はウェブページのレンダリングをブラウザの代わりにサーバー上で行う、画面の表示において有用なアプリケーションの機能です。サーバーサイドは完全にレンダリングされたページをクライアントに送信します。クライアントの JavaScript バンドルが引継ぎ Vue.js のアプリがハイドレーション できるようにします。


Node.js サーバー環境が必須

ウェブページをレンダリングするためには JavaScript の環境が必要です。

Vue.js のアプリケーションを実行するには Node.js サーバーの環境構築が必要です。

サーバーの拡張と制御

serverMiddleware でサーバーを拡張しルートを middleware で制御することができます。

server-middleware/logger.js
export default function (req, res, next) {
  console.log(req.url)
  next()
}
nuxt.config.js
export default {
  serverMiddleware: ['~/server-middleware/logger']

}

サーバー環境とブラウザ環境

Node.js の環境を利用するため reqres といった Node.js のオブジェクトにアクセス可能です。また windowdocument といったブラウザ環境に帰属するオブジェクトにはアクセスできません。ただし beforeMountmounted などのフックを使うと windowdocument を使うことができます。

beforeMount () {
  window.alert('hello');
}
mounted () {
  window.alert('hello');
}

Nuxt でのサーバーサイドレンダリングのステップ

ステップ 1: ブラウザからサーバーへ

ブラウザが最初のリクエストを送ると Node.js の内部サーバーへ到達します。Nuxt は HTML を生成し asyncDatanuxtServerInitfetch といった関数を実行した結果と共にブラウザへ送り返します。フック関数も同様に実行されます。

ステップ 2: サーバーからブラウザへ

サーバーによって生成された HTML と共にレンダリングされたページをブラウザが受け取ります。その内容が表示され Vue.js のハイドレーションが作用し始めます。この工程の後、ページがインタラクティブになります。

ステップ 3: ブラウザからブラウザへ

<NuxtLink> によるページ間の遷移はクライアントサイドで行われるためブラウザをハード再読み込みをしない限りサーバーへリクエストを送りません。

警告

window または document undefined

これはサーバーサイドレンダリングによるものです。クライアントサイドでのみリソースをインポートするように指定する必要がある場合は process.client 変数を使用する必要があります。

たとえば .vue ファイルは次のようになります:

if (process.client) {
  require('external_library')
}

iOS と電話番号

モバイル Safari の一部のバージョンでは、電話番号を自動的にリンクに変換します。これにより SSR コンテンツがウェブサイトのコンテンツと一致しなくなるため、NodeMismatch の警告が引き起こされます。そのためこれらの Safari バージョンでアプリが使用できなくなる可能性があります。

Nuxt ページに電話番号を含める場合、2 つのオプションがあります。

メタタグを使用して変換を停止する

<meta name="format-detection" content="telephone=no" />

電話番号をリンクにラップする

<!-- 電話番号の例: +7 (982) 536-50-77 -->

<template>
  <a href="tel: +7 (982) 536-50-77">+7 (982) 536-50-77</a>
</template>