scriptcとは?TypeScriptをNode不要のネイティブバイナリに変換するVercel製コンパイラ
TypeScriptで書いたコードがNode.jsなしに動く——そんな未来をVercel Labsが実現しつつあります。 scriptcは、既存のTypeScriptをそのままネイティブバイナリへコンパイルする新世代ツールです。 GitHub上で急上昇し、リリースから短期間で1,600以上のスターを獲得しています。
scriptcとは何か?ゼロランタイムTypeScriptの衝撃
scriptcは「Zero-runtime TypeScript」をコンセプトに掲げるTypeScript→ネイティブバイナリコンパイラです。
通常のTypeScriptコードをscriptc buildコマンド一つでコンパイルすると、Node.js・V8・JavaScriptエンジンを一切含まない自己完結型のネイティブ実行ファイルが生成されます。
$ scriptc build fib.ts && ls -la fib
-rwxr-xr-x 178K fib # Node不要のネイティブバイナリ(起動~2ms)
コードの変更は一切不要です。アノテーションも専用の方言も必要なく、Node.jsで動かしていたTypeScriptがそのままコンパイルできます。
scriptcのパフォーマンス:Node.jsと比較して何が変わるか
起動速度・バイナリサイズ・メモリ使用量の比較
| 指標 | scriptc | Node.js | Go | Rust/Zig |
|---|---|---|---|---|
| 起動時間 | ~2.4ms | ~47ms | ~数ms | ~2ms前後 |
| バイナリサイズ | 170〜200KB(静的) | 60〜100MB(SEA) | ~2MB | ~数MB |
| メモリ(RSS) | 1〜4MB | 67〜116MB | 〜数十MB | 〜数MB |
Node.jsと比べると起動速度は約20倍速く、メモリは約30〜60倍少ないというのは驚異的な数値です。 ZigやRustと同等の起動パフォーマンスを、TypeScriptのまま実現できる点が最大の魅力です。
3層コンパイル戦略:静的・動的・拒否の明確な分離
scriptcはすべてのコードを3つに分類します:
静的コンパイル(デフォルト)
クラス・クロージャ・ジェネリクス・async/await・デストラクチャリングなど、TypeScriptの主要構文はネイティブコードに変換されます。
動的実行(--dynamicオプション)
npmパッケージやany型のコードには、625KBの軽量JSエンジン(quickjs-ng)が埋め込まれます。
静的側との境界では型チェックが実行時に行われ、型の嘘をついた値はTypeErrorを投げます。
拒否(具体的なエラーとリライトヒント付き)
変換できないコードは具体的なエラーコードと修正ヒント付きで報告されます。サイレントな誤コンパイルは一切ありません。
インストールと基本的な使い方
インストール
$ npm install -g scriptc
注意: macOS では Xcode Command Line Tools(clang)が必要です。
$ xcode-select --install # macOS の場合
基本操作
# スクリプトをそのまま実行(Node互換)
$ scriptc run app.ts
# ネイティブバイナリにビルド
$ scriptc build app.ts
# 静的変換率と未対応箇所を確認
$ scriptc coverage app.ts
カバレッジ確認で変換率を把握する
scriptc coverageコマンドは、どの部分が静的コンパイルされ、どこがブロッカーなのかを明示します:
$ scriptc coverage app.ts
statements analyzed 4481
compile statically 4451 (99%)
blockers:
×2 functions with optional parameters as values SC1090
×1 Promise.reject SC2020
このように、変換可能な部分の割合と未対応箇所のエラーコードが表示されるため、段階的な移行計画が立てやすくなっています。
npmパッケージとのDockerデプロイ活用例
--dynamicオプションでnpm依存パッケージをバイナリに埋め込み、Dockerイメージを大幅に軽量化できます:
# Express等のnpmパッケージも含めてビルド
$ scriptc build --dynamic server.ts
# 生成されたバイナリのサイズ確認
$ ls -lh server
-rwxr-xr-x 3.2M server # node_modulesなしで動く単一バイナリ
通常のNode.jsアプリをDockerにデプロイする場合、node_modulesを含めると100MB超になりがちですが、scriptcなら3MB程度に圧縮できます。
Node.jsとの違い・なぜ今scriptcなのか
scriptcが既存ツールと異なる点
| ツール | 違い |
|---|---|
| Node.js | ランタイム(V8)が必要。コンテナ・Lambda等でコールドスタートが遅い |
| Bun | 依然としてJSエンジン(JavaScriptCore)を内包。バイナリに依存が必要 |
| Deno | V8をバンドル。単一バイナリも可能だが100MB前後 |
| Go/Rust | ネイティブだがTypeScriptの型システム・エコシステムを使えない |
| scriptc | TypeScriptのまま→真のネイティブバイナリ(エンジン不要) |
特に**サーバーレス環境・Kubernetes・組み込みLinux(OpenWrt等)**でのコールドスタート問題を解決したい場合、scriptcは強力な選択肢です。
こんな人に向いている
バックエンドエンジニア(TypeScript製APIサーバー開発者)
Lambdaや Cloud Run でNode.jsのコールドスタートを悩んでいるエンジニアに最適です。 既存のTypeScriptコードベースをゼロ変更でネイティブバイナリ化し、起動時間を10〜20倍短縮できます。
CLIツール開発者
npm install不要で動くシングルバイナリCLIを配布したい場合、scriptcは理想的です。
GoやRustへの移植コストなしに、TypeScriptのまま配布可能なバイナリが作れます。
DevOpsエンジニア(コンテナ軽量化担当)
Dockerイメージに含まれるNode.jsランタイムとnode_modulesを排除することで、 イメージサイズをGB・数百MBから数MBレベルに削減できます。
使う前に知っておきたいこと
プラットフォーム制限
- macOS arm64(Apple Silicon)がプライマリプラットフォーム。Linux・Windowsはクロスコンパイルで対応
- macOS では
clang(Xcode Command Line Tools)が必須 - Windowsビルドは
v0.0.17から正式対応(2026-07-27)
現時点の制限事項
- **v0.0.17(2026-07-27現在)**はまだアルファ段階。本番環境への適用は慎重に
- 一部のnpm依存パッケージは
--dynamicなしでは動作しない場合がある(Issue: named re-exports問題) --ffi(ネイティブFFI)は現時点でexperimental扱い
ライセンス
リポジトリを確認すると商用利用前にLICENSEファイルの確認を推奨します。
まとめ:TypeScriptネイティブ時代の幕開け
scriptcはまだアルファ版ですが、TypeScriptをGoやRustに匹敵する速度で実行できる可能性を示しており、 サーバーレス・CLIツール・組み込み環境など幅広い用途に革命をもたらす可能性があります。 既存TypeScriptプロジェクトへのゼロコスト移行という価値は非常に大きく、今後の進化に注目が集まっています。
詳しくは公式GitHubリポジトリ(vercel-labs/scriptc)をご確認ください。
関連ツール・おすすめサービス
- DigitalOcean — 開発者向けクラウド・App PlatformでDockerアプリをかんたんデプロイ
この技術を学ぶ
DevToolに興味を持った方には、Udemyのオンラインコースもおすすめです。
- 🎓 関連するDevToolコース一覧 — セール時(最大90%OFF)を狙うとお得です
関連記事
この記事が役に立ったらシェアしてください