個人サイトをAstroJSで書き直した
個人サイトをAstroJSで作り直した
またやった。
コンテンツ本体の管理は組み込みのastro:content
を使っている。
CSS
Astroはデータ属性とセレクタを組み合わせることで.astro
ファイル内にCSSの適用領域を限定している:hover
の扱いに苦労するだとかをしなくて良い。
ただしMarkdownだけはこの仕組みに乗っかることは難しいのでglobal.css
でスタイルを書いている。
デザインはreset.css
を適用してから自分で手で書いた。
CSS変数を定義して0.5 rem
単位で調整してある程度一貫性を持たせるように努めたがすでに破綻しつつある。
Markdownのレンダリング
reamrk-sectionize
だけ導入した。タグがあるので対応した。
astro.config.js
を弄るだけで済む。
;
;
;
;
;
// https://astro.build/config
;
ブログページのプレビューテキストはreamrkでHTML化した文字列をjsdom
でパースして.window.document.body.textContet
を取得する力技で実装した。これより効率的な実装はあり得るが、どうせビルド時に行われることなので多分この実装が最適。
OG画像
satori
とReactで生成した画像をsharp
でWebPに変換している。getStaticPaths
をexportすればファイルをビルド時に生成出来るので便利だ。package.json
には含まれるが、ページに出力されるコンポーネントのロジックは全てVanilla JS(TS)で書いているので
エンドポイントのコードは下記のようになる。ogImage
はsatori
を使ってOG画像を生成する関数だ。satori
にReactのJSXとフォントデータを与えればSVGが文字列として出てくるのでsharp(Buffer.from(svg)).webp().toBuffer()
とするだけ。
;
RSS
@astrojs/rss
を使った。astro:content
のAPIでfrontmatterを取ってきてGETエンドポイントの形で書くだけ。
;
;
;
;
;
動的なページ変化
Reactは使っていない。 WebアプリケーションでもないのにReactを使うのはランタイムがデカすぎる。タグでshadow rootを宣言出来る機能)に対応していなかったのでShadow rootは使っていないし、大体SSGフレームワークを使っている以上カスタムタグを使える嬉しさもあまりない。
document.querySelector
するのでも別に良かった。
展望
Pagefindを使って検索機能を実装したいが、かなり扱いが難しい。
ページネーションも実装したい。記事が少ないうちに考えるようなことではない気がするが。