カラーモード

より小さく

diary
JavaScript
Node.js

リポジトリのメンテナンスで最も憂鬱なのは、依存パッケージをアップデートする時間であることは疑う余地もない。dependabot や renovate を溜め込んでいる人も少なくないだろう。

プライベートのリポジトリならまぁ無視してもいいだろうが、OSS や仕事のリポジトリなるとそうもいかない。毎週のようにそれなりに時間を使うことになる。わたしは依存パッケージをアップデートするべきだと思っているので仕事でも結構頑張ってやっている。

アップデートをするべきか否かの議論は他の著名な開発者に譲るとして、わたしとしては根本的に依存パッケージを減らしていくことを推奨したい。ライブラリを利用すると便利ではあるが、その便利さを丸ごと利用しなければならない仕事はそうそうない。いつでもどんなリポジトリでもそうできるとは限らないが、減らせるなら減らすべきだ。

その思想を体現すべく、dskd で使っていた fast-globgray-matter をビルドスクリプトから取り除いた。前者は Node.js に含まれる fs.globSync() で代替可能になった。後者はややハードコーディングになるが自前の実装に置き換えられた。

結局手元で目的通りに動けばいいのだから、元のライブラリより置き換えコードは短くて済む。ビルド全体としてエラーが分かればいいのでテストもエラー処理も書いていない。とはいえハマりポイントもある。

例えば fast-glob は戻り値が文字列の配列だが、 fs.globSync() は戻り値が Promise の文字列配列(厳密な表現ではない)なので、そのまま .map() で繋いでも処理できない。なので Array.fromAsync() をかますと .map() できるようになる。

import fs from "node:fs";

const md_tmp1 = await fs.globSync("src/md/**/*.md");
const md_tmp2 = await Array.fromAsync(md_tmp1); // ここで
const md = md_tmp2.map((item) => ...);

ちなみに上記のようなコードをプライベートで書くとき、一時的な変数が鬱陶しいので関数を入れ子にしてしまうことが多い。

import fs from "node:fs";

const md = (await Array.fromAsync(await fs.globSync("src/md/**/*.md"))).map((item) => ...);

このやり方は好き嫌いがありそうなのでスルーしてもいい。


そんなわけで、dskd のビルドの依存パッケージは markedpug だけになった。

もっと小さくしたいが、marked はライブラリの実装を見て諦めた。pug はHTMLがテンプレート機能をネイティブで搭載したら置き換え可能だろうが、今のところは無理そうだ。

なんならHTMLが <foreignObject> として markdown をレンダリングできるようになってくれたらいいのにと思う。