🧊

2025年前半の振り返り

時の流れは早いもので、もう折り返し。

梅雨もいつの間にか終わってるし!外はもう夏!灼熱地獄!

さて。

01月

仕事では、Next.jsとAstroの比較みたいなことをよくしてた覚えがある。

会社的には、結局のところSSGが主戦場になるので、基本的にはAstroでやることが多い。というかReactが別にいらないってなる。

けど、RSCも使えるようになってDXも変わってるし、たまに動的なページも欲しいことはあるし、実は今ならNext.jsでもいいのでは?と思い。 あとはやっぱ「Next.jsを検討してます〜」的なクライアントが多いのも実情としてある。

静的サイトジェネレータとしてのNext.js App Router | Memory ice cubes https://leaysgur.github.io/posts/2025/01/27/092003/

結論としては、0JSくらいのカリカリなパフォーマンスを目指したいなら採用できないけど、まあ一般的なユースケースにおいては全然いけるな〜って感想。

むしろ、コンポーネントはReact製のものが既にあるのでそれを使いたいです!系の案件だと、Astroのほうがしんどいイメージさえある。 .astro.jsxの境界でめちゃめちゃ苦しむことになるし、Contextも共有できないので。

余談: 年明けの瞬間に近所で花火が打ち上がって、そんな文化あんのか?!って普通に驚いた。

02月

OXCでPrettierの移植をやってた。

この頃は、カバレッジテストみたいな足回りの整備と、現状の進捗の可視化に勤しんでた覚えがある。

Prettierのコードを読んで、どこまで実装できてて、何が足りてなくて、みたいなものをひたすらに洗う地道な作業。

後述するけど、最新情報では、PrettierのコードをRustにそのまま移植する方向性はやめることになってます。

余談: 1㍍の雪だるま⛄️が作れるくらい雪が降ってなかなか良かった。

03月

PrettierのRust移植を諦めた我々が次に向かったのは、BiomeのFormatterのコードを再利用すること・・・。

って、実はこれ去年にも同じことをやろうとしてた。

Biome Formatterのコードを読む Part 3 | Memory ice cubes https://leaysgur.github.io/posts/2024/11/18/094616/

その時はすっぱり諦めたけど、Biomeチームの偉大な先人たちから提案されたので、改めて調べてたというわけ。

そういうわけで、改めてbiome_formatter crateをそのまま利用できないか?という検証をしてた。

結果としては、あれはBiomeのCST/ASTがやはり必須のもので、そのままOXC ASTで利用するのは無理だという結論になった。

となると、

  • コードをfork、コピーして再利用できるようがんばるのか
  • やはりPrettierのコードを移植する道に戻るのか

ということになり、またそれを調査し検討し・・・、前者になった。

という結論に至ったまでは良かったが、実際にこれをやりきるには自分のRust力が足りず、他の人に頼むことになった。

biome_formatterbiome_js_formatterは、traitやらライフタイムやらRustの難しさがふんだんに絡みあった構成になってて、OXCのASTとライフタイムの兼ね合いをよしなにするのが本当に難しかった。 巷で話題のClaudeCodeとも一緒に頑張ってはみたけど、まあ〜成果はなかった。

仕事では長らく味わったことのない挫折そして無力さを実感する日々だった。悔しい。

余談: そんな無力なおじさんは、今年で38歳になりましたとさ・・・。

04月

次なるOXCネタとしては、RustのASTを、@typescript-eslint/typescript-estreeフォーマットに対応するのを手伝ってた。

TypeScriptのASTにももちろん統一フォーマットなんてなくて、世にはいくつか流派がある。

  • TypeScript本家のAST
    • 本家だが、ESTreeとは全然違う
  • BabelでTSプラグインを有効にしたAST
    • BabelのJS ASTに似てて、実績あり
  • @typescript-eslint/typescript-estree
    • ESTreeをベースにしてる
    • typescript-eslintで使われてる
  • @sveltejs/acorn-typescript
    • ESTreeをベースにしてる(が、すべての文法をカバーできてない)
    • Svelteのコンパイラ内で使われてる

というあたりがメジャーかな?あとはSWCとかもあるか。

OXCとしては、既にJS ASTをESTreeにあわせてるので、TSもTS-ESTree(@typescript-eslint/typescript-estree)にするのは、まあ妥当な流れかと。

詳細は割愛するけど、これがまたなかなかクセのあるフォーマットで、その対応は思いのほか大変だった。

こういう書き捨てのViewerを作ったりしてた。(フロントエンドできるとこういう時に便利ね)

leaysgur/oxc_estree_ts-ast-diff-viewer https://github.com/leaysgur/oxc_estree_ts-ast-diff-viewer/

なんやかんや、ts-eslintチーム側にもフィードバックしたりしつつ、最終的にはできました!って感じのステータス。

その結果、PrettierでもOXCがプラグインから使えるようにもなってめでたしめでたし。

Prettier 3.6: Experimental fast CLI and new OXC and Hermes plugins! · Prettier https://prettier.io/blog/2025/06/23/3.6.0#javascript

OXCが真に(TS)ESTree互換を表明するためには、まだloclinecolumnが足りてないけど、これはまだ少し時間がかかりそう。

AST nodes with loc and/or range fields. · Issue #10307 · oxc-project/oxc https://github.com/oxc-project/oxc/issues/10307

余談: 久々に東京にいって、軽い気持ちで築地から表参道まで歩いてみたら、後で膝が崩壊した。

05月

散々いろんなASTを見てきた集大成として、単一ソースから複数ASTを並列で確認できるやつを作ってた。

leaysgur/js-multi-ast-viewer https://github.com/leaysgur/js-multi-ast-viewer

AST Viewerは世にいろいろあれど、side-by-sideで比較できるやつはまだなかったと思うので、個人的に便利なやつになった。

マニアックすぎて伝わらんけど、@typescript-eslint/typescript-estreeをブラウザで動かしつつ、TSCの型エラーを拾えるようにするerrorOnTypeScriptSyntacticAndSemanticIssuesを有効にできるよう頑張ったのがポイント。

あとはOXCで、パーサーのパフォーマンス向上タスクをぽつぽつ拾ってた。

parser: use checkpoints instead of token lookahead · Issue #11194 · oxc-project/oxc https://github.com/oxc-project/oxc/issues/11194

一般的なパーサーの実装パターンとして、トークンを先読みして、どの文法か判断するのはよくあること。 けど、先読みした結果、思ってたのと違うな・・・ってなると、それまでの状態をロールバックしないといけなくて、それがパフォーマンスに響く。

これを極力減らしたい!数msでも早くしたい!というOXCらしいモチベーション。

ちなみにJSだけをパースするなら、実は先読みはいらないらしい。(通称Cover Grammarのおかげ) しかし問題はTSとTSXで、<>をよしなに判断するために、先読みするしかなくなったという歴史的な経緯を教えてもらった。

そんなこんなで参考になるかと思い、チューニングされ尽くしたと言われるTypeScript Compilerのパーサーのコードをずっと読んでた。checker.tsに比べるとparser.tsは行数が少なくて良いです。(感覚が麻痺してる)

余談: 関西に引越してから1年経ってた!

06月

TypeScript Compilerを読んでたら、次はTSパーサーのカバレッジを改善することになってた。

parser: Improve TS error story · Issue #11582 · oxc-project/oxc https://github.com/oxc-project/oxc/issues/11582

現状、パーサーのカバレッジを取るために、TSCのスナップショットテストの元コードをパースしてる。

ただ、TSCのスナップショットなので、正常系はもちろん、そこにはいろんなエラーが記録されてる。

それこそ、OXCでは対応しないような、

  • コンパイラーの設定によるもの
  • 型推論によるもの
  • 複数ファイルが組み合わさって起こるもの
  • etc…

こういうのが今は全部、「エラーになるはずなのに、なってない!」と報告されちゃってるので、これをなんとかするというもの。

そういうわけで、最近はどうにかこの無視したいエラーたちを機械的に導出できないかを試行錯誤してた。 まあ最終的には、OXCの事情を機械的に割り出す方法などない・・・って結論となり、地道にエラーコードをレビューすることにして、そのためのアプリをまた作ってた。

leaysgur/tsc-error_diagnostic_codes-viewer https://github.com/leaysgur/tsc-error_diagnostic_codes-viewer/

ちなみにこれはClaudeCodeと一緒にシュッと書いてみたけど、書き捨てアプリとAIの相性はとってもよいなと思った。

それにしても、Unified TS fixturesはどっかにないもんなのか。

そういえばoxlintもv1が無事にリリースされて、リリースポストに名前を載せていただき恐悦至極です!

Announcing Oxlint 1.0 | VoidZero https://voidzero.dev/posts/announcing-oxlint-1-stable#acknowledgements

余談: “直感LLM”って本を空き時間に読んでるけどいい感じ、やっぱ仕組みもわからず道具を使うのはよくないなって。

後半は

去年に引き続き本業は凪いでいて、副業も最近は落ち着いてしまい、ほとんどフルタイムOSS Devみたいになってた。

ただそのおかげでVueFesから登壇依頼を受けたりと、まあ色々やり続けてると色々あるのだなぁって感じ。

Vue Fes Japan 2025 - Speaker https://vuefes.jp/2025/en/speaker

このブログは半年で23記事書いてたらしい。

後半も、技術”文書”はもうAIのせいでどうしようもないとしても、せめてAIには書けない”文章”を、自己満足で書いていきたいところ。