wterm : émulateur de terminal rapide basé sur le Web, propulsé par Zig & WASM

Introduction

Si vous avez déjà eu besoin d'un terminal à l'intérieur d'une application web — que ce soit pour un IDE cloud, un tableau de bord de shell distant ou un tutoriel interactif — wterm est l'outil que vous attendiez. Développé par Vercel Labs, wterm est un émulateur de terminal pleinement fonctionnel qui s'exécute dans le navigateur grâce à WebAssembly compilé avec Zig. Son empreinte réduite (≈12 KB pour le binaire WASM principal) et ses performances quasi natives en font le choix idéal pour toute pile web moderne.


Pourquoi wterm se démarque

Fonctionnalité Avantage
Noyau Zig + WASM Vitesse d'analyse quasi native pour les séquences d'échappement VT100/VT220/xterm.
Noyaux modulables Choisissez le noyau Zig ultra‑léger (~12 KB) ou le backend complet libghostty (~400 KB) pour une conformité VT totale.
Rendu DOM Sélection de texte native, copier/coller, recherche dans le navigateur et prise en charge des lecteurs d'écran sans bibliothèques supplémentaires.
Enveloppes de frameworks Packages prêts à l'emploi pour React, Vue 3 et une API JS vanilla.
Théming Les propriétés CSS personnalisées vous permettent de basculer instantanément entre les thèmes Default, Solarized Dark, Monokai et Light.
Transport WebSocket Connectez‑vous à un backend PTY distant avec encodage binaire et reconnexion automatique.
Redimensionnement automatique Utilise ResizeObserver pour s'adapter aux changements de taille du conteneur.
Historique de défilement & écran alternatif Prise en charge complète d’applications comme vim, less et htop.

Ces capacités font de wterm bien plus qu’une simple démo — c’est un composant prêt pour la production que vous pouvez intégrer à n’importe quel projet web.


Démarrage rapide

Prérequis

  • Zig 0.16.0+ (pour construire le noyau WASM)
  • Node.js 20+
  • pnpm 10+ (gestionnaire de paquets recommandé)

Installation

# Cloner le dépôt
git clone https://github.com/vercel-labs/wterm.git
cd wterm

# Installer les dépendances JavaScript
pnpm install

Construire le binaire WASM

zig build               # Build de débogage (par défaut)
zig build -Doptimize=ReleaseSmall   # Build optimisé pour la taille (~12 KB)
Le fichier wterm.wasm généré se trouve dans le répertoire web/ et peut être servi comme ressource statique.

Construire tous les paquets

pnpm run build   # Compile les paquets @wterm/* et regroupe les exemples

Utiliser wterm dans différents environnements

1. JavaScript vanilla (rendu 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>
Le rendu DOM vous fournit un terminal JavaScript simple avec prise en charge complète du presse‑papier et sélection de texte native.

2. Intégration 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)}
    />
  );
}
Le hook useTerminal vous permet d’interagir avec le PTY sous‑jacent, d’envoyer des commandes et d’écouter les sorties.

3. Composant Vue 3

<template>
  <WTermVue :wasm-url="'/wterm.wasm'" />
</template>
<script setup>
import { WTermVue } from '@wterm/vue';
</script>
Les développeurs Vue obtiennent un composant simple qui respecte le système de réactivité et peut être placé n’importe où dans l’arbre de composants.


Fonctionnalités avancées

Théming avec des variables CSS

:root {
  --wterm-bg: #1e1e1e;          /* Fond */
  --wterm-fg: #d4d4d4;          /* Premier plan */
  --wterm-cursor: #ffcc00;     /* Curseur */
}
Changez de thème à la volée en modifiant ces variables ; le terminal se met à jour instantanément sans rechargement.

Connexion à un PTY distant via WebSocket

import { createTerminal } from '@wterm/core';
const term = createTerminal({
  wasmUrl: '/wterm.wasm',
  transport: new WebSocketTransport('wss://my-pty-server.example.com')
});
term.attach(document.body);
Le transport intégré gère l’encodage binaire, la reconnexion et le contrôle de flux, ce qui le rend idéal pour les environnements de développement cloud.

Utilisation du backend libghostty

Si vous avez besoin d’une conformité VT100/VT220 complète (par ex. pour des applications complexes comme tmux), installez le paquet @wterm/ghostty :

pnpm add @wterm/ghostty
Puis transmettez le cœur ghostty lors de la création du terminal :
import { createTerminal } from '@wterm/core';
import { GhosttyCore } from '@wterm/ghostty';

const term = createTerminal({
  core: new GhosttyCore(),
  wasmUrl: '/wterm.wasm'
});
Le supplément de 400 KB apporte une conformité VT totale, incluant les couleurs 24 bits et le tracé avancé de lignes.


Cas d’utilisation réels

  1. IDE cloud – Intégrez wterm comme shell intégré pour des plateformes telles que Gitpod, CodeSandbox ou des IDE SaaS personnalisés.
  2. Documentation & tutoriels – Rendu de démonstrations de ligne de commande en direct directement dans la documentation, sans nécessiter de terminal local.
  3. Tableaux de bord de surveillance – Affichez des journaux en temps réel ou des outils CLI interactifs dans les panneaux d’administration.
  4. Plateformes éducatives – Fournissez aux étudiants un shell sandboxé pour apprendre les commandes Linux.

Contribution & communauté

wterm est open source sous licence Apache‑2.0. Les contributions sont les bienvenues : - Rapports de bugs – Ouvrez une issue sur GitHub. - Demandes de fonctionnalités – Proposez des améliorations via des pull requests. - Documentation – Améliorez le README, ajoutez des exemples ou rédigez des tutoriels.

Le projet utilise Playwright pour les tests end‑to‑end (dossier e2e) et Vitest pour les tests unitaires de tous les paquets. Exécuter la suite de tests est aussi simple que :

pnpm test


Conclusion

wterm comble le fossé entre l’expérience d’un terminal natif et les applications web modernes. Son noyau WASM basé sur Zig fournit rapidité, tandis que l’écosystème de paquets (vanilla, React, Vue, Ghostty) assure une intégration fluide quel que soit votre stack. Que vous construisiez un IDE cloud, un tutoriel interactif ou un tableau de bord de shell distant, wterm vous offre une solution fiable, extensible et open source.

Prêt à l’essayer ? Clonez le dépôt, compilez le binaire WASM et intégrez le terminal en quelques minutes. Rejoignez la communauté croissante de développeurs qui apportent la puissance de la ligne de commande au navigateur.

Article original: Voir l'original

Partager cet article