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 ()๊ฐ ๊ทธ๋ค์๊ฒ ์์กดํฉ๋๊น?
์ฌ์ฉ์ ์
๋ ฅ์ ํฌํจํ์ฌ ๋ค์ด์ค๋ ์ด๋ฒคํธ๋ฅผ ๊ฒ์ ํ ์ ์๋๋ก ์ฃผ๊ธฐ์ ์ผ๋ก (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๋ง๋ค ์๋ณดํ๋ ๋์ .
๋ต๋ณ ๊ฐ์ฌํฉ๋๋ค
์์ง ๋ช ๊ฐ์ง ์ง๋ฌธ์ด ์์ต๋๋ค.
unstable_shouldYield()
๋ ์ผ์ ์์ ์์
์ด ์ค๋จ ๋ ์ ์๋์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ง์ต๋๊น?activeFrameTime
ํฉ๋๊น?firstCallbackNode.expirationTime < currentExpirationTime
๋ ์ธ์ true๋ฅผ ๋ฐํํฉ๋๊น? ๋ค์ ์์
์ ์ฐ์ ์์๊ฐ ์ด์ ์์
๋ณด๋ค ๋๋ค๋ ์๋ฏธ์
๋๊น?๊ฐ ๋ ๋๋ง ์์ ์ unstable_shouldYield ()๋ฅผ ์์ฃผ ํ์ธํด์ผํฉ๋๋ค. (์ฐ๋ฆฌ๋ ๋๋ต ํธ๋ฆฌ์ ๊ฐ ๊ตฌ์ฑ ์์ ๋ค์์ ํธ์ถํฉ๋๋ค.) ๋๋ถ๋ถ์ ๊ฒฝ์ฐ false (๊ณ์ ์งํ๋จ์ ์๋ฏธ)๋ฅผ ๋ฐํํ์ง๋ง true๋ฅผ ๋ฐํํ๋ฉด ๋ ๋๋ง์ ์ผ์ ์ค์งํด์ผ ํจ์ ์๋ฏธํฉ๋๋ค.
์.
์๋กญ๊ณ ์ฐ์ ์์๊ฐ ๋์ ์์ ์ด ๊ธฐ์กด ๋ ๋๋ง ์ค์ ๋๊ธฐ์ด์ ์ถ๊ฐ๋๋ฉด ์กฐ๊ฑด์ด ์ฐธ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ํด๋น ์์ ์ผ๋ก ์ ํ ํ ์ ์๋๋ก true๋ฅผ ๋ฐํํ๋ ค๊ณ ํฉ๋๋ค.
์ ๋ง ๊ณ ๋ง์์ ์ ๋ง ๊ฐ์ฌํฉ๋๋ค!
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ฌ์ฉ์ ์ ๋ ฅ์ ํฌํจํ์ฌ ๋ค์ด์ค๋ ์ด๋ฒคํธ๋ฅผ ๊ฒ์ ํ ์ ์๋๋ก ์ฃผ๊ธฐ์ ์ผ๋ก (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๋ง๋ค ์๋ณดํ๋ ๋์ .