SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Vercel+Next.jsを活用したWebアプリケーション開発入門

ブログを作りながら学ぶ、Next.jsの便利な5つのコンポーネント(Link、Image、Head、Script、レイアウト)

Vercel+Next.jsを活用したWebアプリケーション開発入門 第3回

  • X ポスト
  • このエントリーをはてなブックマークに追加

4. Scriptコンポーネント

変更前ソース

機能概要

 外部のJavaScriptの読み込むタイミングを指定します。

機能詳細

 <Head>タグにてスクリプトを読み込むこともできますが、読み込むタイミングが不定となり、ページ表示がブロッキングされてパフォーマンスに影響を与える場合があります。

 Scriptコンポーネントはスクリプトの読み込みタイミングを明示的に指定することでページのパフォーマンスを最適化できます。

実装方法

 「pages/posts/first-post.js」ファイルにScriptコンポーネントに関する部分を実装します。

import Link from 'next/link'; // Linkコンポーネントをインポート
import Head from 'next/head'; // Headコンポーネントをインポート
import Script from 'next/script'; // Scriptコンポーネントをインポート

// ファイル呼び出し時のエントリーポイント
export default function FirstPost() {
  return (
    // HTMLの範囲を示す何らかのタグが必要。
    // 今回は空タグを使用しているが<div>等でもよい
    <>
      {/* タイトルを追加 */}
      <Head>
        <title>First Post</title>
      </Head>
      {/* facebookのスクリプト読み込み */}
      <Script
        src="https://connect.facebook.net/en_US/sdk.js"
        strategy="lazyOnload"
        onLoad={() =>
          console.log(`script loaded correctly, window.FB has been populated`)
        }
      />
      <h1>First Post</h1>
      <h2>
        {/* リンク先をhrefで指定する */}
        <Link href="/">
          {/* 表示したい文字を<a>タグで囲う */}
          <a>Back to home</a>
        </Link>
      </h2>
    </>
  );
}

 「strategy="lazyOnload"」はブラウザのアイドル時間中に、スクリプトを遅延ロードするという意味です。「onLoad」はスクリプトの読み込みが終了した時に行う処理です。ここではFacebookのスクリプトが読み込まれたことをコンソールに出力します。

動作確認

 http://localhost:3000/posts/first-postをブラウザで開いて、ブラウザの開発者コンソールを開きます。以下のようにコンソールに表示されれば成功です。

完成したソース

サンプルサイト

5. レイアウトコンポーネント

変更前ソース

機能概要

 複数のページで利用する共通のレイアウトを作ることができます。

機能詳細

 ブログやニュースサイトでは1記事ごとのレイアウトは共通化されており、そのような共通化レイアウトを定義します。いわゆるテンプレートみたいなものです。

 また、レイアウトコンポーネントのみの機能ではありませんが、Next.jsはページごとに最小のコードが読み込まれるようにコードを自動で分割します。レイアウトで使用するCSSもコード分割の対象となっており、1ページあたりのバンドルサイズが小さくなることでパフォーマンスの最適化が行えます。

実装方法

 まず、レイアウトコンポーネントを作ります。

 「components」ディレクトリを作り、「layout.js」ファイルを作り、以下のコードを記述します。

// 単純にdivを付け加えるだけのレイアウト
export default function Layout({ children }) {
    return <div>{children}</div>;
}

 「pages/posts/first-post.js」にレイアウトコンポーネントを適用します。リファクタリングとして、ここまで加えたコメントとScriptコンポーネントは利用しないので消します。

import Link from 'next/link';
import Head from 'next/head';
import Layout from '../../components/layout'; // Layoutコンポーネントをインポート

export default function FirstPost() {
  return (
    // レイアウトコンポーネントに変更
    <Layout>
      <Head>
        <title>First Post</title>
      </Head>
      <h1>First Post</h1>
      <h2>
        <Link href="/">
          <a>Back to home</a>
        </Link>
      </h2>
    </Layout>
  );
}

 ここまではブラウザ上での変化はありません。

 CSSを追加します。CSSは「components」ディレクトリに「layout.module.css」を追加します。styled-jsxが組み込まれており、Reaxtコンポーネントに直接CSSを記述することが可能です。

.container {
  max-width: 36rem;
  padding: 0 1rem;
  margin: 3rem auto 6rem;
}

動作確認

 http://localhost:3000/posts/first-postをブラウザで開いて、左と上に少し余裕のある表示になったことを確認できます。

完成したソース

サンプルサイト

まとめ

 今回は、Next.jsで便利な以下の9の機能のうち「Linkコンポーネント」「Imageコンポーネント」「Headコンポーネント」「Scriptコンポーネント」「レイアウトコンポーネント」の5つを紹介しました。

 次回は、残りの4つの機能「グローバル設定」「プリレンダリング」「動的ルート」「サーバーレス機能」を紹介します。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Vercel+Next.jsを活用したWebアプリケーション開発入門連載記事一覧

もっと読む

この記事の著者

山本 誠樹(サイトコア株式会社)(ヤマモト マサキ)

 サイトコア株式会社 セールスグループ パートナーテクニカルイネーブルメントマネージャー。通信系システムや会員管理サービスの設計・開発から保守まで、システムエンジニアとして様々なプロジェクトに約20年従事。近年はクラウドにフォーカスしたコンサルティングを小売・流通・電力系など業種を問わず行う。201...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/16473 2022/09/14 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング