1 points par GN⁺ 5 시간 전 | 1 commentaires | Partager sur WhatsApp
  • Permet de regrouper un projet Deno créé avec une application web et du code TypeScript dans un binaire d’application de bureau redistribuable selon la plateforme
  • La sortie inclut à la fois le code de l’application, le runtime Deno et le moteur de rendu web ; la fonctionnalité est arrivée dans Deno v2.9.0, mais n’est pas encore une version stable
  • Le backend WebView par défaut utilise le webview intégré au système d’exploitation pour viser de petits binaires, et si une cohérence de rendu est nécessaire, il est possible de choisir le backend Chromium (CEF)
  • Détecte les projets Next.js, Astro, Fresh, Remix, Nuxt, SvelteKit, SolidStart, TanStack Start et Vite SSR, puis exécute le serveur selon le mode release ou le mode de développement --hmr
  • La communication entre le code Deno et le webview utilise des canaux en processus plutôt qu’un IPC basé sur des sockets, et le périmètre couvre aussi la compilation croisée ainsi que les mises à jour automatiques basées sur bsdiff

Rôle et état actuel de deno desktop

  • deno desktop transforme un projet Deno en application de bureau autonome
    • L’entrée peut aller d’un simple fichier TypeScript à une application Next.js
    • La sortie est un binaire redistribuable propre à chaque plateforme
    • Le binaire inclut le code de l’application, le runtime Deno et un moteur de rendu web
  • Cette fonctionnalité est incluse dans Deno v2.9.0, mais il ne s’agit pas encore d’une version stable
    • Pour l’essayer dès maintenant, il faut installer un build canary avec deno upgrade canary
    • Les commandes, clés de configuration et l’API TypeScript peuvent encore changer avant stabilisation

Choix du backend et exécution des projets web

  • L’approche consiste à utiliser les technologies web comme toolkit d’interface de bureau, tout en réduisant les compromis habituels des outils d’applications de bureau fondés sur les stacks web existantes
    • Des outils comme Electron, Tauri ou Electrobun peuvent présenter des compromis tels que de gros binaires, un support incomplet selon les plateformes, l’absence de certains éléments de l’écosystème JavaScript, l’absence de mise à jour intégrée ou encore le manque d’intégration avec les frameworks
  • Le backend WebView par défaut utilise le webview du système d’exploitation pour viser des binaires légers
    • L’écosystème npm peut être utilisé via la couche de compatibilité Node de Deno
    • Si le même rendu est nécessaire sur macOS, Windows et Linux, il est possible de choisir le backend CEF, avec Chromium embarqué
  • La détection automatique des frameworks permet d’exécuter sur le bureau des projets web existants sans modification de code
    • Les frameworks visés incluent Next.js, Astro, Fresh, Remix, Nuxt, SvelteKit, SolidStart, TanStack Start et Vite SSR
    • En mode release, le serveur de production est lancé
    • Avec --hmr, c’est le serveur de développement avec hot reload qui est exécuté

Communication runtime, build et mises à jour

  • La communication entre le backend et l’interface utilise des canaux en processus
    • Les valeurs sont encodées lorsqu’elles traversent la frontière d’appel
    • Il n’y a pas d’aller-retour inter-processus entre le code Deno et le webview
  • Il est possible d’effectuer une compilation croisée depuis une seule machine vers macOS, Windows et Linux
    • Le backend n’est pas compilé localement ; il est téléchargé à la demande
  • Les mises à jour automatiques reposent sur une mise à jour différentielle binaire intégrée, utilisant un manifeste latest.json et des patchs bsdiff
    • Le runtime gère le polling, l’application des mises à jour et le rollback en cas d’exécution défaillante

Exemple simple et organisation de la documentation

  • Une application de bureau en un seul fichier peut être créée en définissant un main.ts qui renvoie une réponse HTML avec Deno.serve(), puis en exécutant deno desktop main.ts
Deno.serve(() =>
  new Response("Hello, desktop

", {
    headers: { "content-type": "text/html" },
  })
);
deno desktop main.ts
  • Le binaire compilé ouvre une fenêtre pointant vers un serveur HTTP local lié au gestionnaire Deno.serve()
    • Sur macOS/Linux, on l’exécute avec ./main
    • Sous Windows, on l’exécute avec .\\main.exe
  • Deno.serve() se lie automatiquement à l’adresse vers laquelle le webview navigue ; il n’est donc pas nécessaire de fournir un port ou un nom d’hôte
  • La documentation associée est organisée en sections sur la configuration, les backends, le service HTTP, les frameworks, la gestion des fenêtres, les bindings, les menus, le tray et le dock, les boîtes de dialogue, les notifications, HMR, DevTools, les mises à jour automatiques, les rapports d’erreur, le déploiement, la comparaison et la référence CLI
    • Deno.BrowserWindow concerne le cycle de vie des fenêtres, les fenêtres multiples et les événements
    • Deno.autoUpdate() concerne le manifeste, bsdiff et le rollback
    • bindings.() est le mécanisme de binding permettant d’appeler du code Deno depuis le webview

1 commentaires

 
GN⁺ 5 시간 전
Avis sur Hacker News
  • Deno Desktop semble avoir choisi ce compromis de façon assez affirmée : « petit par défaut, compatibilité Node complète »
    J’ai essayé deno desktop index.ts avec le Hello World en 5 lignes de l’article, et le résultat faisait 442 MB sous Windows 10
    Je pensais que ce serait plus petit qu’un build Electron, mais c’était bien plus gros que prévu ; libcef.dll faisait 247 MB et deno-test.dll, qui contenait le Hello World, 78 MB
    Je me demande si j’ai raté quelque chose

    • Il me semble qu’un Hello World Electron faisait aussi environ 100 à 150 MB en incluant le runtime navigateur/Chromium
      Donc j’espérais qu’en réutilisant un webview système ou quelque chose du genre on puisse arriver à une solution sous les 20 MB, mais dépasser 400 MB me paraît un peu trompeur
      J’ai peut-être mal configuré quelque chose, donc je me demande s’il faut faire autre chose que deno desktop test.ts
  • Le passage disant que « plutôt que de bundler CEF dans chaque application, ils pourraient gérer un runtime CEF partagé, ce qui réduirait la taille du binaire à quelques MB par app, et c’est sur la roadmap » est intéressant
    Je connais mal CEF, donc je me demande comment la gestion des versions fonctionnerait
    Si chaque application demande une version différente de CEF, est-ce qu’on retombe au final sur le modèle d’Electron où chaque app embarque son propre navigateur, ou bien est-ce qu’un runtime partagé garde quand même des avantages dans ce cas ?
    https://docs.deno.com/runtime/desktop/comparison/

    • CEF signifie Chromium Embedded Framework
      https://github.com/chromiumembedded/cef
    • À noter que CEF a aussi été utilisé par Riot et le client de League of Legends
      Le résultat n’était pas fameux, mais je ne sais pas si c’était dû à CEF lui-même ou à d’autres composants / processus
      https://www.riotgames.com/en/news/architecture-league-client...
    • Je doute que le gain soit si important
      En pratique, les applications Electron sur desktop utilisent presque toutes des versions différentes de Chromium, et certaines gardent de vieilles versions à cause du risque de casse lors des mises à jour
    • Les développeurs web ont l’habitude d’un environnement cible continuellement mis à jour, donc on peut imaginer un modèle du type « donne-moi simplement la dernière version disponible sur la machine », avec la possibilité d’y adhérer ou non
    • J’aimerais mieux utiliser le webview système plutôt que télécharger et gérer un navigateur embarqué
      Sous Windows, ce serait une approche de type WebView2
  • Deno continue d’être impressionnant
    Ça fait un bon moment que je n’ai pas démarré de nouveau projet sans Deno, et je soutiens désormais complètement l’écosystème Deno plutôt que Node.js
    Je ne sais pas à quelle fréquence j’utiliserai cette fonctionnalité, mais c’est vraiment bien d’avoir ce choix

  • Travail impressionnant
    Ça pourrait être particulièrement intéressant pour créer des applications desktop en vibe coding
    Des outils comme Lovable, Bolt ou v0 utilisent déjà TypeScript par défaut pour générer des applis web, donc ça semble très bien coller ici
    Pour de petites applications desktop, j’utilisais plutôt Go/Wails au lieu de bundler Chromium et Node, et même si Electron faisait bien le job, ces gros bundles m’ont toujours franchement rebuté

  • Je me demandais comment cela s’intègre avec le système de permissions de Deno, qui est l’un de ses plus gros points forts
    C’est particulièrement important quand on laisse des agents se balader librement sur sa machine
    La documentation de référence de la CLI dit que « les permissions accordées à la compilation sont intégrées dans le binaire compilé »
    Ce serait bien que ce soit exposé de manière à ce que l’utilisateur puisse savoir et décider quelles permissions accorder
    https://docs.deno.com/runtime/reference/cli/desktop/#runtime...

    • Là, on parle d’exécuter un binaire reçu d’un développeur
      Afficher à ce moment-là une invite de permissions Deno me semblerait même trompeur, puisqu’il n’y aurait aucune garantie d’intégrité sur ces permissions
    • Une chose qui manque encore à Deno Desktop, ce sont des permissions d’exécution pour les applications desktop
      Autrement dit, appliquer le système de permissions de Deno au sandboxing desktop, avec des invites pour chaque accès au système de fichiers ou au réseau
  • C’est une fonctionnalité intelligente à lancer
    Ça me semblerait tout à fait digne d’être pris en compte au moment de choisir une plateforme

    • D’accord
      Avec une petite taille d’installation et le multiplateforme, ça ressemble à une alternative crédible à Electron ou Tauri
  • Je ne pense pas que la formule « les technologies web sont la boîte à outils UI la plus connue au monde » soit très appropriée
    Si les apps Electron sont souvent critiquées, c’est justement presque pour la raison inverse d’une boîte à outils UI
    Elles ne respectent souvent pas correctement les patterns UI de l’OS hôte
    Les technologies web restent simplement des technologies web : elles peuvent afficher un bouton, mais rien ne garantit qu’un bouton même non stylé aura un aspect natif pour l’OS, et cela varie selon le navigateur

    • Ce n’est pas pour ça que les gens utilisent Electron
      L’objectif n’a jamais été simplement une « boîte à outils UI » ni « suivre les patterns UI de l’OS hôte »
      Chromium embarque énormément de fonctionnalités, et Electron récupère directement toute cette utilité, ce qui est un avantage
      Par exemple, si vous avez déjà travaillé sur la vidéo, vous savez que pouvoir exploiter toutes les capacités d’un navigateur moderne dans une application desktop change complètement la donne
      Non seulement pour la lecture vidéo, mais aussi pour le transcodage rendu possible par le web moderne et WebCodecs : tout réimplémenter soi-même représenterait un énorme travail, surtout pour une app desktop censée fonctionner sur Windows/macOS/Linux
      J’ai une app faite avec Electron en quelques dizaines d’heures ; autrement, cela aurait probablement pris des dizaines de jours, et même avec l’IA cela aurait été difficile sans être spécialiste de la vidéo
    • Je ne vois pas pourquoi cette formulation serait mauvaise
      Il n’a jamais été prétendu que l’UI était « native »
      L’UI native de Linux m’a toujours semblé très laide ; je préfère largement une mise en page HTML+CSS bien soignée
      D’après mon expérience, Electron est surtout critiqué parce qu’il est lourd et lent ; le fait qu’il ne soit pas natif est plutôt un reproche annexe que les gens ajoutent
      Depuis longtemps, je voulais une intégration directe du navigateur qui utilise HTML+CSS pour la mise en page sans nécessiter de runtime JavaScript
      Je ne sais pas à quel point Servo est léger, mais j’aimerais qu’une idée comme celle-là devienne réalité un jour
    • Chaque fois que j’utilise Zed sur Linux, macOS ou Windows, je suis surpris par la stabilité et la rapidité du framework GPUI
      En tant qu’utilisateur, j’en suis très satisfait ; il lui manque encore quelques bases comme l’accessibilité, mais je pense que cela arrivera bientôt
      Du point de vue développeur, à part Rust je ne vois pas très bien où est la barrière à l’entrée, et en même temps Rust est aussi ce qui le différencie
    • Le fait que l’UI ait l’air native ou non a depuis longtemps perdu de sa force comme contre-argument
      C’était déjà un sujet il y a environ 25 ans, et depuis que Microsoft lui-même a commencé à ne plus s’en soucier, plus grand monde n’y attache vraiment d’importance
    • Tu sembles considérer comme un défaut le fait de ne pas suivre les patterns UI de l’OS hôte, mais pour moi c’est justement l’un des principaux avantages d’Electron
      Je ne veux pas que mon application ait un aspect différent selon l’OS
      Je n’ai pas les ressources pour tester sur tous les appareils, et le fait qu’un écran testé sur un système ait exactement le même rendu sur les autres est un énorme avantage
  • Ravi de voir apparaître un concurrent dans ce domaine
    J’apprécie surtout que Deno, contrairement à l’implémentation actuelle de Node qui ne fait qu’enlever les types, puisse exécuter directement du vrai TypeScript
    Cela dit, j’ai l’impression que cela va prendre une bonne partie du marché de Tauri
    Pourquoi utiliser Tauri désormais ?
    Sur la plupart des connexions internet, 150 MB de bundle en plus ne représentent qu’une différence de 1 à 10 secondes au téléchargement, en échange d’un moteur de rendu fiable

    • Deno aussi, quand il exécute du code TypeScript, se contente par défaut de supprimer les annotations de type
      Pour faire la vérification de types, il faut lancer deno run --check ou utiliser séparément la sous-commande deno check
      En pratique, pendant le développement, l’IDE fait généralement automatiquement la vérification de types et le linting, donc ce n’est pas un gros problème
    • Tauri n’enferme pas dans un écosystème JavaScript particulier
      En fait, il n’est même pas nécessaire d’utiliser JavaScript
      Et on a déjà vu plusieurs startups de frameworks pour développeurs comme Astro, Nuxt, UV, Bun ou Vite se faire racheter
      Pour des logiciels qui doivent être maintenus et supportés pendant des années, ce genre d’évolution n’inspire pas vraiment confiance
    • J’utilise Tauri quand le « backend » n’est pas en JavaScript
    • Je ne comprends pas très bien ce que signifie obtenir un « moteur de rendu fiable »
      Deno Desktop et Tauri n’utilisent-ils pas tous les deux la webview système ?
    • Avec cette logique, autant dire qu’il faut utiliser Electron
      Pourquoi faudrait-il utiliser ça, mais pas Electron ?
  • Parmi les contenus publiés par Deno, c’est de loin la section de comparaison que j’ai préférée
    Sur la dernière ligne, le support iOS/Android est indiqué comme « no » pour Electron et « not yet » pour Deno ; s’ils y parviennent réellement, ce sera bien plus important

  • Ça a l’air vraiment idéal pour distribuer un jeu web comme application Steam ou comme app pour des achats en ligne
    Je pense que je vais essayer