SliDesk : Une introduction par Bun
Tags: bunjs, javascript, presentation, cli
Published: 2023-08-23 21:36:34

Faire des talks dans des conférences, c'est cool !
Avoir un bon outil pour cela, c'est encore mieux.

Mes premiers talks datent de 2015 et ils étaient rédigés sur https://slides.com .

Suite à une conférence d'@hsablonniere fin 2016 sur [la Documentation As Code](https://www.youtube.com/watch?v=1rKgVF5CEEY), j'ai découvert asciidoc et son environnement avec asciidoctor.

Ayant vu que Slides.com utilisait aussi RevealJS j'étais en terrain connu donc avec asciidoctor-revealjs.

Pendant quelques temps, j'ai abandonné les talks, les entreprises dans lesquelles je travaillais n'étaient pas dans les cibles visées par les conférences qui m'attiraient.

Mon arrivée chez @zenikait a changé la donne. L'ADN de cette ESN est de participer aux conférences et d'en sponsoriser certaines, elle permet également à ses collaborateurs de participer autant côté speaker qu'attendee.

Ainsi, j'ai commencé mes premiers talks et donc me remettre à "asciidoctor-revealjs".

Aussi, j'aime avoir des outils efficients, qui suffisent à mon besoin.

J'aime coder mes outils pour découvrir l'envers des choses, voir les problématiques que les concepteurs d'autres projets du même type ont eu et comment les résoudre.

[SliDesk](https://github.com/gouz/slidesk) est né de cette idée là.

Après un premier passage sous node.js avec lequel je m'amuse depuis de nombreuses années, je me suis dit pourquoi ne pas tenter l'aventure avec le nouveau challenger https://bun.sh !

## Bun : kézako ?!?

_Bun_ se veut être une boîte à outils et un environnement d'exécution bien plus rapide que _Node.js_ ou _Deno_.

Il est codé en Zig (https://ziglang.org).

Son installation est très simple :

```sh
curl -fsSL https://bun.sh/install | bash
```

Une fois installé, vous aurez accès au runtime et au sdk automatiquement.

Un des premiers points qui m'a séduit dans _Bun_, c'est la non-existence des `node_modules` lorsque l'on souhaite juste lancer un projet JS avec des dépendances. A l'image de `pnpm`, les bibliothèques sont stockées à un unique endroit, soulageant ainsi nos espaces de stockages.

Dès qu'il trouvera une bibliothèque qu'il ne connait pas lors de la lecture du code source, _Bun_ la télécharge et l'installe dans son dépôt interne. Il se base sur le site https://npmjs.com pour trouver les bibliothèques versionnées.

Il fonctionne comme les autres runtimes avec des packages globaux ou locaux par projets.

A l'instar de _Node.js_, il est possible de créer des binaires qui peuvent être exécuté dans un terminal.

Pour cela, il faut mettre dans le fichier `package.json` :

```json
{
  "bin": {
    "slidesk": "./bin/index.js"
  }
}
```

et dans le fichier `./bin/index.js`, il faut commencer par :

```bash
#!/usr/bin/env bun
```

## La commande `bun link`

Un des gros avantages avec _Bun_ quand on code un outil comme SliDesk, c'est la commande `bun link`.

Petite explication par l'exemple.

Créons un répertoire `monprogramme` et déplaçons-nous dedans.

Créons un fichier `package.json` :

```json
{
  "name": "monprogramme",
  "bin": {
    "monprogramme": "./bin/index.js"
  }
}
```

Cette instruction a pour objectif de signaler à _Bun_ que lorsqu'on veut utiliser "monprogramme", au lieu de chercher dans le registre _npmjs.com_, il prendra celui-ci.

Ainsi, après une utilisation de `bun link` dans le répertoire où le fichier `package.json` cité précédemment est créé, elle nous répondra :

```bash
bun link v0.7.3 (a9b3d583)
Success! Registered "monprogramme"

To use monprogramme in a project, run:
  bun link monprogramme

Or add it in dependencies in your package.json file:
  "monprogramme": "link:monprogramme"
```

## Créons un "exécutable"

Toujours dans le répertoire `monprogramme`, nous allons créer un fichier `bin/index.js` pour correspondre aux données saisies dans le fichier `package.json` précédemment instancié.

Dans ce fichier, nous allons donc préciser qu'il s'agit d'un exécutable _Bun_ et il va afficher la version de _Bun_.

```js
#!/usr/bin/env bun

console.log(`Bun version: ${Bun.version}`);
```

Pour le tester on peut faire un `bun bin/index.js` qui nous affichera : `Bun version: 0.7.3`.

Puis je le "link" avec `bun link`.

## Testons cet "exécutable"

Dans un autre répertoire, lançons la commande `bun link monprogramme`. La commande me renvoie :

```sh
bun link v0.7.3 (a9b3d583)

 installed monprogramme@link:monprogramme with binaries:
  - monprogramme


 1 packages installed [3.00ms]
```

Si on regarde dans le répertoire, aucun fichier n'est présent. Le package a été installé dans le répertoire de cache de _Bun_.

Maintenant testons la commande `bunx monprogramme`, elle retourne bien le texte `Bun version: 0.7.3`. `bunx` est un alias de `bun x` automatiquement activé lors de l'installation de _Bun_.

Et voilà la fin de l'introduction à _Bun_. Dans le prochain article nous verrons comment manipuler les répertoires et fichiers avec _Bun_.