Xterm.js の全画面ソリューション

Xterms.js は TypeScript で書かれたフロントエンド コンポーネントで、ブラウザーであらゆる端末エクスペリエンスを実現できます。VS Code の端末機能はこれを使用して実装されており、本物の端末のように感じられます。

ブラウザで実行されるため、通常、ページには他の要素が含まれますが、要素が多すぎると、限られた画面スペースを占有し、ユーザーの注意が散漫になります。 シナリオによっては、全画面表示が必要になる場合があります。この記事では、読者の参考のために、包括的な全画面実装ソリューションを紹介します。 この記事を見つけるのに長い間苦労したと思いますが、私が vue3 コンポーネントでこの記事を書いたとき、いくつかの奇妙な未知の理由により、正常にデバッグするのに長い時間がかかりました。

基本的な環境準備は冗長ではなく、公式ドキュメントを読むだけのシンプルな内容です。

以下は参照のみを目的とした vue の例です。

 1<template>
 2  <div v-if="loading">loading...</div>
 3  <div v-if="error">failed to fetch</div>
 4  <div>
 5    <div id="terminal"></div>
 6  </div>
 7</template>
 8
 9// ... ここでは省略
10import { Terminal } from 'xterm';
11import { FitAddon } from 'xterm-addon-fit';
12import "xterm/css/xterm.css";
13// ... ここでは省略

コアロジック

 1const term = new Terminal({
 2    cursorBlink: true,
 3    // さまざまな設定は省略されていますが、インターネット上にサンプルがたくさんあります。
 4});
 5
 6term.loadAddon(fitAddon)
 7function fitTerminal() {
 8    fitAddon.fit();
 9    term.scrollToBottom();
10}
11
12term.open(document.getElementById('terminal'));
13fitTerminal();
14
15window.addEventListener('resize', fitTerminal);
16
17// 1. F11 を押して全画面表示にします
18
19document.addEventListener('keydown', (e) => {
20    if (e.key === 'F11') {
21        toggleFullscreen();
22    }
23});
24
25// 2. ボタンをクリックすると、読者の参照用に全画面表示になります。
26// document.getElementById("fullbtn").addEventListener("click", toggleFullscreen)
27
28// 最下位レベルは、chatGPT のクレジットだけで十分です。受け入れられない場合は受け入れられません。自信はここから来ます。
29function toggleFullscreen() {
30    const doc = window.document;
31    const docEl = doc.documentElement;
32
33    const requestFullScreen =
34        docEl.requestFullscreen || docEl.mozRequestFullScreen || docEl.webkitRequestFullScreen || docEl.msRequestFullscreen;
35    const cancelFullScreen =
36        doc.exitFullscreen || doc.mozCancelFullScreen || doc.webkitExitFullscreen || doc.msExitFullscreen;
37
38    if (!doc.fullscreenElement && !doc.mozFullScreenElement && !doc.webkitFullscreenElement && !doc.msFullscreenElement) {
39        requestFullScreen.call(docEl);
40    } else {
41        cancelFullScreen.call(doc);
42    }
43}

この例では、「ターミナル」クラスを使用してターミナル オブジェクトを作成し、それをページ上の要素にレンダリングします。 ページが最初にロードされるときに、fitterminal 関数が呼び出されて、端末オブジェクトを親要素のサイズに適合させ、スクロール バーを下部に調整します。 続いて、addEventListener を使用して resize イベントをリッスンし、親要素のサイズの変更に応じて端末が適応的に調整できるようにします。 さらに、「keydown」イベントも監視され、ユーザーが F11 キーを押したときに全画面に切り替わります (ボタンをクリックして全画面に移行し、全画面ボタン アイコンにバインドすることもできます。コード コメント 2 を参照) 。

toggleFullscreen 関数では、W3C 標準の requestFullscreen および exitFullscreen API を使用して全画面切り替えを実装します。 この部分を ChatGPT が実現してくれたのは素晴らしいと思いますが、W3C の標準規格も採用されているのですから、この点では人間の脳は決して追いつきませんし、結局のところ能力には限界があります。

最終更新日: Thursday, September 28, 2023

翻訳: