サイトアイコン 上尾市のWEBプログラマーによるブログ

「はじめてつくるNext.jsサイト」の感想・備忘録2

「はじめてつくるNext.jsサイト」の感想・備忘録1の続き

基本

next/image

レイアウト

touch components/{layout,header,hooter}.js

components/layout.js

import Header from './header'
import Footer from './footer'

const Layout = (props) => {
  return (
    <>
    <Header />
      {props.children}
    <Footer />
    </>
  );
};
export default Layout;

components/header.js

const Header = () => {
  return (
    <header>
      <Link href="/">ヘッダー</Link>
      <hr/>
    </header>
  );
};
export default Header;

components/footer.js

const Footer = () => {
  return (
    <footer>
      <hr/>フッター
    </footer>
  );
};
export default Footer;

pages内のファイル(以下はpages/index.jsの場合)

import Link from 'next/link'
import Image from 'next/image'
import styles from '../styles/index.module.css'
import Layout from '../components/Layout'

const Index = () => {
  return (
    <Layout>
      <h1 className={styles.h1Text}>Index</h1>
      <Image src="/images/9736.jpg" alt="fumika" width={200} height={150} quality={90}  />
      <Link href="/contact">contact</Link>
    </Layout>
  );
};
export default Index;

ブラッシュアップ

404エラー画面

touch pages/404.js

import Layout from '../components/Layout'

const NotFound = () => {
  return (
    <Layout>
      <h1>ページが見つかりません。</h1>
    </Layout>
  );
};
export default NotFound;

SEO

import Head from 'next/head'

const Seo = (props) => {
  return (
    <Head>
      <meta name="viewport" content="initial-scale=1.0, width=device-width"/>
      <meta charset="utf-8"/>
      <title>{props.title}</title>
      <meta name="description" content={props.description}/>
    </Head>
  );
};
export default Seo;

APIルート

export default function handler(req, res) {
  res.status(200).json({ name: 'John Doe' })
}
// http://localhost:3000/api/helloでアクセス可能
const data = [
  {name: 'Donald Trump', period: '2017-2021'},
  {name: 'Barack Obama', period: '2009-2017'},
];
export default function server(req, res) {
  res.status(200).json(data);
}
// http://localhost:3000/api/presidentsでアクセス可能
モバイルバージョンを終了