Next.jsとNextUIでブログを作った
7/13/2023
目次
はじめに
Next.js どころかフロントエンド初心者ですがポートフォリオサイトが欲しくなったので話題なきがする Next.js と NextUI でポートフォリオサイトを作ってみました(このサイトです)。
使ったライブラリ
メインで使ったのは
- Next.js
- NextUI
- Tailwind CSS
です
他にもマークダウンから Html にする react-markdown
など細々としたライブラリを使用しています。
App Router
自分は Next.js を使うのが今回が二回目だったのですが、Next.js 13 になった影響で初回とは違いプロジェクトの構成がガラッと変わりました。
Next.js v13.4.0 では App Router が安定版になり、Next.js プロジェクトの作成時に推奨されるようになりました。
App Router の機能は触ったことがないので検証も兼ねてブログサイトで App Router を使用しています。
App Router - Server Component / Client Component
Next.js App Router の重要な点として Server Component(SC) Client Component(CC)が導入されたことだと思います。
デフォルトでは全てのファイルが Server Component として処理されます。
Client Component としてプログラムを作成する場合はファイルの先頭に"use client";
を配置します。これによりそのファイルに書かれたプログラムは Client Component として実行されます。
App Router - ページ構造
以前までの Next.js(以前までの Next.js をほとんどしらない)では_app.tsx
_document.tsx
などを用いてページを初期化、レイアウトし、ファイル名でページを作成していたと思いますが、App Router ではディレクトリでページを構成します。
わかりやすいように具体的に例を示します。
- app
- page.tsx <localhost/>
- blog
- page.tsx <localhost/blog>
- profile
- page.tsx <localhost/profile>
ディレクトリがページのパスになり、ページの実態はpage.tsx
に記述します。
page.tsx
にはexport default
で任意の関数をページの実態として出力します。
例
1export default function Page() {
2 return (
3 <main>
4 <h1>こんにちは</h1>
5 </main>
6 );
7}
App Router - SSG
以前まではnext export
を使用して SG を利用していましたが、
App Router ではnext.config.js
の output のオプションで SG を指定できます。
1/** @type {import('next').NextConfig} */ 2const nextConfig = { 3 output: "export", 4}; 5 6module.exports = nextConfig;
上記の設定を済ませることでnext build
でout
ディレクトリに出力されます。
以前までの Next.js ではgetStaticProps
やgetServerSideProps
を使用してきたと思いますが、App Router ではそれらを用いません。
主にgenerateStaticParamsを使用します。
1// Return a list of `params` to populate the [slug] dynamic segment
2export async function generateStaticParams() {
3 const posts = await fetch("https://.../posts").then((res) => res.json());
4
5 return posts.map((post) => ({
6 slug: post.slug,
7 }));
8}
9
10// Multiple versions of this page will be statically generated
11// using the `params` returned by `generateStaticParams`
12export default function Page({ params }) {
13 const { slug } = params;
14 // ...
15}
上は Next.js にサンプルとして置かれていたコードを拝借してきたものです。
コードのようにgenerateStaticParams
で返り値として出力したデータを default 関数が params というパラメータで受け取っています。