[Tutoriel] Déploiement d'un environnement local de développement de custom widget

Grist se positionne comme une alternative sérieuse dans la gestion de vos données, quelque part entre le tableur traditionnelle et la structure rigoureuse de base de données relationnelles. Mais sa véritable force réside dans son extensibilité grâce aux Custom Widgets. Avec ces extensions, vous pouvez dépasser les limites de l’interface native pour créer vos propres vues sur mesure, et même d’ajouter des fonctionnalités uniques, parfaitement adaptées à vos besoins. Pour créer ces extensions, la solution Custom Widget Builder est souvent utilisé, mais elle montre vite ses limites pour un développement web plus robustes.

Dans ce guide, nous allons voir comment déployer un environnement de développement local sous Windows (WSL2). L’objectif ? Retrouver le confort de vos IDE favoris (JetBrains, VS Code…), bénéficier du live-reload pour visualiser les changements dans votre code en temps réel, et travailler en toute sécurité dans un bac à sable, totalement isolé de votre instance de production.


Préambule

Motivations

Développement de custom widget avec la solution « Custom Widget Builder »

Pour concevoir un widget, l’outil Custom Widget Builder est souvent la porte d’entrée naturelle. Son interface avec onglets permet d’écrire et de tester son code directement dans le navigateur.


— Développer des widgets Grist avec la solution « Custom Widget Builder »

L’avantage majeur de ce builder est qu’il élimine totalement la contrainte de l’hébergement. Traditionnellement, un widget nécessite un serveur web externe pour être déployé. Ici, le code que vous saisissez (HTML, CSS et JavaScript) est stocké directement au sein du document Grist en tant que donnée de configuration.

:information_source: Où le code HTML et JavaScript est-il stocké avec Custom Widget Builder ?

Techniquement, le builder ne traite pas votre code comme un fichier distant mais comme une simple option de configuration d’une vue. Lors de la sauvegarde, le builder utilise la méthode grist.setOptions() pour enregistrer l’intégralité de votre code sous forme de chaîne de caractères (JSON) directement dans le document Grist.

// https://github.com/gristlabs/grist-widget/blob/master/custom-widget-builder/api.js
const options = {
  _js: jsModel.getValue(),
  _html: htmlModel.getValue(),
};
(...)
grist.setOptions(options);

Pour comprendre les coulisses du stockage de ces options _js et _html contenant le code de votre widget, il faut se rappeler qu’un document Grist est avant tout une base de données SQLite. Celle-ci héberge vos données métiers, mais aussi des tables systèmes indispensables à Grist. Ainsi, le code saisi dans le Custom Widget Builder n’est pas sauvegardé dans un fichier externe, mais directement dans la table système _grist_Views_section, au sein de la colonne options.


– Custom Widget Builder, stockage du code dans la base de données SQLite du document Grist

Cette architecture rend votre widget totalement nomade. Puisque le code fait partie intégrante du document, il voyage avec lui. Si vous déplacez, télécharger ou partager votre fichier .grist, votre widget voyage dans ce dernier et reste opérationnel et prêt à l’emploi dès l’ouverture, sans aucune configuration supplémentaire.

Limites du développement avec « Custom Widget Builder »

Bien que cette approche soit extrêmement pratique pour expérimenter et déployer très rapidement son code sans aucune configuration complexe, elle atteint rapidement ses limites dans le développement web.

  • L’absence de contrôle de version : Le code est stocké dans le document Grist, empêchant l’utilisation d’un dépôt Git spécifique pour suivre l’historique du code ou collaborer sereinement (pull-request/fork).

  • Une gestion des dépendances précaire : Vous êtes limité à l’import de bibliothèques JavaScript via CDN. Cela rend le projet dépendant de ressources externes, moins stable, et plus complexe à maintenir sur le long terme.

  • Un écosystème bridé : L’interface ne permet pas de profiter pleinement des outils modernes de développement web (TypeScript, frameworks, build-tools, préprocesseurs CSS …).

  • Un cycle de développement laborieux : Développer à l’extérieur dans un IDE, puis intégrer manuellement chaque modification dans la vue d’un Custom Widget Builder devient vite fastidieux. La boucle itérative (modification, rechargement, test) est lente, et source d’erreurs.

Disposer d’un environnement de développement local de widget Grist

Pour gagner en DX (Developer Experience), amélioration du confort et de l’efficacité d’un développeur, il est préférable de mettre en place un environnement de développement local spécifique. L’enjeu est de retrouver le confort des outils de développement modernes dans un IDE, tout en gardant un pied dans Grist.

  • Servir les fichiers du widget dans un serveur web local.

  • Automatiser le rafraîchissement (live reload) pour visualiser chaque changement de code du widget instantanément dans le navigateur.

  • Tester en condition réelles dans une instance Grist locale, sans risquer de corrompre vos données ou d’impacter l’instance de production.

C’est précisément ce que propose le projet gristlabs/grist-widget.

Dans ce guide, nous allons détailler la mise en place d’un environnement de développement local sous Windows (avec WSL2) pour concevoir et tester vos propres custom widget depuis un IDE moderne (Jetbrains, Visual Studio Code …). Codez dans votre IDE, et visualisez les changements instantanément de vore widet à chaque sauvegarde, grâce au « live reload ».

— Développer des widgets Grist avec le live reload


Déploiement du projet gristlabs/grist-widget comme environnement de développement local

La manière la plus simple d’utiliser l’ensemble des outils de développement du projet gristlabs/grist-widget est de travailler dans un environnement Linux. Toutefois, dans ce guide, nous resterons sous Windows en nous appuyant sur WSL version 2.

Guide de déploiement express

  1. Installer Docker Desktop et Git-for-Windows
  2. Installer Ubuntu dans WSL2
    > wsl --install
    > wsl --install -d Ubuntu
    
  3. Installer Node.js et Yarn avec NVM dans l’instance Ubuntu WSL
    # Entrer dans l'instance Ubuntu
    > wsl -d Ubuntu
    
    $ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash
    $ nvm install 20.20
    $ nvm use 20.20
    $ npm install -g yarn
    
  4. Cloner le projet gristlabs/grist-widget et installer ses dépendances. :warning: Attention :warning:, le projet ne doit pas doit être cloner dans le montage mnt/c/ de l’instance Ubuntu WSL !
    $ sudo mkdir /projects && sudo chown v20100v:v20100v /projects
    $ cd /projects && git clone https://github.com/gristlabs/grist-widget.git
    $ cd grist-widget && git submodule update --init --recursive
    $ yarn install
    
  5. Modifier la configuration réseau du serveur de développement dans le fichier ./buildtools/dev-server.js pour une écoute broadcast (remplacez localhost par 0.0.0.0 à la fin).
    }).listen(WIDGETS_PORT, '0.0.0.0', () => { (...) });
    
  6. Lancer l’environnement de développement avec l’IP de l’instance Ubuntu (hostname -I) via la commande grist:dev. Elle permet de lancer simultanément le serveur de widgets (port 8585) et une version légère de Grist (port 8484).
    $ export IP_WSL=$(hostname -I | awk '{print $1}')
    $ GRIST_WIDGET_LIST_URL=http://$IP_WSL:8585/manifest.json yarn run grist:dev
    
  7. Vous pouvez accéder et travailler avec l’instance locale de Grist, en ouvrant la page http://localhost:8484, et consulter le manifest à http://localhost:8585/manifest.json.

Guide de déploiement détaillé (TL;DR)

Installation de Docker

L’environnement de développement gristlabs/grist-widget utilise une instance locale de Grist encapsulée dans un conteneur Docker basé sur l’image gristlabs/grist. Sous Windows, la méthode la plus simple est d’utiliser la solution officielle Docker Desktop. Consulter ce guide Windows | Docker Docs pour l’isntaller.

Une fois Docker Desktop lancé, l’environnement est prêt et vous pouvez commencer à créer, gérer et exécuter vos conteneurs directement depuis Windows. Pour vérifier que votre installation est parfaitement opérationnelle, le moyen le plus simple est de lancer l’image de test hello-world fournie par Docker.

Ouvrez un terminal et entrez :

> docker --version
Docker version 28.4.0, build d8eb465

> docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
4f55086f7dd0: Pull complete
Digest: sha256:452a468a4bf985040037cb6d5392410206e47db9bf5b7278d281f94d1c2d0931
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.
(...)

Vérifier l’activation de WSL (Windows Subsystem for Linux)

Bien que les outils de développement du projet gristlabs/grist-widget soient nativement conçus pour Linux, vous pouvez parfaitement travailler sous Windows grâce au service WSL 2 (Windows Subsystem for Linux). WSL est une couche de compatibilité qui permet d’exécuter un noyau Linux directement au sein de Windows.

:information_source: Vous avez dit WSL ?

Le sous-système Windows pour Linux (WSL) est une collection de composants Microsoft conçus pour permettre aux binaires Linux 64 bits natifs au format exécutable et lisible (ELF64) de fonctionner au sein du système d’exploitation (OS) Windows 10 ou Windows 11. Il s’agit d’une fonctionnalité intégrée à Windows qui permet d’exécuter un environnement GNU/Linux complet directement, sans aucune machine virtuelle lourde ni système de double‑boot.

Bien que les instances Linux puissent fonctionner sous Windows à l’intérieur d’une VM, WSL présente des avantages.

  • Il demande moins de ressources informatiques (processeur, mémoire et stockage) qu’une VM complète.
  • Il permet aux environnements Windows et Linux de fonctionner simultanément, ce qui permet aux développeurs d’utiliser des applications Windows et des utilitaires Linux sur les mêmes fichiers
  • Il permet aux applications Linux GUI de fonctionner de manière native sous Windows.

Cependant WSL présente toutefois certaines limites, car il ne s’agit pas d’un environnement Linux à part entière.

  • Il s’agit d’une couche de compatibilité qui vous permet d’exécuter des binaires Linux sur Windows. Ce n’est pas une réelle distribution Linux. Cela signifie que toutes les fonctionnalités de Linux ne sont pas disponibles dans WSL. Par exemple, WSL ne prend pas en charge certains systèmes de fichiers Linux, tels que ext4.
  • Toutes les distributions Linux ne sont donc pas disponibles dans WSL.
  • WSL n’est pas aussi rapide qu’une installation Linux native. En tant que couche de virtualisation, WSL doit traduire les appels système Linux en appels système Windows. Ce processus de traduction ajoute des coûts supplémentaires, ce qui ralentir les performances.

Pour installer ou mettre à jour WSL vers la version la plus récente, ouvrez un terminal en mode administrateur et exécutez les commande suivantes :

# Installer WSL
> wsl --install

# Vérifier l’état de WSL
> wsl --status
Distribution par défaut: docker-desktop
Version par défaut: 2

# Contrôler détaillé de la version active
> wsl --version
Version WSL : 2.6.1.0
Version du noyau : 6.6.87.2-1
Version WSLg : 1.0.66
Version MSRDC : 1.2.6353
Version direct3D : 1.611.1-81528511
Version de DXCore : 10.0.26100.1-240331-1435.ge-release
Version de Windows : 10.0.26100.7623

# Mettre à jour WSL
> wsl --update

# Lister les distributions Linux disponibles
> wsl --list
Distributions du Sous-système Windows pour Linux :
docker-desktop (par défaut)

:information_source: La solution Docker-Desktop s’appuie également sur le service WSL (Windows Subsystem for Linux) version 2. Lors de son installation, celui-ci crée automatiquement une distribution nommée docker-desktop. Il est possible que cette dernière soit configurée comme instance WSL par défaut.

Installation de la distribution Ubuntu dans WSL

Pour installer la distribution Ubuntu dans votre environnement WSL, exécutez la commande suivante dans un terminal en tant qu’administrateur.

# Installer Ubuntu et créer un user unix
> wsl --install -d Ubuntu

Téléchargement : Ubuntu
Installation : Ubuntu
La distribution a été installée.
Elle peut être lancée via 'wsl.exe -d Ubuntu'
Lancement : Ubuntu...
Provisioning the new WSL instance Ubuntu
This might take a while...

Create a default Unix user account: v20100v
New password:
Retype new password:
passwd: password updated successfully

To run a command as administrator (user "root"), use "sudo ".

# Pour définir la distribution Linux par défaut
> wsl --set-default Ubuntu

Une fois Ubuntu installée, vous pouvez la démarrer directement depuis un terminal Windows avec la commande wsl -d Ubuntu. Si Ubuntu est définie comme distribution par défaut, il suffit d’exécuter wsl pour la démarrer.

Vous pouvez alors accéder à vos fichiers Linux Ubuntu de deux manières :

Installation de Node.js et Yarn dans l’instance Ubuntu WSL

Pour gérer efficacement les différentes versions de Node.js dans un environnement, il est recommandé d’utiliser l’outil NVM (Node Version Manager). Cela permet de changer de version de Node en une commande sans polluer le système d’exploitation.

  1. Installer NVM. Entrer dans votre distribution Ubuntu WSL2, pour y installer globalement NVM avec la commande suivante.

    > wsl -d Ubuntu
    > v20100v@PCNAME:/mnt/c/Users/v20100v$
    
    # Télécharger et installer NVM via appel curl sh
    > v20100v@PCNAME:/mnt/c/Users/v20100v$curl -o- 
    https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash
    
  2. Charger NVM dans votre instance Ubuntu WSL2, en ajoutant les lignes suivantes à votre fichier ~/.bashrc si elles n’y figurent pas déjà. Pensez à recharger ensuite votre configuration avec ($source ~/.bashrc) ou en redémarrant votre session WSL.

    export NVM_DIR="$HOME/.nvm"\
    [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
    

    Vérifier que NVM est bien accessible.

    v20100v@PCNAME:/$ nvm --version
    0.39.5
    
  3. Installer et activer Node.js version 20.20 avec NVM.

    $ nvm install 20.20
    Downloading and installing node v20.20.0...
    Downloading https://nodejs.org/dist/v20.20.0/node-v20.20.0-linux-x64.tar.xz...
    ####################################################################### 100.0%
    Computing checksum with sha256sum
    Checksums matched!
    
    $ nvm use 20.20
    Now using node v20.20.0 (npm v10.8.2)
    
  4. Installer Yarn globalement. Pour installer les dépendances du projet gristlabs/grist-widget visibles dans le fichier package.json, vous aurez également besoin de Yarn, un gestionnaire de dépendances dans l’écosystème Node.js. On l’installe avec npm, le gestionnaire par défaut dans Node.js.

    $ npm install -g yarn
    $ yarn -v
    1.22.22
    

Clonage du dépôt gristlabs/grist-widget

Pour cloner (récupérer) le code du projet dans l’instance Ubuntu WSL2, on utilise l’outil git. Si ce dernier n’est pas présent vous pouvez l’installer avec la commande sudo apt install git -y.

  1. Créer un répertoire de travail dans lequel sera cloner le projet.

    # Entrer dans l'instance Ubuntu WSL2
    > wsl -d Ubuntu
    > v20100v@PCNAME:/mnt/c/Users/v20100v$   
    
    # Créer un répertoire de travail à la racine
    $ cd /
    $ sudo mkdir projects
    
    # Changer le propriétaire 
    $ sudo chown v20100v:v20100v /projects
    

    :warning: Attention :warning:, il est très important de créer le répertoire du projet à l’intérieur de l’instance WSL. Il ne faut surtout pas utiliser le point de montage mnt/c/. Ce dernier utilise le système de fichier Windows via une couche de traduction (drvfs) provoquant :

    • des lenteurs d’accès au disque très importante,
    • des problèmes dans la gestion des permissions POSIX rendant certains scripts inexécutables (le chmod +x est ignoré), alors que dans le système de fichier natif de WSL (ext4) cela fonctionne normalement,
    • et enfin les watchers ne détectent plus les changements. Par exemple, la compilation d’un fichier typescript avec tsc, ou d’asset css ne se lance plus malgré le changement de fichier.
  2. Cloner le projet gristlabs/grist-widget.

    # Cloner le projet dans le répertoire projects
    $ cd projects
    $ git clone https://github.com/gristlabs/grist-widget.git
    $ cd grist-widget
    
  3. Cloner les sous-module git du projet. Ce dépôt git utilise des sous-modules (a.k.a. submodules), qui ne sont pas récupérer lors du clonage. Vous pouvez par exemple constater que le répertoire ./varamil/ est vide. C’est justement un des sous-module du projet. Pour récupérer tous les sous-modules et leurs dépendances, exécuter la commande :

    $ git submodule update --init --recursive
    

    :information_source: Vous avez dit git submodule ?

    Un submodule est un dépôt Git imbriqué à l’intérieur d’un autre dépôt git. Il permet d’inclure un projet externe tout en gardant son historique séparé. Chaque submodule pointe sur un autre dépôt git.

    Vous pouvez consulter le fichier ./.gitmodules situé à la racine du projet pour voir la liste complète des sous‑modules utilisés. Ce fichier indique pour chacun d’eux son chemin local, son dépôt d’origine et, le cas échéant, la branche suivie.

Installation des dépendances Node.js

Une fois le dépôt cloné et les sous-modules récupérés, vous devez installer les bibliothèques JavaScript nécessaires au fonctionnement du projet à l’aide de Yarn. Pour fonctionner, Yarn s’appuie sur le fichier package.json. Il y puise la liste des bibliothèques nécessaires au projet pour les télécharger et les organiser.

> wsl -d Ubuntu
$ cd projects/grist-core
$ yarn install

Une fois l’exécution terminée, un dossier ./node_modules/ sera généré à la racine de votre projet. Ce répertoire centralise l’ensemble des dépendances JavaScript requises pour du projet, tel que décrit dans le fichier yarn.lock.

:information_source: Vous avez dit package.json et yarn.lock ?

Le package.json fait office de fiche d’identité et de manifeste d’un projet. Il liste les dépendances directes dont le projet a besoin en précisant une plage de versions autorisées (ex: ^1.2.0).

Alors que le fichier yarn.lock est un instantané précis généré automatiquement par Yarn. Il indique ce que Yarn va (ou a) précisément installé. Il verrouille spécifiquement les versions exactes de chaque dépendance et de leurs propres sous-dépendances. Cette rigueur garantit le déterminisme du projet en s’assurant que les développeurs disposeront toujours d’un dossier node_modules strictement identique.

Configuration réseau du serveur de développement grist-widget

Le projet gristlabs/grist-widget lance simultanément un serveur de widgets (port 8585) et une version légère de Grist (port 8484) dans un conteneur Docker. Dans une installation standard sous Linux natif, ces services communiquent simplement via localhost. Cependant, l’utilisation de WSL2 introduit une complexité réseau spécifique qu’il convient de résoudre pour assurer la communication entre ces services.

Le problème

Par défaut, WSL2 utilise son propre réseau virtuel.
Cette architecture crée une isolation réseau entre Linux et Windows. Le localhost de l’instance WSL reste confiné à l’intérieur de la machine virtuelle Linux. Vous pouvez observer cette distinction en comparant les adresses IP de ces deux environnements.

# Identifier l'@ IP de la machine hôte Windows
> ipconfig
Adresse IPv4: 172.30.240.1

# Identifier l'@ IP de l'instance Ubuntu WSL2
> wsl -d Ubuntu
$ hostname -I
172.30.253.221

En conséquence, un service lancé sur WSL ne sera pas accessible par le navigateur Windows ou par d’autres conteneurs Docker sans une configuration réseau spécifique. Autrement dit, puisque le serveur de développement de grist-widget écoute uniquement sur 127.0.0.1, il sera inacessible au conteneur Docker de Grist, ainsi que pour votre navigateur dans la machine hôte Windows, entraînant des erreurs de type ECONNREFUSED.

La solution broadcast

Pour permettre la communication entre ses services (service de widget 8585, instance, service Grist 8484 dans un conteneur Docker), vous devez forcer le serveur de développement à accepter les connexions provenant de l’extérieur de la boucle locale en utilisant l’adresse broadcast 0.0.0.0.

Pour ce faire, modifier la configuration du serveur de développement dans le fichier ./buildtools/dev-server.js en remplaçant localhost par 0.0.0.0 dans la méthode listen().

// Remplacer les dernières lignes du fichier ./buildtools/dev-server.js
}).listen(WIDGETS_PORT, '0.0.0.0', () => {
  console.log(`Server running on: http://0.0.0.0:${WIDGETS_PORT}`);
});

Lancer l’environnement de développement grist-widget

La commande yarn run grist:dev initialise simultanément deux services : le serveur de widgets (port 8585) et une version légère de Grist embarqué dans un conteneur Docker (port 8484).

Pour que Grist puisse localiser le manifeste des widgets, vous devez impérativement définir la variable d’environnement GRIST_WIDGET_LIST_URL avec l’adresse IP de l’instance Ubuntu WSL2.

# Identifier l'@ IP de l'instance Ubuntu WSL2
> wsl -d Ubuntu
$ hostname -I
172.30.253.221

Exécutez la commande suivante (en remplaçant l’IP par la vôtre).

# Remplacez l'IP par la vôtre
GRIST_WIDGET_LIST_URL=http://172.30.253.221:8585/manifest.json 
yarn run grist:dev

(...)
Starting local server and watching for changes.
> @gristlabs/grist-widget@0.0.5 serve:dev
> env PORT=8585 node ./buildtools/dev-server.js
Server running on: http://localhost:8585

(...)
Welcome to Grist.
In quiet mode, see http://localhost:8484 to use.
For full logs, re-run with DEBUG=1
2026-03-27 16:15:14.995 - info: Setting up database...
2026-03-27 16:15:15.042 - info: Database setup complete.
2026-03-27 16:15:15.043 - info: == Grist version is 1.7.11 (commit unknown)

:information_source: Lors du premier lancement, le script effectue un pull de l’image Docker gristlabs/grist. Si vous travaillez derrière un proxy d’entreprise, vérifiez que vos variables d’environnement (HTTP_PROXY, HTTPS_PROXY) sont correctement configurées, ou bien que les paramètres proxy sont correctement configurés dans l’interface graphique de Docker Desktop.

Vous pouvez vérifier dans Docker que l’image gristlabs/grist a bien été récupérée.


— Récupération de l’image Docker gristlabs/grist

Here we go… L’environnement de développement est (normalement) démarré !

Contrôler le bon démarrage de l’environnement de développement

  1. Vérifier que le serveur de widget est bien accessible sur le port 8585, en consultant dans un navigateur de la machine hôte, la page http://localhost:8585/manifest.json. Ce référentiel sert à déclarer chaque widget à charger dans une instance Grist.

  2. Accéder à l’instance locale Grist, en ouvrant la page http://localhost:8484

  3. Créer un nouveau document vide pour ajouter une nouvelle vue « Personnalisée ». Vous pouvez constater que les widget déclarés dans le manifest.json sont bien accessible dans l’instance locale Grist !

:information_source: Si le serveur de widgets refuse de se lancer (erreur EADDRINUSE), il est possible qu’un processus occupe déjà le port 8585. Voici comment l’identifier et forcer son arrêt.

# Identifier le processus (PID) sur le port 8585
$ sudo lsof -i :8585
COMMAND   PID     USER     FD   TYPE DEVICE SIZE/OFF NODE NAME
node      85588   v20100v  18u  IPv4 811284      0t0  TCP *:8585 (LISTEN)

# Tuer le processus
$ sudo kill -9 85588

Conception d’un nouveau widget

Maintenant que l’environnement de développement local est opérationnel, passons à la création d’un nouveau widget, nommé « Startiflette ».

  1. Initialiser le répertoire du widget.
    Créez un nouveau répertoire dans Ubuntu dédié à votre widget à la racine du projet.

    > wsl -d Ubuntu
    $ cd /projects/grist-widget
    $ mkdir startiflette
    
  2. Décrire le widget dans le fichier package.json.
    Chaque widget doit être référencé et décrit par ce fichier. Il permet au serveur de l’inclure automatiquement dans le catalogue des vues « personnalisées ».

    Créez le fichier ./startiflette/package.json avec le contenu suivant.

    {
      "name": "@badi/widget-startiflette",
      "description": "Dumb widget for poc.",
      "homePage": "https://github.com/gristlabs/grist-widget",
      "version": "0.0.1",
      "grist": {
        "name": "Startiflette",
        "url": "https://gristlabs.github.io/grist-widget/startiflette/index.html",
        "widgetId": "@badi/widget-startiflette",
        "published": true,
        "accessLevel": "none",
        "renderAfterReady": true,
        "description": "In tartiflette we trust",
        "authors": [
          {
            "name": "Vincent BLAIN",
            "url": "https://github.com/v20100v"
          }
        ],
        "isGristLabsMaintained": true
      }
    }
    

    Une fois ce fichier enregistré, vérifiez sa prise en compte en consultant le manifeste local http://localhost:8585/manifest.json. Votre widget doit y apparaître.

  3. Ouvrir le projet dans IDE via Remote Development
    Pour ouvrir votre projet situé dans WSL avec un IDE Jetbrain, évitez absolument d’ouvrir votre projet via l’explorateur Windows, sous peine d’avoir une indexation extrêmement lente. Utilisez plutôt la fonction Remote Development. Dans ce cas, l’IDE gérera parfaitement les permissions de fichiers et les outils (Node.js, Git) installés à l’intérieur d’Ubuntu sans conflit avec Windows.

  4. Dévélopper votre widget (application web)
    Créez le fichier ./startiflette/index.html avec le code du widget, puis ajoutez l’image de votre choix.

    <html>
    <head>
      <title>Smoke widget GRIST</title>
    </head>
    <body>
    <h1>In startiflette we trust !</h1>
    <img src="r2d2.jpg" height="400"/>
    </body>
    </html>
    
  5. Rendu dans l’instance Grist locale
    Dans l’instance http://localhost:8585, vous pouvez maintenant ajouter votre nouveau widget « Startiflette ».

    Et voila le rendu ! Si le code du widget est modifié, le navigateur se rafraîchit instantanément pour refléter les changements.


Conclusion

Mettre en place cet environnement de développement local pour vos custom widgets dans Grist transforme radicalement l’expérience de développement. En s’affranchissant des limites du Custom Widget Builder, vous gagnez non seulement en confort grâce au live reload, mais vous ouvrez surtout la porte à des pratiques d’ingénierie logicielle bien plus robuste.

Cette démarche ouvre la voie à l’utilisation de frameworks modernes (React, Angular, Vue.js …), et à l’emploi d’un code typé et sécurisé avec TypeScript. Elle permet aussi d’adopter des cycles de développement matures où la gestion de versions avec Git devient le pilier de la collaboration entre développeurs. Grâce aux pull requests, chaque modification est soumise à une revue de code rigoureuse avant son intégration. Il est même possible d’envisager d’y associer des tests automatisés et des plans de déploiement continue (CI/CD) de vos widgets!

Que vous souhaitiez créer une visualisation de données complexe ou une interface métier interactive, cet environnement est un tremplin pour transformer vos idées en application robuste, maintenable et évolutive.

Happy coding ^^.


Sources & lectures complémentaires :

9 « J'aime »

Bonjour,

En guise de complément, pour ceux qui développent (ou souhaitent développer) des custom widget, je viens de publier un projet kit starter (boilerplate) pour simplifier le développement en utilisant l’écosystème Vite.js + Framework React + Typescript.

La solution est plus bien simple à mettre en oeuvre qu’avec WSL ^^… avec moins de prérequis (Docker, Node.js et pnpm). Je ferais un autre tuto dans le forum pour le présenter mais voila les principales fonctionnalités

  • :zap: Vite.js & HMR : Un rechargement HMR (hot module reload) qui préserve l’état de votre widget pendant la phase de dev (à la différence du livereload)
  • :shield: TypeScript : Pour un typage robuste de l’API Grist.
  • :whale: Docker-Ready : Lance une instance Grist locale pré-configurée pour tester vos widgets en conditions réelles.
  • :package: Stratégies de Build : Support de deux stratégies de build : SPA (single page application) en un unique fichier HTML ou Standard (avec cache busting des assets)
  • :robot: Manifeste Automatisé : Le fichier manifest.json qui sert à référencer les widgets dans une instance Grist, est généré directement depuis les informations de package.json.

:hammer_and_wrench: Démarrage rapide :

  1. git clone https://github.com/6i-software/grist-widget-vite-react-ts-template.git
  2. pnpm install
  3. pnpm dev

    — Lancement de l’environnement de développement du widget personnalisé Grist

Et voila, vous pouvez accédez ensuite à votre Grist local sur http://localhost:8484 et votre widget sera déjà disponible dans le catalogue !


— Chargement du widget local dans l’instance Grist locale

Grâce au HMR (Hot Module Replacement) fourni par Vite.js, vos modifications de code sont reflétées instantanément sans rechargement complet de la page. Contrairement au Live Reload standard, le HMR ne met à jour que les modules modifiés. Cela préserve l’état actuel et les données de votre widget, garantissant un workflow de développement fluide et ultra-rapide.


— Rendu du widget en temps réel dans Grist avec HMR

Happy coding !


:link: Liens utiles :

1 « J'aime »