Node-vibrant: ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํฌ๊ธฐ ์ค„์ด๊ธฐ

์— ๋งŒ๋“  2019๋…„ 06์›” 21์ผ  ยท  9์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: Vibrant-Colors/node-vibrant

์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ jimp ๋ฅผ ์ผ๋ถ€ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ข…์†์„ฑ์œผ๋กœ ์„ ์–ธํ•œ ๊ฒƒ์„ ๋ด…๋‹ˆ๋‹ค.

๋‚œ์ด (๋‚ด ํ”„๋กœ์ ํŠธ ์ข…์†์„ฑ์„ ๋ถ„์„ํ•˜๊ณ ์žˆ์–ด node-vibrant ๋‚ด package.json ์™€ ๊ฐ™์€ ์™ธ๋ชจ jimp ๊ณต๊ฐ„์„ ๋งŽ์ด์—๊ฒŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค :

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

์š”์ ์€ jimp ์— ๊ธฐ๋ณธ์ ์œผ๋กœ ์ผ๋ถ€ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“  ํ”Œ๋Ÿฌ๊ทธ์ธ์ด node-vibrant ์™€ ๊ด€๋ จ์ด ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‘ ๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ œ์•ˆํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

sharp ์‚ฌ์šฉ ๊ณ ๋ ค

(๋‚ด๊ฐ€ ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ์†”๋ฃจ์…˜)

๋‚ด ๋ฒˆ๋“ค์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด sharp ๋„ ์ข…์†์„ฑ์œผ๋กœ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‘˜์˜ ์ฃผ์š” ์ฐจ์ด์ ์€ jimp ๊ฐ€ 100% ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ์ธ ๋ฐ˜๋ฉด sharp ๋Š” ์•„๋“ค ๋ฐ”์ด๋„ˆ๋ฆฌ์— ์œ„์ž„ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฒ˜์Œ์— ๋‚˜๋Š” ์ƒ๊ฐ jimp ๊ฐ€ ์ข…์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์ง€๋งŒ, ํ˜„์‹ค์€ ๋„ˆ๋ฌด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ž˜ ๋  ์ˆ˜์žˆ๋‹ค : sharp ์„ ๋ฐ• ๋ฏธ๋ฆฌ ์„ค์น˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ ํŒจํ‚ค์ง€ ํฌ๊ธฐ๊ฐ€ ์‹ค์ œ๋กœ ์š”์˜ค ... ํ›จ์”ฌ ์ž‘ jimp ๋ณด๋‹ค

์‹ค์ œ๋กœ sharp perf๊ฐ€ ๋” ์šฐ์ˆ˜ํ•ฉ๋‹ˆ๋‹ค.
http://sharp.pixelplumbing.com/en/stable/performance/

ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒƒ์€ ์ œ์™ธ jimp

jimp ๊ฐ€ ์ถ”๊ฐ€๋˜๋Š” 185MB ์•ˆ์— ์‹ค์ œ๋กœ ๋ช‡ ๊ฐ€์ง€๋งŒ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

node-vibrant ์—์„œ ์–ด๋–ป๊ฒŒ ํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ, ์˜ˆ๋ฅผ ๋“ค์–ด README.md ์— ์ž‘์€ ์„น์…˜์„ ์ถ”๊ฐ€ํ•˜๋ฉด ํ•„์š”ํ•œ jimp ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๋ช…์‹œ์ ์œผ๋กœ ๋‚˜์—ด๋˜์–ด ์žˆ์œผ๋ฉด ๋‚˜๋จธ์ง€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒƒ๋“ค์„ ์ œ์™ธํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ์ „ ๊ตฌ์ถ• ๋‹จ๊ณ„

enhancement

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋‹ค์Œ์€ ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด jimp๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์—ฐ๊ตฌ์ž…๋‹ˆ๋‹ค.

@jimp/custom ํŒจํ‚ค์ง€๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ฐ˜ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋‚ด๋ณด๋‚ด๊ธฐ๋Š” types (์ง€์›๋˜๋Š” ์ด๋ฏธ์ง€ ์œ ํ˜•) ๋ฐ plugins (์‚ฌ์šฉํ•  ํ”Œ๋Ÿฌ๊ทธ์ธ)์˜ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋Š” configure ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

@jimp/types ๋Š” ๊ธฐ๋ณธ jimp ํŒจํ‚ค์ง€์— ํฌํ•จ๋œ ๋ชจ๋“  ์œ ํ˜•์„ ๋‚ด๋ณด๋‚ด๋ฏ€๋กœ ์ด์ œ node-vibrant๊ฐ€ ์ง€์›ํ•˜๋Š” ๋™์ผํ•œ ์ด๋ฏธ์ง€๋ฅผ ์‰ฝ๊ฒŒ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

node-vibrant๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋Š” ์œ ์ผํ•œ ํŠน์ˆ˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ์€ resize ๊ธฐ๋Šฅ ์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ํ”Œ๋Ÿฌ๊ทธ์ธ์€ @jimp/plugin-resize ์ž…๋‹ˆ๋‹ค.


@vibrant/image-node ํŒจํ‚ค์ง€๋Š” ์Šคํฌ๋ฆฝํŠธ ์ƒ๋‹จ ๊ทผ์ฒ˜์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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]
});

๋ชจ๋“  9 ๋Œ“๊ธ€

์ด ๋ฌธ์ œ๋ฅผ ์กฐ์‚ฌํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰ํ•œ ์ž‘์—…์„ ์‚ฌ๋ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ง„์‹ฌ์œผ๋กœ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

sharp ๋Š” (์ด๋ฆ„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ ) ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ž์ฒด์ ์œผ๋กœ node-vibrant ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋ฏ€๋กœ ์šฐ๋ฆฌ๊ฐ€ ์ทจํ•  ์ˆ˜ ์žˆ๋Š” ์†”๋ฃจ์…˜์€ ์•„๋‹™๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜, ๋‹น์‹ ์€ ์ ˆ๋Œ€์ ์œผ๋กœ ์˜ฌ๋ฐ”๋ฅธ ๊ฒƒ jimp ์—์„œ ์‚ฌ์šฉ์˜ ๋Œ€๋ถ€๋ถ„ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค node-vibrant . ์šฐ๋ฆฌ๋Š” ํ˜„์žฌ ํ˜„์žฌ "์•ˆ์ •๋œ" ์ฝ”๋“œ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ๊ฐœ๋ฐœ์„ ์ œํ•œํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ monorepo๋กœ ์žฌ์ž‘์„ฑํ•˜๋Š” ์ž‘์—…์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(์ด๋Š” ๋ฏธ๋ž˜์—๋„ node-vibrant ์—์„œ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค !) ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ๊ฑฐ๊ธฐ์—์„œ๋„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ํฌ๊ธฐ ์ตœ์ ํ™”์ž„์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

์•ž์œผ๋กœ ๋งค์šฐ ๋ฐ”์œ ํ•œ ์ฃผ๋ฅผ ๋ณด๋‚ด์•ผ ํ•˜์ง€๋งŒ ๋‹ค์Œ ์ฃผ๋ง์— ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์„ ์„ ๋‹คํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, ์šฐ๋ฆฌ๋Š” ํ•ญ์ƒ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์‚ฌ๋ž‘ํ•˜๊ณ  ์ˆ˜๋ฝํ•ฉ๋‹ˆ๋‹ค ๐Ÿ‘€

@jimp ๋’ค์— ์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ ์‚ฌ์‹ค์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. core-js ๋ฅผ ์ข…์†์„ฑ์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ์ด ์ข…์†์„ฑ์€ ๋ชจ๋“  ํ”Œ๋Ÿฌ๊ทธ์ธ๋งˆ๋‹ค ์„ค์น˜๋ฉ๋‹ˆ๋‹ค!

์ด๊ฒƒ์ด @jimp ํฌ๊ธฐ๊ฐ€ 185MB์ธ ์ด์œ ์ž…๋‹ˆ๋‹ค. core-js ๋Š” 7.4MiB x 27 ๋ชจ๋“ˆ = ๋„ˆ๋ฌด ๋งŽ์€ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์•„๋งˆ๋„ core-js ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ฐ„์— ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ์„ ์–ธ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด jimp๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์—ฐ๊ตฌ์ž…๋‹ˆ๋‹ค.

@jimp/custom ํŒจํ‚ค์ง€๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ฐ˜ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋‚ด๋ณด๋‚ด๊ธฐ๋Š” types (์ง€์›๋˜๋Š” ์ด๋ฏธ์ง€ ์œ ํ˜•) ๋ฐ plugins (์‚ฌ์šฉํ•  ํ”Œ๋Ÿฌ๊ทธ์ธ)์˜ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋Š” configure ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

@jimp/types ๋Š” ๊ธฐ๋ณธ jimp ํŒจํ‚ค์ง€์— ํฌํ•จ๋œ ๋ชจ๋“  ์œ ํ˜•์„ ๋‚ด๋ณด๋‚ด๋ฏ€๋กœ ์ด์ œ node-vibrant๊ฐ€ ์ง€์›ํ•˜๋Š” ๋™์ผํ•œ ์ด๋ฏธ์ง€๋ฅผ ์‰ฝ๊ฒŒ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

node-vibrant๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋Š” ์œ ์ผํ•œ ํŠน์ˆ˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ์€ resize ๊ธฐ๋Šฅ ์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ํ”Œ๋Ÿฌ๊ทธ์ธ์€ @jimp/plugin-resize ์ž…๋‹ˆ๋‹ค.


@vibrant/image-node ํŒจํ‚ค์ง€๋Š” ์Šคํฌ๋ฆฝํŠธ ์ƒ๋‹จ ๊ทผ์ฒ˜์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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]
});

๋ช‡ ๊ฐ€์ง€ ํƒ€์ดํ•‘์„ ์ž‘์„ฑํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์ง€๋งŒ @NotWoods์—๊ฒŒ ์—„์ฒญ๋‚œ ๊ฐ์‚ฌ๋ฅผ ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ด๋ฒˆ์ฃผ์— ๋๋‚ด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค

์›๋ž˜ ์ƒ๊ฐํ–ˆ๋˜ ๊ฒƒ๋ณด๋‹ค ํƒ€์ดํ•‘ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋จผ ๊ธธ์„ ๊ฐ€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์ƒํƒœ๊ณ„์™€ ์šฐ๋ฆฌ ์ž์‹ ์˜ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ˆ˜์ •ํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

jimp์— ๋Œ€ํ•œ ํƒ€์ดํ•‘์€ ๊ฒฐ๊ตญ ์•ฝ๊ฐ„์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์ง€๋งŒ ์—…์ŠคํŠธ๋ฆผ์— ์ข‹์€ ๊ธฐ์—ฌ๋ฅผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

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

๋ณ‘ํ•ฉ ํ›„ node-vibrant ์ตœ์ ํ™”ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Jimp 0.8.4๊ฐ€ ์ถœ์‹œ๋˜๋ฉด์„œ ์ด์ œ ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค! ์˜ค๋Š˜ ๋ฐค PR์„ ๊ณต๊ฐœํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค! :NS

๊ฐ€์ ธ์˜ค๊ธฐ jimp 0.8.4 ์ดํ›„์˜ ์ผ๋ถ€ ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด https://github.com/oliver-moran/jimp/pull/815 ์—์„œ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ 3.1.5 ๋ฆด๋ฆฌ์Šค๋ถ€ํ„ฐ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰