結局Astroに戻ってきた

QwikをやめてAstronに戻ってきた。Astro最高!

Qwikは好きです。resumableという概念は俺達の魂を震えさせる。が、しかしQwikはそれなりにバグに遭遇しやすい。特にSSGをしているとそう。それに静的サイトを作ることには特化していない。それはそう。

アイランドアーキテクチャのつらみを感じてQwikに移ったわけだったが、そもそも個人ブログでのイベントハンドリングは大したことがないのでベタ書きでも大して変わらなかった。とはいえ、アイランドアーキテクチャに対する問題意識は依然持っているため、そのうち適当な文章を書こうと思う。

Astroに戻るにあたり

A is for Astronaut | 点点公社
A is for Astronaut | 点点公社Astroでサイトを書き直したwww.haxibami.net
Next.jsでブログをつくった | 点点公社
Next.jsでブログをつくった | 点点公社自作ブログの実装についてwww.haxibami.net

参考にした

styling

Tailwind考 - uhyo/blog
Tailwind考 - uhyo/blog皆さんこんにちは。最近とある事情で Tailwind CSS にわりと真剣に向き合わないといけなくなった筆者です。 Tailwind CSSの話題は、Twitter…blog.uhy.ooo

生CSS。tailwindは好きだが、最近tailwindの運用の難しさを感じ始めている。

tailwindの利点としてはjsへの依存が少ない(静的解析はあるが、無くても動くしバンドルサイズも致命的なサイズになったりしない)こと、class名の部分にutilityを書けるのでcolocationがあること、あとは値に制限があるので割り切りを生みやすいことだろう。

jsへの依存の少なさは強力だ。新興フレームワークでも大体サポートされているvanilla-extractemotionそうはいかない)。これは単にtailwindが人気というだけではなく、ビルドシステムへの介入が少なく簡単に導入出来るからだろう。これははっきりと大きな利点ではある。あるが、astroはCSSを自動でdata-属性でスコーピングしてくれる。これで十分じゃないか?

colocationも嬉しい。私はラップトップでの作業が多いので画面を複数開かずに済むのは便利だ。とはいえコンポーネントのサイズを常識的な範囲に納めていれば、これもAstroのCSSで十分ワークする。そしてReactならinline styleのCSSフレームワークがある。文字列のclass名はやたら長くなりがち(まぁ@applyでまとめればいいんだけど)なのもあり、強いかと言われると微妙だ。

そして値に制限があることの利点が一番怪しい。フォントサイズやパディングは良いだろうが、色は非連続なだけで自由に選べてしまう。これはデザインシステムを整備すればこの限りではないが、規模が小さいうちからデザインシステムを整備するのはちょっと面倒。

いうわけでtailwindは剥がしてAstroのCSSだけで書いた。@layer使ってresetcomponentpatch3レイヤに分け、page内のスタイルはレイヤーなしとした。patchいう謎のレイヤーはMDXだとinline codeもcode blockも同じcodeタグとして処理されるので、pre直下にあるcodeタグのcomponentレベルのスタイルを上書きするために導入した。かなりad-hocなレイヤーだが、mdxをそのまま使っている以上仕方ない。名前的にad-hocなのが明らかだし、これはこれでいいかな。

URL設計

URL構造は変えた。あまり変えるべきじゃないが、ちょっと今までのURL構造に不満があったので最後の更新のつもりで再設計。投稿は/blogから/post名前を変更し、記事は全て西暦で分けることにした。ページネーションも導入し、/post/index.html廃止して/post/page/1リダイレクトさせた。ページネーションされたURLのみを採用したのはAstroのpaginate使いたかったから。本当に便利です。

SEOまわり

@astrojs/sitemapastro-seo導入。OpenGraphとX向けのタグはastro-seo提供し、JSON-LDデータはJSONを作る関数を書いてset:html導入。ArticleBreadcrumbsしか出していないが、他に出せるものもない。

RSS

sh
bun add @astrojs/rss

してrss.xml.tsGETハンドラを書くだけ。

OpenGraph 画像

@vercel/og使って素朴な画像を生成。フォントはローカルに持っておくと重いので都度Google Fontsからダウンロードするヘルパスクリプトを書いた。

emoji

:v: remark-gemoji

数式

remark-math + rehype-katexCSSとfontをいい感じにminifyしたいが……。

0=ejπ+1 0 = e^{-j\pi} + 1

TODO

  • Link card
  • サイト内検索(pagefindを使いvanillaで頑張る予定)
    • AstroのCSSと手でnodeを作ることの相性が微妙かも
  • いい感じの脚注
  • ページ内anchor
  • code blockのタイトル対応
  • dark-mode
  • 表と図のfigureと参照。これは欲しい
  • クライアント画面幅による画像出し分け