Node-vibrant: Reducir el tamaño de la biblioteca

Creado en 21 jun. 2019  ·  9Comentarios  ·  Fuente: Vibrant-Colors/node-vibrant

Veo que esta biblioteca declara jimp como una dependencia para realizar algunas transformaciones.

Estoy analizando las dependencias de mis proyectos (tengo node-vibrant en mi package.json y parece que jimp necesito muchos espacios:

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

El punto es que jimp incluye algún complemento por defecto:

--- /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

pero no estoy seguro de si todos los complementos son relevantes para node-vibrant .

Quiero sugerir dos enfoques:

Considere usar sharp

(mi solución favorita)

Como puede ver en mi paquete, también tengo sharp como dependencia.

La principal diferencia entre ambos es que jimp es 100% código javascript, mientras que sharp delega en binarios de hijo.

La primera vez pensé que jimp podría ser mejor ya que no tiene dependencias, pero la realidad es muy diferente: sharp envían binarios preinstalados y el tamaño del paquete es en realidad mucho más pequeño de jimp .

De hecho, sharp perf es superior, consulte
http://sharp.pixelplumbing.com/en/stable/performance/

Solo excluya los no necesarios jimp

Supongo que dentro de 185 MB que jimp está agregando allí, solo se usan algunas cosas.

No estoy seguro de cómo hacer eso desde node-vibrant , pero por ejemplo, agregar una pequeña sección en README.md enumera explícitamente los complementos necesarios jimp debería ser suficiente para que cualquiera excluya el resto de cosas no necesarias en un paso previo a la construcción

enhancement

Comentario más útil

Aquí hay algunas investigaciones adicionales sobre cómo se podría configurar jimp para reducir el tamaño:

El paquete @jimp/custom actúa como una base para agregar complementos desde cero. Su exportación predeterminada es una función configure que toma matrices de types (tipos de imágenes compatibles) y plugins (complementos para usar).

@jimp/types exporta todos los tipos incluidos en el paquete principal jimp , lo que facilita la compatibilidad con las mismas imágenes que ahora soporta el nodo vibrante.

El único complemento especial que nodo-vibrante parece usar es la función resize . El complemento correspondiente es @jimp/plugin-resize .


El paquete @vibrant/image-node podría actualizarse con lo siguiente cerca de la parte superior del 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]
});

Todos 9 comentarios

Me encanta el trabajo que has hecho para investigar esto, un sincero agradecimiento.

Es poco probable que sharp sea ​​una solución que podamos adoptar, ya que (a pesar del nombre) admitimos que el navegador ejecute node-vibrant por sí solo.

Sin embargo, tiene toda la razón en que jimp no es necesario para gran parte del uso de node-vibrant . Actualmente estamos restringiendo el desarrollo para la base de código "estable" actual, estamos trabajando en una reescritura de la base de código a un monorepo (lo que significa que puede elegir lo que desea usar de node-vibrant en el futuro también !) y he confirmado que es una optimización de tamaño que también podemos hacer allí.

Tengo una semana muy ocupada por delante, pero haré todo lo posible para volver el próximo fin de semana para hacer este cambio.

De lo contrario, siempre amamos y aceptamos solicitudes de extracción 👀

Noté otra cosa detrás de @jimp : tienen core-js como dependencia, ¡y esta dependencia se instala para cada complemento!

Es por eso que los tamaños de @jimp son 185MB: core-js toma 7.4MiB x 27 módulos = DEMASIADO ESPACIO.

Probablemente core-js podría declararse de una manera que puedan compartir entre los complementos

Aquí hay algunas investigaciones adicionales sobre cómo se podría configurar jimp para reducir el tamaño:

El paquete @jimp/custom actúa como una base para agregar complementos desde cero. Su exportación predeterminada es una función configure que toma matrices de types (tipos de imágenes compatibles) y plugins (complementos para usar).

@jimp/types exporta todos los tipos incluidos en el paquete principal jimp , lo que facilita la compatibilidad con las mismas imágenes que ahora soporta el nodo vibrante.

El único complemento especial que nodo-vibrante parece usar es la función resize . El complemento correspondiente es @jimp/plugin-resize .


El paquete @vibrant/image-node podría actualizarse con lo siguiente cerca de la parte superior del 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]
});

Parece que podría necesitar escribir algunas mecanografías, pero muchas gracias @NotWoods. Intentaré terminar esto esta semana

Las tipificaciones están tardando más de lo que pensaba originalmente. Sé que voy por el camino más largo, pero quiero asegurarme de que estoy arreglando el ecosistema y nuestras propias necesidades.

Los mecanografiados para jimp terminaron tomando un poco, pero es una buena contribución en sentido ascendente:

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

Después de fusionar esto, haré la optimización a node-vibrant

Con el lanzamiento de Jimp 0.8.4, ¡esto ahora se puede hacer! ¡Tendré un PR abierto esta noche con él! :D

Esperando https://github.com/oliver-moran/jimp/pull/815 para solucionar algunos problemas después de jimp 0.8.4 con la importación

Esto se ha resuelto a partir del lanzamiento de 3.1.5

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

stelasido picture stelasido  ·  15Comentarios

amirping picture amirping  ·  6Comentarios

catusmagnus picture catusmagnus  ·  5Comentarios

nitriques picture nitriques  ·  12Comentarios

inbarshani picture inbarshani  ·  4Comentarios