ng'stuff

🔭 🎶 🕺

Compiler sa web app pour une livraison parfaite

Pas envie déployer des centaines de méga de dépendances ? Un build Astro, next ou autre embarque bien plus de node_modules que nécessaire.

Voici quelques techniques pour être fier de son livrable. Et si tu ne veux pas te prendre la tête, jette un œil à la dernière section ;)

Tout regrouper avec esbuild

Bundle Astro
sh
npm exec esbuild -- \
  dist/server/entry.mjs \
  --bundle \
  --outfile=dist/server/entry.cjs \
  --external:sharp \
  --platform=node \
  --format=cjs \
  --sourcemap=inline \
  --define:import.meta.url=$(node -e "process.stdout.write(JSON.stringify(import.meta.resolve('./dist/server/entry.cjs')))")

Gros avantage : plus besoin de se prendre la tête avec les dépendances de dev ou non, transitives ou non, du type de package manager…​ On laisse esbuild regrouper uniquement le nécessaire !

Ensuite, chacun sa stratégie mais grosso modo on supprime node_modules avant de passer à la suite.

Utiliser deno compile sur son application nodejs

En principe, deno n’a pas besoin de l’étape précédente. Une application développée entièrement sous deno compilera très bien sans bidouille.

Toutefois deno compile peut aussi nous rendre service dans un environnement node.

Runtime deno en production

  • Augmente la sécurité en permettant la gestion des permissions
  • Facilite grandement le reporting télémétrique avec OTEL
  • Favorise la vitesse d’exécution par rapport à node

Un simple exécutable

  • Un déploiement plus simple
  • Moins de versions au runtime à gérer
  • Optimisé pour limiter l’IO et les risques de corruption

Les intégrations de deno compile font le café ☕

En fait, deno peut compiler automatiquement je cite :

  • Next.js
  • Astro
  • Fresh (1.x and 2.x)
  • Remix
  • React Router
  • SvelteKit
  • Nuxt
  • SolidStart
  • TanStack Start
  • Vite (SSR, plus SPA/MPA projects served as static output)

Pour cela il suffit donc de cibler le dossier du projet comme point d’entrée et…​ c’est tout.

sh
deno compile .

Pas de deno.json, juste un projet node existant et deno fait le nécessaire pour gérer les dépendances et lancer les étapes intermédiaires.


Les sections précédentes peuvent quand même être utiles pour gagner en contrôle. Par exemple, Astro n’optimise (vraiment) pas ses dépendances de production. Deno par souci de compatibilité embarque tout node_modules. Les perfectionnistes voudront donc passer un coup d’esbuild là dessus avant de retirer ces infâmes modules…​

sh
deno compile --bundle --minify main.ts

Je recommanderais tout de même de bien comprendre les mécanismes sous-jacents avant de s’y frotter. Et d’être prêt à utiliser une API expérimentale :)

Retour aux articles 👀