完全静的化への道
読むには長すぎる
- nuxtを
2.14.0
にアップグレードしてください nuxt.config.js
でtarget: 'static'
を設定してくださいnuxt generate
を実行してください- これで完了です✨
ボーナス:nuxt start
を実行すると、生成された静的アプリケーションを提供するローカルサーバーを実行できます。
注:このビデオではnuxt export
を使用していますが、これはnuxt generate
に置き換えられました。
目次
履歴
Nuxtはv0.3.2(2016年11月)からnuxt generate
による静的生成機能を備えていましたが、それ以来、様々な方法で改善してきましたが、完全な静的生成を実現することはできませんでした。本日、Nuxt 2.13で完全静的エクスポートが可能になったことを発表できることを嬉しく思います。
現在の問題
nuxt generate
は主にプリレンダリングであり、クライアントサイドでナビゲートすると、asyncData
とfetch
が呼び出され、*APIへのリクエストが行われます*。多くのユーザーから、「完全静的」モード、つまり次のページがすでにプリレンダリングされているため、ナビゲーション時にこれら2つのフックを呼び出さないようにするモードのサポートが求められていました。
また、開発者エクスペリエンスも最適ではありません
- SSRでは
req
またはres
にアクセスできますが、nuxt generate
を実行しているときはアクセスできません process.static
はnuxt generate
を実行しているときのみtrue
になるため、静的生成用のNuxtモジュールやプラグインの開発が遅くなります- すべての動的ルートを
generate.routes
で指定する必要があるため、nuxtモジュールにアクセスできないため、より困難になります。 - SPAフォールバックを開発環境でテストできません。フォールバックは、404ページにアクセスしたときにロードされるNuxtアプリケーションのクライアント専用バージョンです
nuxt generate
はデフォルトでnuxt build
を実行するため、コンテンツのみが変更された場合、Webサイトの生成が遅くなります
nuxt-payload-extractorモジュールを使用すれば完全静的サポートを実現できましたが、使い方が複雑で制限がありました.
新しい設定オプション:target
ユーザーエクスペリエンスを向上させ、アプリケーションを静的ホスティングにエクスポートする意思をNuxtに伝えるために、nuxt.config.js
にtarget
オプションを導入します
<script setup>
import { ref, computed } from '#imports'
const count = ref(1)
const double = computed(() => count.value * 2)
</script>
ssr: 'false'
(非推奨のmode: 'spa'
と同じ)では機能しません。静的ターゲットでnuxt dev
を実行すると、開発者エクスペリエンスが向上します
- コンテキストから
req
とres
を削除します - 404、エラー、リダイレクトが発生した場合、クライアントサイドレンダリングにフォールバックします(SPAフォールバックを参照)
$route.query
はサーバーサイドレンダリングでは常に{}
になりますprocess.static
はtrue
です
また、モジュール作成者がユーザーターゲットに応じてロジックを追加できるように、process.target
も公開しています.
よりスマートなnuxt generate
अब v2.14.0
के साथ, आप nuxt generate
का उपयोग कर सकते हैं, यह स्मार्ट तरीके से पता लगाएगा कि इसे बिल्ड करना है या नहीं.
超高速な静的アプリケーション
target: 'static'
を指定したnuxt generate
は、すべてのページをHTMLにプリレンダリングし、ペイロードファイルを保存して、クライアントサイドナビゲーションでasyncData
とfetch
をモックします。これは、**クライアントサイドナビゲーションでAPIへのHTTP呼び出しがなくなる**ことを意味します。ページペイロードをjsファイルに抽出することで、**提供されるHTMLサイズも削減**され、最適なパフォーマンスのためにプリロードされます(ヘッダーから)。
完全静的化を行う際のスマートプリフェッチも改善し、ペイロードもフェッチすることで、ナビゲーションが瞬時に行われるようになりました👀
クローラーの統合
その上、内部にクローラーも搭載されており、すべての相対リンクを検出して生成します
多数のルートを除外したい場合は、generate.excludeを使用してください。generate.routesを使用して、クローラーが検出できなかった追加のルートを追加することもできます。
クローラーを無効にするには、nuxt.config.js
でgenerate.crawler: false
を設定してください
より高速な再デプロイ
nuxt build
とnuxt export
を分離することで、新たな改善の可能性が開かれました。コンテンツが変更された場合にのみページをプリレンダリングします。つまり、webpackビルドなし→再デプロイの高速化を意味します。
よりスマートなnuxt start
静的に生成されたNuxtアプリをdist/
に配置したら、nuxt start
を使用して本番HTTPサーバーを起動し、SPAフォールバックをサポートする静的アプリを提供します。
このコマンドは、お気に入りの静的ホスティングプロバイダーにプッシュする前に、静的アプリケーションをローカルでテストするのに最適です.
プレビューモード
APIを呼び出し続けるために、ライブプレビューを標準でサポートしています
export default async function ({ query, enablePreview }) {
if (query.preview) {
enablePreview()
}
}
ページデータが自動的に更新されます(nuxtServerInit
、asyncData
、fetch
の呼び出し)。
プレビューモードが有効になっている場合、asyncData
とfetch
の元のメソッドが呼び出されます。
コマンド
target
に応じて、次のコマンドを実行できます。
サーバー
nuxt dev
:開発サーバーを起動しますnuxt build
:本番環境用にNuxtアプリケーションをバンドルしますnuxt start
:本番サーバーを起動します
静的
nuxt dev
:開発サーバーを起動します(静的対応)nuxt generate
:必要に応じて本番環境用にNuxtアプリケーションをバンドルし(静的対応)、アプリケーションをdist/
ディレクトリに静的HTMLとしてエクスポートしますnuxt start
:dist/
から本番アプリケーションを提供します