- 記事一覧 >
- ブログ記事
StrapiとNext.jsを使って静的ウェブサイトを構築
はじめに
弊社のWebサイト(https://itccorporation.jp)は、Next.js、ヘッドレスCMSのStrapiを使って、生成した静的Webサイトです。 ※用語については、下にまとめて簡単に解説があります。
図で示すと、以下のようになっています。
https://itccorporation.jpのソースコードは、GitHubにあります。(https://github.com/itc-lab/itccorporation) 今回は、このソースコードを使い、静的Webサイトを生成するところまでやっていきたいと思います。
Webサーバー(上の図で言うと一番右)のところの解説は省略します。
・Node.jsインストール
・Strapiインストール
・Webサイトソースコードの配置
・Strapi初期設定
・Strapiでデータスキーマ作成
・Strapiでデータ登録
・GraphQL有効化
・Webサーバーへデプロイ
【 Next.js 】
「Next.js」とは、Vercel社が開発したReactのフレームワークです。
Static Site Generator(SSG)・静的サイトジェネレーターとしての役割を果たします。
Next.jsのnext/image(Imageコンポーネント)による画像最適化を使う場合、VercelにデプロイするかCloudinaryなどの外部CDNを使う必要があります。※2021/07現在
【 React 】
「React」とは、Facebook社が開発したJavaScriptのフレームワークです。
コンポーネントと呼ばれる部品(UI・画面の一部分)ごとに開発ができます。画面更新の際、差分を検出して差分だけ更新するため、動作が速いという特徴があります。
【 静的Webサイト 】
決まった内容を表示するだけのサイトです。ユーザーによって画面が切り替わったり、入力内容によって切り替わったり、サーバー側に何らかの処理が必要な場合は動的Webサイトになります。
【 ヘッドレスCMS 】
まず、「CMS」とは、WordPressのように全体の枠(決まったデザイン)ができあがっていて、その中に記事を書き込みできるなどのコンテンツの管理システムの事です。「ヘッドレスCMS」とは、全体の枠(決まったデザイン)が無く、記事の内容(コンテンツ)だけを登録し、APIによって取り出されるというものです。ヘッドレスCMSの場合、その都度デザインを作らないといけませんが、反面、自由です。ヘッドレスCMS提供サービスは、Contentful、microCMS、Strapi、などいろいろあります。
【 Strapi 】
ヘッドレスCMSの一つですが、クラウドのWebサービスのみならず、ソースコードが公開されているため、それを利用し、自分が管理しているサーバーにヘッドレスCMS、APIを構築できます。
今回の検証環境は、
Ubuntu 20.04.2 LTS
node v14.17.2
になります。
ソースコードの解説は行いません。
Google reCAPTCHAは、設定済みで、キーは取得済みとします。
Node.jsインストール
root権限で作業していますので、全てsudoは省略しています。
パッケージを最新にします。※必須ではありません。
# apt update
# apt upgrade
Do you want to continue? [Y/n]Y
※以降基本的にYのため、-yを付けます。
-y は、? [Y/n]: のようなときに自動的に y とするオプションです。
curlをインストールします。
# apt install -y curl
node 14.x をインストールします。
# curl -sL https://deb.nodesource.com/setup_14.x -o nodesource_setup.sh
# bash nodesource_setup.sh
# apt install -y nodejs
# node -v
v14.17.2
node
のバージョンはインストール時期によって異なります。
Node.jsのパッケージ管理システム
npm
も同時にインストールされます。
Strapiインストール
空の状態のStrapiをインストールします。
今回、/home/admin/mycorporation_backend
にインストールします。
# cd /home/admin
# npx create-strapi-app mycorporation_backend --quickstart
→そのまま起動してくるため、CTRL+Cで停止
【 npx 】
npm
で管理されたプログラムの一つです。npx
を使うと、オンメモリで依存関係を解決した状態で、引数に指定したプログラムを実行できます。ディスクを汚さず、一度きりしか実行しないプログラムを実行するのに向いています。
Webサイトソースコードの配置
ソースコード展開
https://github.com/itc-lab/itccorporation からソースコードをダウンロードして、独自プロジェクトとします。
Code → Download ZIP で itccorporation-master.zip をダウンロードします。
ソースコードを展開し、ディレクトリをリネームします。
※ここでは、/home/admin/mycorporation_frontend
とします。
# cd /home/admin
# unzip itccorporation-master.zip
# mv itccorporation-master mycorporation_frontend
# cd mycorporation_frontend
環境変数変更
環境変数を自分の環境に合わせます。
# cp .env.local.example .env.local
# vi .env.local
GRAPHQL_API=http://localhost:1337/graphql
NEXT_PUBLIC_RECAPTCHA_SITE_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
GRAPHQL_API
今回、1337ポートで動くStrapiの機能を利用するため、http://localhost:1337/graphql
のままにします。
NEXT_PUBLIC_RECAPTCHA_SITE_KEY
Google reCAPTCHAの「サイトキーをコピーする」に表示される文字列です。
環境変数変更
以下の図のようにシンボリックリンクを作成します。uploads
ディレクトリは、Strapiからアップロードした画像ファイルが格納されるディレクトリになります。
# ln -s /home/admin/mycorporation_backend/public/uploads public/uploads
Strapi初期設定
Strapiを起動します。
# cd /home/admin/mycorporation_backend
# npm run develop
何も設定変更していない時は、1337ポートで起動します。
ブラウザから http://[Strapiを起動したサーバーのIPアドレス]:1337
にて、アクセスします。
「Create the first administrator」をクリックします。
「First name」「Last name」「Email」「Password」「Confirmation Password」を入力し、「LET'S START」をクリックします。
※「Email」は、ログインIDに使われます。メールの設定をしない場合、メールは送信されません。
Strapiでデータスキーマ作成
Strapiでスキーマ(空のテーブル)を作成していきます。
「Content-Types Builder」をクリックします。
「+Create new collection type」をクリックします。
「Display name」のところに "Available" と入力し、「Continue」ボタンをクリックします。
→DBで言うAvailableテーブルを作成するイメージです。
「Text」をクリックします。
「Name」のところに "name" と入力し、「Short text」にチェックを入れて、「+ Add another field」ボタンをクリックします。
「Media」をクリックします。
「Name」のところに "logo" と入力し、「Single media」にチェックを入れて、「+ Add another field」ボタンをクリックします。
→単一画像を登録できるフィールドになります。
・・・以降、下記のスキーマの通りに作成します。
(Textは全て「Short text」、Mediaは全て「Single media」です。)
Relationのところは、以下のように、左側に "seo_Images" を入力して、右矢印が複数のアイコンを選択、右側で Seo-Image を選択します。
→これにより、OpenGraphテーブルのseo_imagesフィールドは、Seo-Imagesテーブルの複数のデータに紐づけが可能になります。
Twitterは、「SINGLE TYPE」→「Create new single type」で作成します。
スキーマ
Strapiでデータ登録
データを登録していきます。
「Availales」をクリックし、「Add New Availables」をクリックします。※作ったのは「Available」テーブルですが、自動的に複数形表示になります。
「Name」:Strapi
「Description」:ストラピ
「Priority」:1
「Logo」:Strapiのロゴ画像をドラッグ&ドロップ
とし、「Save」ボタンをクリックします。
「Publish」ボタンをクリックします。
→「Publish」ボタンを押さないと有効化されませんので、毎回忘れずに押します。
他、以下のように登録していきます。
OpenGraphsの「Seo_images」のところですが、Seo-imageテーブルのデータと紐づけるため、選択します。(複数選択可能です。)
GraphQL有効化
GraphQLインストール
【 GraphQL 】
「GraphQL」とは、Facebookにより開発されたAPI用のクエリ言語です。似たものとして、「REST」がありますが、「GraphQL」の方は、"全部"では無く、"これとこれとこれ"という感じで、あらかじめ対象データを指定して、命令を出せるという特徴があります。
「Marketplace」をクリックし、「GRAPHQL」のところの「Download」ボタンをクリックします。
→しばらくすると、StrapiにGraphQL機能が組み込まれます。
http://[StrapiのサーバーIPアドレス]/graphql
にアクセスすると、クエリを発行してテストすることができます。
→この時点では、「Forbidden」が返り、うまくいきません。Strapi側のアクセス権の設定が必要です。
アクセス権の設定
「Settings」→「Roles」→「Public」をクリックします。
「find」、「findone」チェックボックス全てにチェックを入れて、「Save」ボタンをクリックします。
再び、http://[StrapiのサーバーIPアドレス]/graphql
にアクセスし、クエリを実行すると、データが取り出せることが確認できます。
動作確認
Strapiが起動(
npm run develop
)したままで下記の実施が必要です。起動していない場合、データの取り出しに失敗します。
Webサイトのプログラムの方へ戻って、npm install
を実行します。
→これにより、package.json
に書かれた必要なもの全てが自動的にインストールされます。
# cd /home/admin/mycorporation_frontend
# npm install
インストールが終わったら、起動します。
# npm run dev
http://[IPアドレス]:3000/
でアクセスします。
表示されました!
Webサーバーへデプロイ
Webサーバーへデプロイは簡単です。
# npm run build
を実行すると、カレントディレクトリに out ディレクトリができますので、これをドキュメントルートへ移動するだけになります。
→例えば、mv out /var/www/html
のようにWebサーバーが参照する場所に置くだけになります。
https://[WebサイトのFQDN]/
でアクセスします。
できました!
その他、宣伝、誹謗中傷等、当方が不適切と判断した書き込みは、理由の如何を問わず、投稿者に断りなく削除します。
書き込み内容について、一切の責任を負いません。
このコメント機能は、予告無く廃止する可能性があります。ご了承ください。
コメントの削除をご依頼の場合はTwitterのDM等でご連絡ください。