見出し画像

Next.js SSG SSRについて

Next.jsにはSSG、SSRという機能があります。本記事は自分の備忘録として記述しています。同じレベル感の方が少しでも参考になれば幸いです。

SSR(server side rendering)
SSRとは静的サイト生成の略です。
一般的なwebページはリクエストがありレスポンスとして当該のhtmlファイルが返却される。そのファイルにscriptタグなどを介してjsファイルをを見込み描画させていく仕様でした。(クライアントサイド・レンダリング(CSR)

ですが、現在はreact, Vueといったフレームワークは大量のjsファイルをクライアントサイドでレンダリングする為、アプリケーションの規模が大きくなるほど、renderingコストが増大しオーバーヘッド(描画まで時間がかかる)を生じる問題がありました。

その問題を回避するために考案されたのがSSRです。

SSRはjsファイルをレンダリングしHTML生成をサーバーサイドで事前に行っておいて、それをクライアントへ返却する仕様です。

一見これで描画までのオーバーヘッドを軽減できたと思いますが、ユーザーのリクエストごとにrendringしていきますのでオーバヘッドは避けれないです。
そこで考案されたのがSSGでした。

SSG( static site generation)
SSGとは静的サイト生成のことです。
これまでの話だと、結局リクエスがある度にレンダリングを行うことでオーバーヘッドを生じていました。

そこで、動的ファイルをhtmlへ事前構築しておいて(fetchしてデータを事前取得)、リクエスがある時に構築したhtmlを返却させる仕様をSSGで実現しました。

SSGはビルドのタイミングで各ページをhtmlとして構築します。
SSRとの大きな違いは使い回しが可能である点。CDNを活用することで一度生成した,htmlファイルを使いまわせることができます。

これが意味することはrendringコストが軽減するだけではなく、レイテンシーの改善にも繋がります。

これを踏まえて実際のSSGのコードを記述。

import { Layout } from "../componets/Layouts";
import { getAllPostsData  } from "../lib/posts";
import { Post } from "../componets/Post"

const Blog = ({ posts }) => {
 return (
   <Layout title="Blog">
     <div>
       { posts && posts.map( post => <Post key={post.id} post={post}/>) }
     </div>
   </Layout>
 );
}

export default Blog;

export async function getStaticProps () {
 const posts = await getAllPostsData();

 return {
   props: { posts },
 }
}


//apis
import fetch from "node-fetch";

const apiUrl = "https://jsonplaceholder.typicode.com/posts";

export const getAllPostsData = async () => {
 const res = await fetch(new URL(apiUrl));
 const posts = await res.json();
 return posts
}
​

SSGを実現するためにはgetStaticProps()を仕様します。
このコードでAPIコールを行い。取得したデータをpropsとして当該のcomponetに流し込みます。これをbuildすれば、HTMLファイルが生成されるという流れになります。

終わりに
SSGだけではなく、ISRといった機能もあるのでまた学習していきます。

この記事が気に入ったらサポートをしてみませんか?