blog.naokihaba.com

2026 年 10 月の OSS 活動

10 月は、Vite+ と vite-task の不具合を直したほかに、Vite+ を使う他のプロジェクトにも PR を出した。また、10 月 24 日に Vue Fes Japan 2026 で「Vite+への貢献と、Team Memberになって見えてきた風景」という題で話した。資料は Docswell にあり、スピーカーノートは Zenn(日本語)と DEV(英語)にある。

voidzero-dev/vite-plus

fix(config): skip git config writes that change nothing (#2958)

vp config は、実行するたびに git config に 4 回書き込んでいた。値が変わらないときも書き込む。書き込むたびに .git/config.lock を取るので、linked worktree で同時に実行すると、遅いほうが could not lock config file で失敗した(#2849)。この PR で、先に現在の値を読み、値が同じなら書き込まないようにした。

ただし、clone した直後の初回の実行では、値を書く必要がある。そのため、初回の実行が同時に起きると、まだ失敗する。この問題は、待って再試行する仕組みが必要で、その設計には別の判断が必要なので、次の PR に分けた。

fix(config): wait for a shared git config lock on first run (#3199)

#2958 の続きである(#2959)。Git 2.55 以前の git config は、ロックが解放されるまで待たない。そこで、vp config がロックのために失敗した書き込みを再試行するようにした。最初は 50 ms 待ち、その後は待つ時間を 2 倍にして、最大 5 回再試行する。再試行の前に値を読み、他の worktree が同じ値をすでに書いていれば、書き込まずに成功として終わる。待つ時間は合計で最大 1.55 秒である。

fix(env): call Nushell built-ins with the % sigil in env.nu (#3123)

Nushell で def update [] のように組み込みコマンドと同じ名前のコマンドを定義すると、Nushell が起動しなくなるという報告があった(#3092)。Nushell はパースの時点でコマンド名を解決し、Vite+ の env.nu をユーザーの設定の後に読む。そのため、env.nu の中の update がユーザーのコマンドを呼び、引数が合わずに nu::parser::extra_positional で止まる。

env.nu で、組み込みコマンドを % sigil を付けて呼ぶようにした(例: %update)。% sigil は Nushell 0.112.1 で追加されたので、それより前の版はパースできない。そこで、vp env setup が PATH 上の nu のバージョンを確かめ、0.112.1 以降のときだけ sigil を付けるようにした。

fix(cli): set package-manager lifecycle env for vp run (#2895)

止まっていた #2385 を引き継いだ PR である(#2897)。fengmk2 と話して私が引き継ぐことにし、#2385 の変更を取り込んでコンフリクトを解消した。#2398 で PackageManager のフィールド名が install_dir から bin_prefix に変わり、#2385 は CI のビルドで失敗していた。その参照とテストを現在の API に合わせた。

voidzero-dev/vite-task

fix(reporter): wait and retry when task output forwarding hits EAGAIN (#801)

CI のように vp run の出力をパイプに渡しているときに、2 つのタスクを同時に実行すると、すべてのタスクが止まることがあった(#782、vite-plus#2824)。再現用のリポジトリを作り、Vite+ v1.0.0 で再現した。

  1. Node.js のタスクが、共有している出力先を O_NONBLOCK にする。そのため、vp の fd 1 もノンブロッキングになる。
  2. もう一つのタスクが大量のログを出し、vp がそれをパイプに書く。
  3. パイプのバッファがすぐにいっぱいになる。
  4. vp の write が、待たずに EAGAIN を返す。
  5. vp がこれを致命的なエラーとして扱い、すべてのタスクを止める。

この PR で、write か flush が WouldBlock を返したときは、待って再試行するようにした。ターミナル、ファイル、ブロッキングのパイプへの出力では WouldBlock は起きないので、動作は変わらない。

nuxt-modules/storybook

fix(addon): use Nuxt’s app context for Nuxt 4.6 compatibility (#1139)

Nuxt 4.6.0 で、ブラウザーの Nuxt のインスタンスを保存する場所が unctx から globalThis.__nuxt_app_ctx__ に変わった(nuxt/nuxt#36371)。この addon は unctx に直接インスタンスを登録していたので、Nuxt 4.6 では useNuxtApp() がインスタンスを見つけられず、NUXT_E1001 を投げた(#1138)。#app/nuxt の getNuxtAppCtx を使うように変え、不要になった unctx の依存を削除した。

chibivue-land/chibivue

docs: update setup commands for Vite+ integration (#657)

chibivue は Vite+ に移行したが、日本語のセットアップのページは古い pnpm のコマンドのままで、手順のとおりに進めると失敗した。ページのコマンドを vp に更新し、Vite+ が必要であることを書いた。