Repo-lab
開発ツール

scriptcとは?TypeScriptをNode不要のネイティブバイナリに変換するVercel製コンパイラ

⭐ 1,627 stars GitHub →

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のオンラインコースもおすすめです。

毎日更新のGitHubツール情報

LINEで受け取って最新情報をキャッチアップしよう

友達追加する(無料)

関連記事

この記事が役に立ったらシェアしてください