Published on

Framework JS pour l'embarqué

Authors
  • Name
    Anthony Rabine

Lorsque l'on souhaite embarquer des pages web dans un système embarqué, il est particulièrement utile de faire travailler le navigateur client pour laisser le processeur tranquille. Les frameworks Javascript récents sont assez lourds par contre, voyons ce que ça donne.

Principe et choix de départ

Le serveur Web embarqué dans le processeur, type microcontrôleur ici, va servir les pages : du HMTL, des images et des ressources de type fichier au sens général, dont deux qui vont nous intéresser : le CSS et le Javascript.

Une fois que le client (le navigateur) a téléchargé le le Javascript, le processus usuel est de ne faire véhiculer que des données brutes (du JSON par exemple) entre le serveur Web et la page. Les derniers frameworks utilisent à font la réactivité, c'est à dire la possibilité de rafraîchir automatiquement les données à l'affichage dès qu'elles sont modifiées. Et cela, sans code particulier par exemple.

Les frameworks classiques comme ReactJs, VueJs, Angular le font très bien, en plus d'apporter une structure au code : des composants bien séparés, un cycle de vie bien déterminé, un moteur de template ... bref, lorsque l'on a goûté au luxe il est difficile de revenir en arrière vers du Javascript pur écrit à la main.

Dans le cas de développement embarqué, il est courant d'utiliser en plus une liaison bi-directionnelle de type WebSocket entre le client et le serveur : dès qu'une mesure est disponible, le microcontrôleur la transfert vers le client via le tuyau websocket.

Notre cahier des charges est le suivant :

  • Un framework JS fonctionnant avec Vite
  • Un moteur de template
  • Des composants avec cycle de vie
  • Typescript natif
  • Une compilation des CSS et JS minimisé

Pour ce dernier point, nous n'allons pas nous intéresser à la version compressée des librairies car c'est le serveur Web qui va s'occuper de ça et dans l'embarqué cette fonction n'est pas légion, voire trop gourmande en ressources. Cela ne va pas nous empêcher d'utiliser l'astuce de la compression comme nous le verrons plus loin, sans pénaliser le serveur.

Vite

Nous allons donc utiliser Vite pour faciliter la création de bundle CSS/JS. Voyons ce que nous propose l'outil embarqué de création de squelette de projet

shell
npm create vite@latest vuejs --template=vanilla

image

Testons avec Vue.js par exemple, on choisit ensuite Typescript comme langage. Puis compile :

shell
cd vuejs
npm install
npm run build

Voici ce que donnent les statistiques :

shell
vite v4.4.11 building for production...
 18 modules transformed.
dist/index.html                  0.45 kB gzip:  0.29 kB
dist/assets/vue-5532db34.svg     0.50 kB gzip:  0.31 kB
dist/assets/index-c322ae43.css   1.30 kB gzip:  0.67 kB
dist/assets/index-127f2da4.js   51.61 kB gzip: 20.93 kB
 built in 649ms

Ouch, on s'y attendait, 51Ko de code qui ne fait pas grand chose, ça démarre mal mais on s'y attendait.

On opère de même pour les autres frameworks :

| Framwork | Taille du Js |

| Vanilla | 1.45 kB | | Svelte | 5.70 kB | | Solid | 8.60 kB | | Preact | 13.77 kB | | Lit | 20.17 kB | | Qwik | 46,65 kB | | Vue | 51.61 kB | | React| 143.41 kB |

Ok, Svelte est fidèle à son image de framework optimisé. On déclare donc le choix fait pour la partie Javascript.

Framework CSS

Notre besoin est le suivant :

  • Style moderne
  • Quelques composants important (modal, progression, barres de navigation, un <select>, ce qui est rare)
  • Pure CSS, pas de Javascript

Il est possible de trouver des comparatifs, qui deviennent assez vite obsolète vue la rapidité d'évolution des framework Web.

image

Nous allons partir sur Picnic.css qui coche toutes les cases en plus d'être un peu maintenu.

Test sur l'embarqué

Pour notre test, nous allons choisir un microcontrôleur ESP32 comprenant une connectivité Wifi et plus particulièrement un M5Stick-C ; c'est tout petit, doté d'un boîtier et d'un écran.

La première chose à faire est de créer un premier projet qui imprime quelquechose sur le LCD. Le minimum pour pouvoir déboguer et plus tard afficher des données.