Forum Programmation.autre [electron.js] alléger un binaire

Posté par  . Licence CC By‑SA.
Étiquettes :
0
28
mar.
2018

Bonjour.

Je dois travailler avec des gens qui utilisent electron.js, et je suis assez choqué par la taille du binaire résultant (surtout comparé à ce que fait l'application en question…).
Je ne connais pas la bête, mais à vue de nez, il y a une palanquée de dépendances inutiles à minima dans les sources, les dépendances et leurs versions ne sont absolument pas documentées et les utilisateurs de la technologie ne savent manifestement pas plus que moi comment elle fonctionne.
Personnellement, ça me dérange énormément de:

  1. installer une source de paquets externe sur des machines distantes sur lesquelles on ne pourra avoir la main que via une connexion 3G
  2. encore pire compte tenu du soin manifestement manquant mis dans l'élaboration de npm,
  3. et accessoirement de devoir déployer des correctifs ou mises à jour au travers de forfait données d'à peu près 30Mo/mois (qui sont plutôt censés être utilisés pour le métier à la base, hein… mais en pratique, il faudrait 3 mois pour déployer sans hors-forfait un binaire qui ne fait que de l'affichage somme toute trivial). Zipé, le binaire pèse toujours son bon 30%, et la commande strip ne fait rien.

Pour le 3ème point, on peut régler le souci en envoyant le code source, qui pèse à peu près 6% de la taille du binaire (ressources graphiques incluses, je précise), donc largement plus faisable, mais ça implique d'avoir des compilateurs déployés à distance, ce qui ne me réjouit pas non plus des masses.

J'imagine qu'ici d'autres ont vécu le cas, du coup, comment vous faites?
Au pire, une explication de comment cette usine à gaz génère des binaires pourrait peut-être me permettre de réduire le problème?

  • # les dependances

    Posté par  . Évalué à 2.

    il faut que tu regardes dans le code source s'il y a des appels à des dependances (librairies/bibliotheques) qui finalement ne sont jamais utilisées.

    à ce moment là, tu pourras les retirer, et lors de la compilation le binaire s'en trouvera alleger.

    c'est long et chiant s'il n'y a pas d'outils pour ton langage,
    Sinon recoder l'appli en ne faisant que les appels necessaires.

    ou purger les appels (les mettre en commentaire) et recompiler en remettant les dependances une par une

    • [^] # Re: les dependances

      Posté par  . Évalué à 2.

      Le problème est que je ne connais pas JavaScript, et donc évidemment pas NodeJs et encore moins electron.js.
      C'est censé compiler, mais je doute très fortement que ce soit comme en C, en C++, en Rust, en pascal, en Java… bref dans un langage traditionnellement compilé, c'est à dire que le générateur de binaire ait bien vérifié que tous les appels mènent bien quelque part.
      Peut-être qu'il existe des outils d'analyse statique pour le JS, remarques. Je n'ai pas encore creusé cette piste…

      Sinon recoder l'appli en ne faisant que les appels necessaires.

      Je t'avoue que j'ai été tenté, quand j'ai vu un soft de même pas une 10aine «d'écrans» peser aussi lourd. Mais bon, j'ai une tonne de taf, l'intégration de cette appli au système n'est pas à franchement parler mon métier principal.

      • [^] # Re: les dependances

        Posté par  . Évalué à 4.

        Je t'avoue que j'ai été tenté, quand j'ai vu un soft de même pas une 10aine «d'écrans» peser aussi lourd. Mais bon, j'ai une tonne de taf, l'intégration de cette appli au système n'est pas à franchement parler mon métier principal.

        faut demander au stagiaire qui arrive mardi,
        il est là pour 3 mois de stages dans ton entreprise :D

      • [^] # Re: les dependances

        Posté par  (site web personnel) . Évalué à 2.

        C'est censé compiler, mais je doute très fortement que ce soit comme en C, en C++, en Rust, en pascal, en Java… bref dans un langage traditionnellement compilé, c'est à dire que le générateur de binaire ait bien vérifié que tous les appels mènent bien quelque part.

        Mhh je vais peut-être dire des bêtises parceque je ne connais pas bien electron mais mon attente est qu'il s'agit essentiellement d'un combo navigateur web / NodeJS et que in fine la partie “logique” de l'application est répartie dans plusieurs sources JavaScript dont une partie tourne dans le navigateur et l'autre dans NodeJS.

        En ce qui concerne le JavaScript, il y a effectivement une phase de compilation (avec édition de lien et élimination de code mort et plein d'autres optimisations) mais elle livre un code JavaScript dit “minifié” (voir exemple [https://unpkg.com/react@0.14.3/dist/react-with-addons.min.js}). Le programme “canonique” pour faire ce traitement s'appelle webpack. Dans ton cas, je doute que le code JavaScript fasse plus de quelques ko, ce qui fait la masse de l'application est la masse de dépendences (au minimum un navigateur et un NodeJS) et je m'attends à ce qu'aucun traitement ne soit fait sur ces programmes pour éliminer les parties non susceptibles d'être utilisées par la partie JavaScript.

        C'est toujours mon attente que tu pourrais essayer de vérifier mais je serais surpris si le binaire en question était bien plus qu'une archive auto-extractrice, qui une fois explosée te permet de retrouver ton code JavaScript.

        Pour “sauver les meubles” il faudrait voir si l'application originale peut être installée en connection WiFi au lieu de 3G et s'assurer que les màj ne fassent rien de plus que tirer le nouveau code JavaScript.

        • [^] # Re: les dependances

          Posté par  . Évalué à 2.

          Dans ton cas, je doute que le code JavaScript fasse plus de quelques ko, ce qui fait la masse de l'application est la masse de dépendences

          C'est bien le problème, justement, on passe d'une tarball de moins de 10Mo (ressources incluses) à un bloc de pas loin de 100Mo en «compilé». Je suis d'accord avec toi que le problème vient probablement de la masse des dépendances, et on dirait que le collègue n'a aucune idée des outils dont il dépend vraiment… pour faire simple, c'est un peu comme si on installait une Debian en installant tous les paquets suggérés «juste au cas ou»…

          C'est toujours mon attente que tu pourrais essayer de vérifier mais je serais surpris si le binaire en question était bien plus qu'une archive auto-extractrice, qui une fois explosée te permet de retrouver ton code JavaScript.

          Pas bête, je n'ai pas essayé de le passer à 7z, mais bon, ça serait triste, parce qu'une compression réduit de 70% la taille du blob. Je suis aussi persuadé, après une inspection rapide à l'éditeur de texte que les symboles ne sont pas stripés, mais strip semble ne rien faire?

          Pour “sauver les meubles” il faudrait voir si l'application originale peut être installée en connection WiFi au lieu de 3G et s'assurer que les màj ne fassent rien de plus que tirer le nouveau code JavaScript.

          C'est plus ou moins l'état ou j'en suis actuellement… garder le «compilateur» et npm (au moins, j'ai réussi à trouver comment faire pour pas que ce truc tourne en tant que root… au pire, son utilisation ne pourra flinguer qu'un compte utilisateur. Les MàJ de ce truc restent hyper dangereuses, mais bon… j'hésite limite à passer en testing en fait…) sur la machine pour recompiler le code.

          • [^] # Re: les dependances

            Posté par  . Évalué à 3.

            après une inspection rapide à l'éditeur de texte que les symboles ne sont pas stripés, mais strip semble ne rien faire?

            strip n'est peut-etre pas prevu pour stripper du javascript

            • [^] # Re: les dependances

              Posté par  . Évalué à 2.

              C'est vrai, mais à vue de nez, ça ressemble vraiment à un ELF classique. Bon, je n'ai pas vérifié les détails (je savais le faire sous windows, mais c'était avec du PE, sous windows et y'a 10 ans… déjà…merde.) mais ça y ressemble.

              • [^] # Re: les dependances

                Posté par  (site web personnel) . Évalué à 3.

                C'est vrai, mais à vue de nez, ça ressemble vraiment à un ELF classique.

                C’est un ELF classique… mais c’est l’ELF d’un navigateur web ! Donc même si l’application proprement dite ne fait pas grand’chose et/ou a un code très court, le binaire lui a la taille et la complexité d’un navigateur.

                Je ne pense pas que tu puisses faire grand’chose, c’est le principe même d’Electron qui veut ça. (Mais c’est cool, c’est moderne et tout et tout.)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.