Music. Technology. Pixels. A cup of tea
このブログを生成しているSSG (Static Site Generator) をHugoからNext.jsに移行しました.
Next.jsで実装した箇所のソースコードについてはいずれGitHubに公開する予定です.以下ではこれらの実装について軽くですが説明します(ソースコード公開時にもう少し詳しく記述する予定です).
ここではタグを例として説明します.チュートリアルにもある各記事を表すページposts/[id].tsx
のようにタグごとのページtags/[tag].tsx
を作ります.getStaticPaths
が各タグのパスを返すようにすれば良いです.全ての記事データからタグを抽出・列挙する補助関数を定義して利用すれば実現可能です.
現在何記事目まで表示しているかは「状態」であるため,useState
を使います.次または前のページを選びたい場合はsetState(状態±ページ毎の記事数)
[1]として状態を変化させ,現在の状態(すなわち表示する記事の番号)で描画されるべき記事を描画すれば良いです.
記事のメタデータを取得する際に本文も取得し,markdown-to-textを使って不要なmarkdown部分を除去し,先頭N文字を取得しています.手動で要約したものがある場合はメタデータに記載されているため,この処理をスキップします.
数式表示は以前はMathJaxを使っていましたが,重かったのでに変えました.チュートリアルではmarkdown解釈ライブラリとしてremarkを使っていますが,remarkのプラグインがうまく動作しなかったため,markdownをmarkdown-itでパースするように変更しています.markdown-itプラグインを使うことでこれら二つは実現できました.
これも状態なのでuseState
を使って切り替えます.初訪問ではデバイス側の指定を読み取って設定し,次回以降は設定値をlocalStorageに格納することで選択を記憶します.html要素のカスタムデータ属性に値を格納してCSS側でその値によってスタイルを切り替える[2]ことで,デザインを切り替えることができます.
Next.jsと相性の良いライブラリがいくつか存在するようですが,今回はそれらを使用せずCSSでアニメーションさせました.Router.events.onでページ切り替えイベントを登録できるため,アニメーションさせる要素のクラス名などをこのタイミングで切り替えることで,ページが切り替わる際にアニメーションを再生させることが可能です.