Node-vibrant: Réduire la taille de la bibliothèque

Créé le 21 juin 2019  ·  9Commentaires  ·  Source: Vibrant-Colors/node-vibrant

Je vois que cette bibliothèque déclare jimp comme dépendance pour effectuer certaines transformations.

J'analyse les dépendances de mes projets (j'ai node-vibrant dans mon package.json et il me semble que jimp besoin de beaucoup d'espaces :

ncdu 1.14 ~ Use the arrow keys to navigate, press ? for help
--- /deploy/out/node_modules ---------------
  185.0 MiB [##########] /<strong i="11">@jimp</strong>
   38.4 MiB [##        ] /chrome-aws-lambda
   34.2 MiB [#         ] /sharp
   11.0 MiB [          ] /<strong i="12">@browserless</strong>
   11.0 MiB [          ] /<strong i="13">@babel</strong>
    9.2 MiB [          ] /jimp
    6.3 MiB [          ] /core-js
    4.8 MiB [          ] /lodash
    3.2 MiB [          ] /jsdom
    3.1 MiB [          ] /moment
    3.0 MiB [          ] /iltorb
    2.4 MiB [          ] /colorable
    2.1 MiB [          ] /cssstats
    1.9 MiB [          ] /<strong i="14">@cliqz</strong>
    1.7 MiB [          ] /<strong i="15">@microlink</strong>
    1.7 MiB [          ] /graphql
    1.7 MiB [          ] /port-numbers
    1.7 MiB [          ] /node-vibrant

Le fait est que jimp inclut un plugin par défaut :

--- /deploy/out/node_modules/<strong i="20">@jimp</strong> ---------
                         /..
    7.6 MiB [##########] /plugin-print
    7.0 MiB [######### ] /core
    6.9 MiB [######### ] /plugin-resize
    6.9 MiB [######### ] /plugin-color
    6.8 MiB [########  ] /plugin-crop
    6.8 MiB [########  ] /plugin-blur
    6.8 MiB [########  ] /plugin-rotate
    6.8 MiB [########  ] /png
    6.8 MiB [########  ] /custom
    6.8 MiB [########  ] /plugin-blit
    6.8 MiB [########  ] /plugin-contain
    6.8 MiB [########  ] /plugin-normalize
    6.8 MiB [########  ] /plugins
    6.8 MiB [########  ] /plugin-cover
    6.8 MiB [########  ] /plugin-gaussian
    6.8 MiB [########  ] /plugin-scale
    6.8 MiB [########  ] /bmp
    6.8 MiB [########  ] /plugin-mask
    6.8 MiB [########  ] /plugin-displace
    6.8 MiB [########  ] /jpeg

mais je ne sais pas si tous les plugins sont pertinents pour node-vibrant .

Je veux proposer deux approches :

Pensez à utiliser sharp

(ma solution préférée)

Comme vous pouvez le voir dans mon bundle, j'ai aussi sharp comme dépendance.

La principale différence entre les deux est que jimp est un code javascript à 100 %, tandis que sharp délègue aux fichiers binaires fils.

Au début, j'ai pensé que jimp pourrait être mieux car il n'a pas de dépendances, mais la réalité est si différente : sharp expédie des binaires pré-installés et la taille du paquet est en fait trop petite que jimp .

En fait, sharp perf est supérieur, voir
http://sharp.pixelplumbing.com/en/stable/performance/

Excluez simplement les jimp non nécessaires

Je suppose qu'à l'intérieur de 185 Mo que jimp s'y ajoute, seules quelques choses sont réellement utilisées.

Je ne sais pas comment faire cela à partir d'un node-vibrant , mais par exemple, l'ajout d'une petite section sur README.md répertoriant explicitement les plugins jimp nécessaires devrait être suffisant pour que quiconque exclue le reste des choses non nécessaires dans une étape de pré-construction

enhancement

Commentaire le plus utile

Voici quelques recherches supplémentaires sur la façon dont jimp pourrait être configuré pour réduire la taille :

Le package @jimp/custom sert de base pour ajouter des plugins à partir de zéro. Son exportation par défaut est une fonction configure qui prend des tableaux de types (types d'images pris en charge) et plugins (plugins à utiliser).

@jimp/types exporte tous les types inclus dans le package principal jimp , ce qui facilite la prise en charge des mêmes images prises en charge par les nœuds dynamiques maintenant.

Le seul plugin spécial que node-vibrant semble utiliser est la fonction resize . Le plugin correspondant est @jimp/plugin-resize .


Le package @vibrant/image-node peut être mis à jour avec ce qui suit vers le haut du script :

import configure from '@jimp/custom';
import types from '@jimp/types'; // all of jimp's default types
import resize from '@jimp/plugin-resize'; // resize function

const Jimp = configure({
  types: [types],
  plugins: [resize]
});

Tous les 9 commentaires

J'adore le travail que vous avez fait pour examiner cela, un sincère merci.

sharp est peu probable que node-vibrant tout seul.

Cependant, vous avez tout à fait raison de dire que jimp n'est pas requis pour une grande partie de l'utilisation dans node-vibrant . Nous limitons actuellement le développement de la base de code "stable" actuelle, nous travaillons sur une réécriture de la base de code en monorepo (ce qui signifie que vous pouvez également choisir ce que vous voulez utiliser à partir de node-vibrant à l'avenir !) et j'ai confirmé que c'est une optimisation de taille que nous pouvons également faire là-bas.

J'ai une semaine extrêmement chargée devant moi, mais je ferai de mon mieux pour revenir en arrière le week-end prochain pour faire ce changement

Sinon, nous aimons et acceptons toujours les pull requests 👀

J'ai noté une autre chose derrière @jimp : ils ont core-js comme dépendance, et cette dépendance est installée pour chaque plugin !

C'est pourquoi la taille de @jimp est de 185 Mo : core-js prend 7,4 Mio x 27 modules = TROP D'ESPACE.

Probablement core-js pourraient être déclarés d'une manière qu'ils peuvent partager entre les plugins

Voici quelques recherches supplémentaires sur la façon dont jimp pourrait être configuré pour réduire la taille :

Le package @jimp/custom sert de base pour ajouter des plugins à partir de zéro. Son exportation par défaut est une fonction configure qui prend des tableaux de types (types d'images pris en charge) et plugins (plugins à utiliser).

@jimp/types exporte tous les types inclus dans le package principal jimp , ce qui facilite la prise en charge des mêmes images prises en charge par les nœuds dynamiques maintenant.

Le seul plugin spécial que node-vibrant semble utiliser est la fonction resize . Le plugin correspondant est @jimp/plugin-resize .


Le package @vibrant/image-node peut être mis à jour avec ce qui suit vers le haut du script :

import configure from '@jimp/custom';
import types from '@jimp/types'; // all of jimp's default types
import resize from '@jimp/plugin-resize'; // resize function

const Jimp = configure({
  types: [types],
  plugins: [resize]
});

On dirait que je devrais peut-être écrire quelques frappes, mais merci beaucoup @NotWoods. je vais essayer de finir ça cette semaine

Les saisies prennent plus de temps que je ne le pensais au départ. Je sais que je vais loin, mais je veux m'assurer que je répare l'écosystème ainsi que nos propres besoins

Les saisies pour jimp ont fini par prendre un peu, mais c'est une bonne contribution en amont :

https://github.com/oliver-moran/jimp/pull/770

Après avoir fusionné, je ferai l'optimisation à node-vibrant

Avec la sortie de Jimp 0.8.4, c'est désormais possible ! J'aurai un PR ouvert ce soir avec ça ! :RÉ

En attente sur https://github.com/oliver-moran/jimp/pull/815 afin de résoudre certains problèmes après jimp 0.8.4 avec l'import

Cela a été résolu depuis la version 3.1.5

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

lucafaggianelli picture lucafaggianelli  ·  9Commentaires

amirping picture amirping  ·  6Commentaires

stelasido picture stelasido  ·  15Commentaires

inbarshani picture inbarshani  ·  4Commentaires

chetstone picture chetstone  ·  14Commentaires