OpenVessel

互換性

「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%

ビルドできないサイトのおもな理由は、外への要求が CORS で止まるもの(Google Fonts の一覧・RSS など)、Cloudflare の workerd が要るもの、ヘッドレスブラウザで図を描くもの、環境変数などリポジトリに無い準備が要るものです。

ブラウザは 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 など)カーネル向けに書いたプログラムしか無い