๋™์ž‘ ๊ณต๊ฐ„์„ ๋ถ„๋ฆฌ์‹œ์ผœ ๋ถ€ํ•˜๋ฅผ ์ค„์ด๋Š” ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ๋‚˜๋ณด๋‹ค.
ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ„์•ผ๊ฐ€ ๋งŽ์•„์„œ ํ•™์Šต์ด ํ•„์š”ํ•˜์—ฌ ๋…ธํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ ์—ฐ๊ตฌ๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค.

์ฐธ๊ณ ๋งํฌ

vite์—์„œ worker.js ํŒŒ์ผ ์‚ฌ์šฉํ•˜๊ธฐ

์ผ๋ฐ˜์ ์ธ ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜ค๋Š”๊ฑฐ๋ž‘ ๊ฐ™์•„์„œ vite๊ฐ™์€ ํŠธ๋žœ์ŠคํŒŒ์ผ๋ง์„ ์‚ฌ์šฉํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ ๋ถˆ๋Ÿฌ์˜ค๋ฉด public๋””๋ ‰ํ† ๋ฆฌ์—๋‹ค worker.js ํŒŒ์ผ์„ ๋„ฃ๊ณ  ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.
ํ•˜์ง€๋งŒ ๊ด€๋ฆฌ์ƒ ์ข‹์€ ๋ชจ์Šต์€ ์•„๋‹ˆ๋ผ์„œ src ๊ฒฝ๋กœ์—๋‹ค ๋„ฃ๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

const worker = new Worker(new URL('./worker.js', import.meta.url), { type: 'module' })

๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

๊ธฐ์ดˆ์ ์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ชจ์Šต์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
worker.jsํŒŒ์ผ์—์„œ ์—ด์‹ฌํžˆ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”์‹œ์ง€๋ฅผ ๋„˜๊ฒจ์ฃผ๋ฉด ๋ ๋“ฏํ•˜๋‹ค.

// main.js
const worker = new Worker(new URL('./worker.js', import.meta.url), { type: 'module' })

console.group('main.js')
console.log('์‹œ์ž‘')
console.groupEnd()

worker.postMessage([ 1, 2 ])

worker.onmessage = function(e)
{
  console.group('main.js')
  console.log('๋ฉ”์ธํŒŒ์ผ์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๋Š”๋‹ค.')
  console.log('data:', e.data)
  console.groupEnd()
}
// worker.js
self.onmessage = function(e)
{
  console.group('worker.js')
  console.log('๋ฉ”์ธ์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์•˜๋‹ค.')
  postMessage({
    message: '๋ฉ”์ธ์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค.',
    data: e.data[0] * e.data[1],
  })
  console.log('222')
  console.groupEnd()
}

worker.js ์˜์—ญ์—์„œ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฌผ์„ postMessage๋ฉ”์„œ๋“œ๋กœ ๋ณด๋‚ด์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.
worker.js ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ์—์„œ self๊ฐ’์œผ๋กœ WorkerGlobalScope์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฉ”์ง€์‹œ๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ๋ฉ”์ธ๊ณผ ์›Œ์ปค ์“ฐ๋ ˆ๋“œ ์˜์—ญ์— ๊ฐ’์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๊ณ , ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๋ คํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒ๋œ๋‹ค.

ํ™œ์šฉ์ฒ˜

๋ฉ”์ธ ์“ฐ๋ ˆ๋“œ์— ์˜ํ–ฅ์„ ์ฃผ์ง€์•Š๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š”์ชฝ์œผ๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋ ๊ฑฐ๊ฐ™์€๋ฐ.. ํ™œ์šฉ์— ๋Œ€ํ•˜์—ฌ ์ข€ ์ƒ๊ฐํ•ด๋ณผ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

  • ๋„คํŠธ์›Œํฌ ํ†ต์‹ 
  • ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€, ์ธ๋ฑ์Šคdb ์ฒ˜๋ฆฌ
  • ํŒŒ์ผ ์‹œ์Šคํ…œ ์ž…์ถœ๋ ฅ
  • ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์˜ค๋žซ๋™์•ˆ ์ž‘์—…ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ
  • UI ์ž‘๋™์— ๋ฐฉํ•ด์—†์ด ์ž‘์—…์„ ํ•ด์•ผํ• ๋•Œ
  • ์›น์†Œ์ผ“ ์ฒ˜๋ฆฌ
  • ์ด๋ฏธ์ง€ ๋กœ๋”ฉ (Image ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ์ด๋ฏธ์ง€ ๋กœ๋”ฉ ์ƒํƒœ, ์„ฑ๊ณต, ์‹คํŒจ ์—ฌ๋ถ€๋ฅผ UI์— ๋™์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋‹ค.)

์ œ์•ฝ

worker.js์˜์—ญ์€ ๋งŒ๋Šฅ์ด ์•„๋‹ˆ๊ณ  ์ œ์•ฝ์ด ์–ด๋А์ •๋„์ธ์ง€ ์•Œ๊ณ ์žˆ๋Š”๊ฒƒ์ด ์ข‹์€๊ฑฐ๊ฐ™๋‹ค.

  • dom ์ปจํŠธ๋กค ๊ด€๋ จ๋œ์ชฝ์€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. (new Image ๊ฐ™์€๊ฑธ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.)
  • ๋ฉ”๋ชจ๋ฆฌ ๊ณต์œ ํ•˜์ง€ ์•Š๋Š”๋‹ค. (๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ณต์œ  ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์ถ”์ฒœ์€ ์•ˆํ•œ๋‹ค๊ณ ..)

๋งˆ์น˜ node.js ์˜์—ญ๊ฐ™์€ ์ธ์ƒ์ด๋‹ค.

structuredClone()

์นจ๊ณ ๋งํฌ

๋ฐ์ดํ„ฐ ์ „๋‹ฌ์„ ์œ„ํ•˜์—ฌ ๊นŠ์€๋ณต์‚ฌ ํ•จ์ˆ˜์ธ๋ฐ JSON.stringfy() ๋กœ ์‚ฝ์งˆ์„ ์•ˆํ•ด๋„ ๋˜๋Š” ํ•จ์ˆ˜๋‹ค.

OffscreenCanvas

๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ์—์„œ canvas ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๋Š”๋“ฏํ•œ๋ฐ.. ์ด๋ฏธ์ง€ ๋ฆฌ์‚ฌ์ด์ฆˆ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ• ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„๊ฑฐ ๊ฐ™๋‹ค.
์ž ๊น ๋ฐ๋ชจ๋ฅผ ์ž‘์„ฑํ•ด๋ณด๋‹ˆ ๋ฉ”์ธ์—์„œ ์›Œ์ปค๋กœ ์บ”๋ฒ„์Šค ๊ฐ์ฒด๋ฅผ ๋„˜๊ฒจ์ฃผ๊ณ  ์›น ์›Œ์ปค ๋‚ด๋ถ€์—์„œ ์บ”๋ฒ„์Šค ๊ฐ์ฒด ์ง์ ‘ ์ปจํŠธ๋กคํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ด์ •๋„๋งŒ ํ•ด๋„ ์ •๋ง๋กœ ๊ฐ์‚ฌํ•œ ์ผ์ธ๋“ฏํ•˜๋‹ค. ใ…Žใ„ท~

๋‹ค์Œ์€ ํ™•์ธ์„ ์œ„ํ•œ ๋ฐ๋ชจ์ฝ”๋“œ๋‹ค.

// main.js
const worker = new Worker(new URL('./worker.js', import.meta.url), { type: 'module' })

const canvas = document.createElement('canvas')
const offScreenCanvas = canvas.transferControlToOffscreen()

worker.postMessage({
  canvas: offScreenCanvas,
  src: 'image.jpg',
}, [ offScreenCanvas ])

document.body.appendChild(canvas)
// worker.js
addEventListener('message', async function(e) {
  const { canvas, src } = e.data
  const context = canvas.getContext('2d')
  let image = await fetch(src)
  image = await image.blob()
  const bitmap = await createImageBitmap(image)
  canvas.width = bitmap.width
  canvas.height = bitmap.height
  context.drawImage(bitmap, 0, 0)
})

์ฐธ๊ณ ๋งํฌ

vite์—์„œ ๋นŒ๋“œํ• ๋•Œ inline์œผ๋กœ ๋ฉ”์ธ ์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ์— ํฌํ•จ์‹œํ‚ค๊ธฐ

๊ธฐ๋ณธ์ ์œผ๋กœ ์›น ์›Œ์ปค์˜ ํŒŒ์ผ์€ ๋ณ„๋„๋กœ ๋ถˆ๋Ÿฌ์™€์„œ ์‚ฌ์šฉํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ˜•ํƒœ๋กœ ๋ฐฐํฌํ• ๋•Œ ์™ ๋งŒํ•˜๋ฉด ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ ํ•ฉ์ณ์„œ ๋ฐฐํฌํ•˜๋Š”๊ฒƒ์ด ์ข‹์€์ ์ด ๋งŽ๋‹ค.
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์›น ์›Œ์ปค์šฉ์œผ๋กœ ์ˆ˜์ •ํ•˜๊ณ  ๋นŒ๋“œํ•ด๋ณด๋‹ˆ worker ํŒŒ์ผ์ด ๋”ฐ๋กœ ๋งŒ๋“ค์–ด์กŒ๋‹ค.

๊ทธ๋ž˜์„œ ์ข€ ์ฐพ์•„๋ณด๋‹ˆ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์›Œ์ปค๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋‹ˆ ์›Œ์ปค ์ฝ”๋“œ๊ฐ€ uri ์ธ์ฝ”๋”ฉ์„ ํ•˜์—ฌ ๋ฌธ์ž๋กœ ๋ฐ”๊ฟ”๋ฒ„๋ ธ๋‹ค.

import MyWorker from './worker.js?worker&inline'
const worker = new ImageResizeWorker()

์ •์ƒ์ ์ธ ๋ฐฉ๋ฒ•์ด ์•„๋‹Œ๊ฑฐ ๊ฐ™์ง€๋งŒ ์ž˜ ์ž‘๋™ํ•œ๋‹ค.;;

์ฐธ๊ณ : https://vitejs.dev/guide/assets#importing-script-as-a-worker

๋ฉ”ํƒ€๋ฐ์ดํ„ฐ

์กฐํšŒ์ˆ˜
448
์ข‹์•„์š”
0

1๊ฐœ์˜ ๋Œ“๊ธ€

OffscreenCanvas ๋ถ€๋ถ„์„ ์‚ดํŽด๋ณผ๋•Œ ๊ณผ๊ฑฐ์— canvas ์‚ฌ์šฉ์—์„œ ํผํฌ๋จผ์Šค ์ด์Šˆ๋‚ฌ๋˜๊ฒƒ๋“ค์ด ์ƒ๊ฐ๋‚ฌ๋‹ค.
์ด๊ฑธ ์‚ฌ์šฉํ–ˆ์œผ๋ฉด ๋งŽ์ด ๋„์›€๋์„ํ…๋ฐ.. ๋ผ๋Š” ์ƒ๊ฐ์ด ์ข€ ๋งŽ์ด ๋“ค์—ˆ๋‹ค. ใ… ใ