React: ์–ด๋–ค ์ƒํ™ฉ์—์„œ unstable_shouldYield๋Š” true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๊นŒ?

์— ๋งŒ๋“  2019๋…„ 02์›” 08์ผ  ยท  4์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: facebook/react

Scheduler.js์—์„œ

function unstable_shouldYield() {
  return (
    !currentDidTimeout &&
    ((firstCallbackNode !== null &&
      firstCallbackNode.expirationTime < currentExpirationTime) ||
      shouldYieldToHost())
  );
}

unstable_shouldYield ()๋Š” currentDidTimeout์ด false ์ผ ๋•Œ true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  shouldYieldToHost ()๋Š” true๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ ๊ทธ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

shouldYieldToHost = function() {
  return frameDeadline <= getCurrentTime();
};

shouldYieldToHost () return true๋Š”์ด ์œ ํœด ๊ธฐ๊ฐ„์— ๋‚จ์€ ์‹œ๊ฐ„์ด ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
currentDidTimeout์ด false์ด๋ฉด ์ผ์ •์ด ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ์•„๋‹˜์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋“ค ์‚ฌ์ด์˜ ์–ด๋–ค ๊ด€๊ณ„, ์™œ unstable_shouldYield ()๊ฐ€ ๊ทธ๋“ค์—๊ฒŒ ์˜์กดํ•ฉ๋‹ˆ๊นŒ?

Question

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

์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ํฌํ•จํ•˜์—ฌ ๋“ค์–ด์˜ค๋Š” ์ด๋ฒคํŠธ๋ฅผ ๊ฒ€์ƒ‰ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฃผ๊ธฐ์ ์œผ๋กœ (16ms ์ •๋„) ํ˜ธ์ŠคํŠธ ํ™˜๊ฒฝ์— ์–‘๋ณดํ•ฉ๋‹ˆ๋‹ค. frameDeadline ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์‚ฐ์ถœ ํ•  ๊ณ„ํš ์ธ ํƒ€์ž„ ์Šคํƒฌํ”„ (์›๋ž˜ now() + 16ms ์™€ ๊ฐ™์€ ๊ฐ’์œผ๋กœ ์„ค์ • ๋จ)์ด๋ฏ€๋กœ shouldYieldToHost๋Š” ํ•ด๋‹น ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ requestIdleCallback๊ณผ requestAnimationFrame์˜ ์กฐํ•ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณง ๋‹ค์Œ ์ž‘์—…์„ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ƒ์ ์ธ ๊ฒฝ์šฐ์—๋Š” ์ด๋Ÿฌํ•œ ์ž‘์€ 16ms ์Šฌ๋ผ์ด์Šค์—์„œ ๋ชจ๋“  ๋ Œ๋”๋ง์„ ์™„๋ฃŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋™์‹œ์— ๋‹ค๋ฅธ ๋งŽ์€ ์ผ์ด ๋ฐœ์ƒํ•˜๋ฉด React ์ž‘์—…์ด "๊ตถ์–ด ์ฃฝ์–ด"์ž‘์€ ์กฐ๊ฐ์œผ๋กœ ์™„์ „ํžˆ ๋ Œ๋”๋งํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‘ ๋ฒˆ์งธ ํ™•์ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๊ธฐ์ค‘์ธ ๋ชจ๋“  ๋ Œ๋” ๋˜๋Š” ์ƒํƒœ ์—…๋ฐ์ดํŠธ์—๋Š” "๋งŒ๋ฃŒ ์‹œ๊ฐ„"(์ผ๋ฐ˜์ ์œผ๋กœ 100ms์—์„œ 5000ms ์‚ฌ์ด)์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ Œ๋”๋ง์ด ์™„๋ฃŒ๋˜์ง€ ์•Š๊ณ  ํ•ด๋‹น ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ํ•ด๋‹น ์—…๋ฐ์ดํŠธ๊ฐ€ ์™„๋ฃŒ ๋  ๋•Œ๊นŒ์ง€ ๋™๊ธฐ ๋ชจ๋“œ๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ด์ƒ์ ์ด์ง€๋Š” ์•Š์ง€๋งŒ ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋ชจ๋“  ์—…๋ฐ์ดํŠธ๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋„๋กํ•ฉ๋‹ˆ๋‹ค.

๋™์ผํ•œ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์— ๋Œ€ํ•ด ๋ธŒ๋ผ์šฐ์ €์— ํƒ€์ด๋จธ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค (์˜ˆ : setTimeout ์‚ฌ์šฉ). ํ•ด๋‹น ํƒ€์ด๋จธ๊ฐ€ ์‹คํ–‰๋˜๋ฉด ์ž‘์—…์„ ๋™์‹œ์— ์ˆ˜ํ–‰ํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ currentDidTimeout ๊ฐ€ true๋กœ ์„ค์ •๋˜๋ฏ€๋กœ ์–‘๋ณดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ–ฅํ›„์—๋Š” ์ƒˆ๋กœ์šด isInputPending ๋ธŒ๋ผ์šฐ์ € API (https://github.com/WICG/is-input-pending)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…์„ ๊ณ„์† ์ฒ˜๋ฆฌํ•˜๊ณ  ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž ์ž…๋ ฅ์ด์žˆ์„ ๋•Œ๋งŒ ์ˆ˜์ต์„ ์˜ฌ๋ฆด ๊ณ„ํš์ž…๋‹ˆ๋‹ค. , ํ•ญ์ƒ 16ms๋งˆ๋‹ค ์–‘๋ณดํ•˜๋Š” ๋Œ€์‹ .

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

์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ํฌํ•จํ•˜์—ฌ ๋“ค์–ด์˜ค๋Š” ์ด๋ฒคํŠธ๋ฅผ ๊ฒ€์ƒ‰ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฃผ๊ธฐ์ ์œผ๋กœ (16ms ์ •๋„) ํ˜ธ์ŠคํŠธ ํ™˜๊ฒฝ์— ์–‘๋ณดํ•ฉ๋‹ˆ๋‹ค. frameDeadline ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์‚ฐ์ถœ ํ•  ๊ณ„ํš ์ธ ํƒ€์ž„ ์Šคํƒฌํ”„ (์›๋ž˜ now() + 16ms ์™€ ๊ฐ™์€ ๊ฐ’์œผ๋กœ ์„ค์ • ๋จ)์ด๋ฏ€๋กœ shouldYieldToHost๋Š” ํ•ด๋‹น ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ requestIdleCallback๊ณผ requestAnimationFrame์˜ ์กฐํ•ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณง ๋‹ค์Œ ์ž‘์—…์„ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ƒ์ ์ธ ๊ฒฝ์šฐ์—๋Š” ์ด๋Ÿฌํ•œ ์ž‘์€ 16ms ์Šฌ๋ผ์ด์Šค์—์„œ ๋ชจ๋“  ๋ Œ๋”๋ง์„ ์™„๋ฃŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋™์‹œ์— ๋‹ค๋ฅธ ๋งŽ์€ ์ผ์ด ๋ฐœ์ƒํ•˜๋ฉด React ์ž‘์—…์ด "๊ตถ์–ด ์ฃฝ์–ด"์ž‘์€ ์กฐ๊ฐ์œผ๋กœ ์™„์ „ํžˆ ๋ Œ๋”๋งํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‘ ๋ฒˆ์งธ ํ™•์ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๊ธฐ์ค‘์ธ ๋ชจ๋“  ๋ Œ๋” ๋˜๋Š” ์ƒํƒœ ์—…๋ฐ์ดํŠธ์—๋Š” "๋งŒ๋ฃŒ ์‹œ๊ฐ„"(์ผ๋ฐ˜์ ์œผ๋กœ 100ms์—์„œ 5000ms ์‚ฌ์ด)์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ Œ๋”๋ง์ด ์™„๋ฃŒ๋˜์ง€ ์•Š๊ณ  ํ•ด๋‹น ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ํ•ด๋‹น ์—…๋ฐ์ดํŠธ๊ฐ€ ์™„๋ฃŒ ๋  ๋•Œ๊นŒ์ง€ ๋™๊ธฐ ๋ชจ๋“œ๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ด์ƒ์ ์ด์ง€๋Š” ์•Š์ง€๋งŒ ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋ชจ๋“  ์—…๋ฐ์ดํŠธ๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋„๋กํ•ฉ๋‹ˆ๋‹ค.

๋™์ผํ•œ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์— ๋Œ€ํ•ด ๋ธŒ๋ผ์šฐ์ €์— ํƒ€์ด๋จธ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค (์˜ˆ : setTimeout ์‚ฌ์šฉ). ํ•ด๋‹น ํƒ€์ด๋จธ๊ฐ€ ์‹คํ–‰๋˜๋ฉด ์ž‘์—…์„ ๋™์‹œ์— ์ˆ˜ํ–‰ํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ currentDidTimeout ๊ฐ€ true๋กœ ์„ค์ •๋˜๋ฏ€๋กœ ์–‘๋ณดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ–ฅํ›„์—๋Š” ์ƒˆ๋กœ์šด isInputPending ๋ธŒ๋ผ์šฐ์ € API (https://github.com/WICG/is-input-pending)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…์„ ๊ณ„์† ์ฒ˜๋ฆฌํ•˜๊ณ  ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž ์ž…๋ ฅ์ด์žˆ์„ ๋•Œ๋งŒ ์ˆ˜์ต์„ ์˜ฌ๋ฆด ๊ณ„ํš์ž…๋‹ˆ๋‹ค. , ํ•ญ์ƒ 16ms๋งˆ๋‹ค ์–‘๋ณดํ•˜๋Š” ๋Œ€์‹ .

๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค
์•„์ง ๋ช‡ ๊ฐ€์ง€ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. unstable_shouldYield() ๋Š” ์ผ์ •์—์„œ ์ž‘์—…์ด ์ค‘๋‹จ ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋งž์Šต๋‹ˆ๊นŒ?
  2. "16ms"๊ฐ€ activeFrameTime ํ•ฉ๋‹ˆ๊นŒ?
  3. firstCallbackNode.expirationTime < currentExpirationTime ๋Š” ์–ธ์ œ true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๊นŒ? ๋‹ค์Œ ์ž‘์—…์˜ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์ด์ „ ์ž‘์—…๋ณด๋‹ค ๋†’๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๊นŒ?
  1. ๊ฐ ๋ Œ๋”๋ง ์ž‘์—…์€ unstable_shouldYield ()๋ฅผ ์ž์ฃผ ํ™•์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. (์šฐ๋ฆฌ๋Š” ๋Œ€๋žต ํŠธ๋ฆฌ์˜ ๊ฐ ๊ตฌ์„ฑ ์š”์†Œ ๋‹ค์Œ์— ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.) ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ false (๊ณ„์† ์ง„ํ–‰๋จ์„ ์˜๋ฏธ)๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋ Œ๋”๋ง์„ ์ผ์‹œ ์ค‘์ง€ํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

  2. ์˜ˆ.

  3. ์ƒˆ๋กญ๊ณ  ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’์€ ์ž‘์—…์ด ๊ธฐ์กด ๋ Œ๋”๋ง ์ค‘์— ๋Œ€๊ธฐ์—ด์— ์ถ”๊ฐ€๋˜๋ฉด ์กฐ๊ฑด์ด ์ฐธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ํ•ด๋‹น ์ž‘์—…์œผ๋กœ ์ „ํ™˜ ํ•  ์ˆ˜ ์žˆ๋„๋ก true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.

์ •๋ง ๊ณ ๋งˆ์›Œ์š” ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

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