amp-listを使ってNext.jsの静的サイトに他のブログ記事への誘導をランダムでつける
TL;DR
ブログでよくある、関係のある記事をランダムで記事の一番下につけたかったのですが、静的サイトだとどうすればいいのかよくわかりませんでした。一つは毎回ServersideProps呼ぶ、ということだと思うんですが、それとgetStaticsPropsの併用、どうやるんだ?ってところでよくわからなくなりました。毎回サーバーサイドレンダリングしてると、遅くなりそうで嫌なので...
そこで、今回とったアプローチは、Next.jsでAPIをまず実装し、それをamp-listを使ってfetchしてその結果をレンダリングするというアプローチを取りました。
amp-listとamp-mustache
amp-listは、AMPの拡張コンポーネントでJSONエンドポイントから動的にデータを取得し、amp-mustacheのtemplateを使用してレンダリングを行うことができます。
公式ドキュメント(amp-list, amp-mustache)の例は以下の感じです。
使用しているJSONは以下
基本的には、<amp-list>内でレイアウトとエンドポイントを指定し、<template type="amp-mustache">内でどういうふうにレンダリングするかを決めます。
amp-mustacheでは、以下のように変数を利用できます。
- ただの変数
{{変数名}}
- 変数が存在していればレンダリング
{{#section}}{{/section}}
- 変数が存在していなければレンダリング
{{^section}}{{/section}}
JSX内でのテンプレート
JSX内ではこれらのテンプレートは
のように利用できます。
実装方針
これらのことから、/api/otherarticlesのようなエンドポイントを作成し、そこから
のようなものを返すことにします。
そうするとamp-listの実装は
のようにすればよいです。
APIの実装
Next.jsのAPIは、pages/api/下にtsなどのファイルを作ればエンドポイントが作成できます。
pages/api/otherarticles.js
のような感じです。
実際の実装では、Next.jsで作ってみたブログに検索機能を導入するのような感じでキャッシュを作成しておいて、そのキャッシュを参照してランダムな配列から規定数のファイルを取り出しています。このブログのその部分の実装はgithubにあります。