Skip to content

Vercelの新しいツールがターミナル地獄を終わらせる

長年、ウェブターミナルは壊れているように感じられ、開発者はぎこちないテキスト選択や検索機能と格闘することを強いられてきました。Vercelのwtermは、canvasを捨てて純粋なHTMLを採用することでこれを解決し、その結果は画期的なものです。

Stork.AI
Hero image for: Vercelの新しいツールがターミナル地獄を終わらせる
💡

要約 / ポイント

長年、ウェブターミナルは壊れているように感じられ、開発者はぎこちないテキスト選択や検索機能と格闘することを強いられてきました。Vercelのwtermは、canvasを捨てて純粋なHTMLを採用することでこれを解決し、その結果は画期的なものです。

ウェブターミナルのCanvasの牢獄

長年、xterm.jsはウェブターミナルの揺るぎない標準として君臨してきました。GitHub CodespacesのようなクラウドIDE、Portainerのようなインフラ管理ツール、さらにはVS Codeのようなデスクトップ環境でさえ、このライブラリを普遍的に統合しており、ブラウザにコマンドラインインターフェースを埋め込むための事実上のソリューションとなっています。その広範な存在は、固有の制限にもかかわらず、その地位を確固たるものにしました。

しかし、xterm.jsの基本的な設計選択、つまりターミナル出力をHTMLのcanvas要素にレンダリングするという方法は、重大な技術的障害を提示します。このcanvasはブラウザにとって視覚的な「ブラックボックス」として機能し、基になるテキストコンテンツを効果的に隠蔽します。その結果、ブラウザは表示された文字をネイティブに解釈したり操作したりすることができません。

したがって、xterm.jsで開発する開発者は、基本的なブラウザ機能を手動で再実装する必要があります。テキスト選択、「検索」操作、おなじみのコピー&ペーストメカニズムといった不可欠な機能には、特注の、しばしば複雑なカスタムコードが必要です。このコアインタラクションの反復的な再設計は、異なる実装間で不整合やバグの可能性をもたらします。

このアーキテクチャ上の制約は、ユーザーエクスペリエンスとアクセシビリティに直接影響します。ユーザーはしばしば、ぎこちなく、ネイティブではないテキスト操作に遭遇し、テキストの選択やコピーが煩わしく、信頼できないと感じます。決定的に重要なのは、スクリーンリーダーがcanvasでレンダリングされたコンテンツを解釈するのに苦労し、視覚障害のあるユーザーにとってのアクセシビリティを著しく制限し、シームレスでネイティブな感覚を提供できないことです。

wtermのラディカルなDOMファースト戦略

Vercelのwtermは、ウェブターミナルに根本的に異なるパラダイムを導入し、長らくこの分野を支配してきたcanvas中心のモデルから根本的に脱却します。孤立したcanvasにピクセルをレンダリングするxterm.jsとは異なり、wtermはターミナル出力をDocument Object Model内の標準HTML要素として直接レンダリングします。このアーキテクチャの転換は、ターミナルが分離されたカプセル化された描画サーフェスではなく、ウェブページ自体に内在する、完全にアクセス可能なコンポーネントであり、ブラウザのネイティブ機能とシームレスに統合されていることを意味します。

この大胆なDOMファースト戦略は、これまでcanvasベースのエミュレータにとって困難であり、しばしば複雑で欠陥のある再実装を必要としていた重要なユーザーエクスペリエンス機能を即座に解放します。開発者は以下を得られます: - ネイティブなテキスト選択 - 箱から出してすぐに使えるCtrl+Fブラウザ検索機能 - シームレスなコピー&ペースト操作 - 完全なスクリーンリーダーサポート

これらの不可欠なインタラクションは、追加のコードを一切必要とせず、本質的に機能するようになりました。これにより、開発者がブラウザレベルの機能を苦労して再作成する必要がなくなり、従来のウェブターミナルで頻繁に発生していた一貫性のない、または最適ではないユーザーエクスペリエンスが解消されます。

wtermの応答性の高いフロントエンドを支えるのは、Zigで書かれた超効率的なバックエンドです。このコンパクトなコードベースは、わずか12KBのWebAssemblyバイナリにコンパイルされ、最小限のオーバーヘッドと高速な読み込みを保証します。エンジンは、受信するターミナルエスケープシーケンスをインテリジェントに解析し、各フレーム中に変更された特定の行のみを再レンダリングします。この高度に最適化されたレンダリングパイプラインにより、wtermは`htop`のような要求の厳しい、高頻度更新のコマンドラインツールでもスムーズなパフォーマンスを維持でき、ブラウザ内で直接複雑なアプリケーションを実行するための真に実行可能なソリューションとなります。

さらに強化:Ghosttyエンジンオプション

`wterm`のデフォルトのZigコアは基本的なターミナル操作で優れた効率を提供しますが、ピクセルパーフェクトなレンダリングと複雑なアプリケーションとの完璧な互換性を実現するには、より堅牢なエンジニアリングが必要です。ここでオプションの`wterm-ghostty`バックエンドが登場し、要求の厳しいシナリオに大幅なアップグレードを提供します。

`wterm-ghostty`パッケージは、軽量なZigコアをlibghosttyに置き換えます。これは、ネイティブのGhosttyターミナルを駆動するのと同じ強力なレンダリングエンジンです。この統合により、ウェブターミナルではこれまで見られなかったレベルの忠実度が実現され、以下のことが可能になります。 - ピクセルパーフェクトなテキストレンダリング - 優れた色精度と24ビットトゥルーカラーのサポート - Vim、Neovim、さらには`htop`のような複雑なアプリケーションのシームレスな実行

この強化された機能には、バイナリサイズという重要なトレードオフが伴います。Zigで書かれたミニマリストなZigコアは、わずか12KBのWebAssemblyバイナリにコンパイルされ、`wterm`を驚くほど軽量にしています。対照的に、`libghostty`を活用する`wterm-ghostty`バックエンドは、WASMバイナリを約400KBにまで膨らませます。これにより、開発者は明確な選択を迫られます。よりシンプルなユースケースではミニマリストな効率性を優先するか、ブラウザで本格的な開発環境を実行する際には最高の忠実度と互換性を選択するかです。さらなる技術的な詳細は、プロジェクトのGitHubページで確認できます:vercel-labs/wterm: A terminal emulator for the web - GitHub

評決:`xterm.js`キラーとなるか?

wtermと由緒ある`xterm.js`を比較すると、明確な世代間の隔たりが明らかになります。10年以上にわたり、`xterm.js`は揺るぎない標準であり、VS CodeからGitHub Codespacesまで、その実証済みの安定性と広範なプラグインエコシステムで全てを支えてきました。その成熟度により、ほとんどの開発者にとって実用的でリスクの低い選択肢となっています。

しかし、`wterm`は、ネイティブのテキスト選択、ブラウザ検索、そして重要なスクリーンリーダーサポートのためにDOMファーストレンダリングを活用することで、根本的に優れたユーザーエクスペリエンスを提供します。これらは`xterm.js`が長らくエミュレートに苦労してきた機能です。このアーキテクチャの転換は、ターミナル出力が単なるHTMLであることを意味し、ブラウザの機能を無料で利用できます。

Coder's Ghostty Webのような他のプロジェクトも強力な`libghostty`エンジンを利用していますが、それらはしばしば`xterm.js`のキャンバスアプローチを保持しています。`wterm`は、ターミナルをネイティブHTMLとして真に埋め込むことで、単なる別のウェブ要素とし、独立したキャンバスレイヤーではないという点で際立っています。

まだ初期段階にある`wterm`とそのオプションの`wterm-ghostty`バックエンドには、まだ粗削りな部分があります。12KBのZigコアは驚くほど効率的ですが、特にNeovimやOpenCodeのような複雑なアプリケーションとの完全なターミナル互換性のためには、400KBの`libghostty`オプションが必要になる場合があります。

しかし、真にネイティブな感覚とアクセシビリティを最初から優先する新しいウェブプロジェクトにとって、`wterm`は魅力的でモダンな代替手段となります。`xterm.js`はレガシー統合のためのより安全で確立された選択肢であり続けますが、`wterm`は10年来の問題をエレガントで将来を見据えたソリューションで決定的に解決します。

よくある質問

Vercelの`wterm`とは何ですか?

`wterm`は、Vercelが提供するモダンなウェブベースのターミナルエミュレータで、従来のソリューションのようにキャンバス要素を使用する代わりに、出力を直接DOMにHTMLとしてレンダリングします。

`wterm`は`xterm.js`とどう違うのですか?

主な違いはレンダリング技術です。`wterm`はDOM(HTML)を使用するため、ネイティブのテキスト選択、ブラウザ検索、アクセシビリティを無料で提供します。`xterm.js`はキャンバスにレンダリングするため、これらの機能をJavaScriptで再実装する必要があります。

`wterm`におけるGhosttyの役割は何ですか?

wtermは、ネイティブのGhosttyターミナルと同じエンジンであるlibghosttyを搭載した、オプションの高忠実度バックエンドを提供します。これにより、特に複雑なターミナルUIにおいて、優れたレンダリング精度と互換性が提供されますが、ファイルサイズが大きくなるという代償を伴います。

wtermは何で構築されていますか?

wtermのコアはZigプログラミング言語で書かれており、小さな(約12KB)WebAssembly(WASM)バイナリにコンパイルされているため、非常に軽量で高性能です。

One weekly email of tools worth shipping. No drip funnel.

one email per week · unsubscribe in two clicks · no third-party tracking

🚀もっと見る

AI最前線をキャッチアップ

Stork.AIが厳選したAIツール、エージェント、MCPサーバーをご覧ください。

P.S. 使えるものを作りましたか? Storkに掲載 — $49

すべての記事に戻る