wterm:ZigとWASMで駆動する高速Webベース端末エミュレータ

はじめに

Webアプリケーション内で端末が必要だったことがあるなら—クラウドIDE、リモートシェルダッシュボード、インタラクティブチュートリアルのいずれであっても—wterm は待ち望んでいたツールです。Vercel Labs が開発した wterm は、ZigでコンパイルされたWebAssembly を使用してブラウザ上で動作するフル機能の端末エミュレータです。その小さなフットプリント(コアWASMバイナリは約12 KB)とネイティブに近いパフォーマンスにより、最新のWebスタックに最適です。


wterm が際立つ理由

機能 利点
Zig + WASM コア VT100/VT220/xterm エスケープシーケンスのほぼネイティブな解析速度。
プラグイン可能なコア 超軽量な Zig コア(約12 KB)またはフル機能の libghostty バックエンド(約400 KB)を選択し、完全な VT 準拠を実現します。
DOM レンダリング 追加ライブラリ不要で、ネイティブなテキスト選択、コピー/ペースト、ブラウザ検索、スクリーンリーダーのサポートを提供します。
フレームワークラッパー ReactVue 3、そしてバニラ JS API 用のすぐに使えるパッケージを提供します。
テーマ設定 CSS カスタムプロパティにより、Default、Solarized Dark、Monokai、Light のテーマを瞬時に切り替えられます。
WebSocket トランスポート バイナリフレーミングと自動再接続を備えたリモート PTY バックエンドに接続します。
自動リサイズ ResizeObserver を使用してコンテナサイズの変化に適応します。
スクロールバック & 代替画面 vimlesshtop などのアプリケーションを完全にサポートします。

これらの機能により、wterm はデモ以上の存在となり、あらゆるWebプロジェクトに組み込める本番対応コンポーネントです。


はじめに

前提条件

  • Zig 0.16.0以上(WASMコアのビルド用)
  • Node.js 20以上
  • pnpm 10以上(推奨パッケージマネージャ)

インストール

# Clone the repository
git clone https://github.com/vercel-labs/wterm.git
cd wterm

# Install JavaScript dependencies
pnpm install

WASM バイナリのビルド

zig build               # Debug build (default)
zig build -Doptimize=ReleaseSmall   # Production‑size build (~12 KB)
生成された wterm.wasm ファイルは web/ ディレクトリに配置され、静的アセットとして配信できます。

すべてのパッケージをビルド

pnpm run build   # Compiles @wterm/* packages and bundles examples

様々な環境での wterm の使用方法

1. バニラ JavaScript(DOM レンダラー)

<script type="module">
  import { createTerminal } from "https://cdn.jsdelivr.net/npm/@wterm/dom";
  const term = createTerminal({ wasmUrl: "/wterm.wasm" });
  term.attach(document.getElementById('terminal'));
</script>
<div id="terminal" style="height:400px; width:100%;"></div>
DOM レンダラーは、完全なクリップボードサポートとネイティブなテキスト選択を備えたシンプルな JS 端末を提供します。

2. React との統合

import { WTermReact } from "@wterm/react";

export default function App() {
  return (
    <WTermReact
      wasmUrl="/wterm.wasm"
      className="my-terminal"
      onData={data => console.log('User typed:', data)}
    />
  );
}
useTerminal フックを使うと、基盤となる PTY とやり取りし、コマンドを送信し、出力を監視できます。

3. Vue 3 コンポーネント

<template>
  <WTermVue :wasm-url="'/wterm.wasm'" />
</template>
<script setup>
import { WTermVue } from '@wterm/vue';
</script>
Vue 開発者は、リアクティビティシステムを尊重し、コンポーネントツリーの任意の場所に配置できるシンプルなコンポーネントを手に入れます。


高度な機能

CSS 変数によるテーマ設定

:root {
  --wterm-bg: #1e1e1e;          /* Background */
  --wterm-fg: #d4d4d4;          /* Foreground */
  --wterm-cursor: #ffcc00;     /* Cursor */
}
これらの変数を更新するだけで実行時にテーマを切り替えられ、端末はリロードなしで即座に更新されます。

WebSocket を使ったリモート PTY への接続

import { createTerminal } from '@wterm/core';
const term = createTerminal({
  wasmUrl: '/wterm.wasm',
  transport: new WebSocketTransport('wss://my-pty-server.example.com')
});
term.attach(document.body);
組み込みのトランスポートはバイナリフレーミング、再接続、フロー制御を処理し、クラウドベースの開発環境に最適です。

libghostty バックエンドの使用

完全な VT100/VT220 準拠が必要な場合(例:tmux のような複雑なアプリケーション)、@wterm/ghostty パッケージをインストールします:

pnpm add @wterm/ghostty
端末作成時に ghostty コアを渡します:
import { createTerminal } from '@wterm/core';
import { GhosttyCore } from '@wterm/ghostty';

const term = createTerminal({
  core: new GhosttyCore(),
  wasmUrl: '/wterm.wasm'
});
追加の 400 KB のペイロードにより、24 ビットカラーや高度なライン描画を含む完全な VT 準拠が実現します。


実際のユースケース

  1. クラウド IDE – Gitpod、CodeSandbox、またはカスタム SaaS IDE などのプラットフォームで、組み込みシェルとして wterm を埋め込みます。
  2. ドキュメント & チュートリアル – ローカル端末を必要とせず、ドキュメント内にライブコマンドラインデモを直接表示します。
  3. モニタリングダッシュボード – 管理パネル内でリアルタイムログやインタラクティブな CLI ツールを表示します。
  4. 教育プラットフォーム – 学習者に Linux コマンド学習用のサンドボックスシェルを提供します。

コントリビューション & コミュニティ

wterm は Apache‑2.0 ライセンスのオープンソースです。コントリビューションを歓迎します: - バグ報告 – GitHub で issue を作成してください。 - 機能リクエスト – プルリクエストで機能追加を提案してください。 - ドキュメント – README の改善、サンプル追加、チュートリアル執筆など。

このプロジェクトはエンドツーエンドテストに Playwrighte2e フォルダ)を、全パッケージのユニットテストに Vitest を使用しています。テストスイートの実行は以下のコマンドで簡単です:

pnpm test


結論

wterm は、ネイティブ端末体験と最新の Web アプリケーションの間のギャップを埋めます。Zig ベースの WASM コアは高速性を提供し、vanilla、React、Vue、Ghostty といったパッケージエコシステムにより、スタックに関係なくシームレスに統合できます。クラウド IDE、インタラクティブチュートリアル、リモートシェルダッシュボードの構築に関わらず、wterm は信頼性が高く拡張性のあるオープンソースソリューションを提供します。

試してみませんか? リポジトリをクローンし、WASM バイナリをビルドして、数分で端末を埋め込みましょう。コマンドラインの力をブラウザに届ける開発者コミュニティに参加してください。

オリジナル記事: オリジナルを表示

この記事を共有