互換性
「X は動くか」は、たいてい「ブラウザのタブが用意できないものを要るか」で決まります。測っている数字と、動かないものとその理由を、両方載せます。数字は2026年10月24日時点の実測です。
- Node.js テスト
- 91.8%
- Node.js v22.23.4 自身の試験 1,151 / 1,254 本
- Astro ビルド
- 131 / 147
- 公式の例とよく使われるテーマを install・build
Node.js テストスイート(test/parallel)
対象は、OpenVessel が扱うモジュールの、Node.js 自身の test/parallel です。本物の Node.js(Linux)で通る試験だけを数え、ブラウザでは通せない試験は理由と一緒に除外の一覧に書きます。それ以外のすべてが目標です。
fs146 / 173 84.4%
stream157 / 166 94.6%
worker_threads118 / 118 100%
crypto90 / 98 91.8%
child_process94 / 94 100%
vm75 / 89 84.3%
process73 / 73 100%
buffer52 / 61 85.2%
zlib57 / 60 95%
timers41 / 47 87.2%
試験の多いモジュールから10個。ほかに events・path・os・querystring・url・readline など。
Astro サイトのビルド検証
Astro 5・6・7 の公式の例と、よく使われるテーマ 147 本を、それぞれ npm install と build まで流しています。
Astro 742 / 49 85.7%
Astro 642 / 46 91.3%
Astro 547 / 52 90.4%
ブラウザは Chromium 系(Chrome・Edge など)が対象です。SharedArrayBuffer を使うので、クロスオリジン分離が要ります。
ブラウザ環境の制約
作業が足りないのではなく、場の制約です。どれにも、ブラウザのタブが課す理由があります。
通信
| HTTP 以外の、外への生の TCP(DB・SMTP・SSH・Redis など) | Web ページはソケットを開けない |
| クロスオリジンを許さない相手への要求 | 外への要求はブラウザの fetch で出すので、CORS がかかる |
| UDP(dgram)・生の DNS | ブラウザに UDP は無い |
| 実際のポートでの待ち受け | タブの外からはつなげない(仮想ポートで待ち受ける) |
ネイティブのコード
| ネイティブのアドオン(.node) | ブラウザは機械語を読み込めない(WebAssembly 版か互換パッケージで補う) |
| workerd(Cloudflare の実行系) | V8 を抱えた C++ のプログラムで、WebAssembly にできない |
| ヘッドレスブラウザ(Playwright・Puppeteer のブラウザ) | ブラウザのバイナリは、ブラウザの中では動かない |
JavaScript のエンジン
| await をまたぐ AsyncLocalStorage | ブラウザが V8 の promise hooks を出していない |
| vm の timeout | 同期の JavaScript は外から止められない |
| inspector・ヒープのスナップショット | つなぐ先の V8 の inspector が無い |
OS
| ユーザー・グループ・権限 | メモリ上のファイルシステムのユーザーは1人 |
| node・シェル・coreutils・パッケージマネージャ以外のプログラム(git・python など) | カーネル向けに書いたプログラムしか無い |