์ด๊ฒ์ ํ๋ฅญํ ๊ธฐ์ฌ ๊ธฐํ์
๋๋ค.
๊ณต๊ฐ API ์ธก๋ฉด์์ ๋ ๋ง์ ๋จ์ ํ
์คํธ๋ฅผ ๋ค์ ์์ฑํด์ผ ํฉ๋๋ค.
์ฆ, react
, react-dom
, react-dom/test-utils
, react-test-renderer
๋ฑ๊ณผ ๊ฐ์ npm ์ง์
์ ๋ง ๊ฐ์ ธ์ฌ ์ ์์ง๋ง SyntheticEvent
๊ฐ์ ๋ด๋ถ ๋ชจ๋์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ReactDOMComponentTree
. "๋์" ์๊ตฌ ์ฌํญ์ ์ด๋ฏธ ํ
์คํธ์์ TODO๋ก ํ์๋์ด ์์ผ๋ฏ๋ก ๋์น์ง ์์ต๋๋ค.
์ด๋ฅผ ๋๊ธฐ ์ํด:
// TODO: can we express this test with only public API?
๋ฅผ ์ฐพ์ผ์ญ์์ค.3๋จ๊ณ๋ ์ฝ๊ฐ์ ์๊ฐ์ด ํ์ํฉ๋๋ค. ์๊ฐ์ ์ป๊ธฐ ์ํด ๊ณต๊ฐ API๋ก ํ ์คํธ๋ฅผ ๋ค์ ์์ฑํ ์ด์ ์์ ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด:
์ผ๋ฐ์ ์ผ๋ก ํ ์คํธํ๋ ๋์์ด React ์ฑ์์ ์ค์ ๋ก ์ด๋ป๊ฒ ์ฌํ๋๋์ง ์๊ฐํ ๋ค์ ํ ์คํธํด์ผ ํฉ๋๋ค. ๋๋ฌธ ๊ฒฝ์ฐ์ง๋ง ์ผ๋ถ API๋ฅผ ๊ณต๊ฐ๋ก ๋ ธ์ถํ๋ ๊ฒ๊ณผ ๊ด๋ จ๋ ์ ์์ผ๋ฏ๋ก ๋ณ๋๋ก ๋ ผ์ํด์ผ ํ๋ฏ๋ก ์ฃผ์ ํ์ง ๋ง๊ณ ํ ๋ก ์ ์์ํ์ญ์์ค! ๊ณต๊ฐ API๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ํ ์คํธ๋ฅผ ๋ค์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ ์ ์๋ ๊ฒฝ์ฐ ์ฌ๊ธฐ์ ๋๊ธ์ ๋จ๊ฒจ์ฃผ์๋ฉด ๋ธ๋ ์ธ์คํ ๋ฐ์ ํ ์ ์์ต๋๋ค.
๋ค์์ ๋ณ๊ฒฝํด์ผ ํ๋ ํ ์คํธ์ ์ ์ฒด ๋ชฉ๋ก์ ๋๋ค. ๊ทธ ์ค ์ผ๋ถ๋ ๊ฐ๋จํ ํ ์ค์ง๋ฆฌ ๋ณ๊ฒฝ์ผ ์ ์๊ณ , ์ผ๋ถ๋ ์ฝ๊ฐ์ ์ฌ์์ฑ์ ํฌํจํ ์ ์์ผ๋ฉฐ, ์ผ๋ถ๋ ์ฒ์๋ถํฐ ๋ค์ ์์ฑํด์ผ ํ ์ ์์ต๋๋ค. ์ผ๋ถ๋ ๋ถ๊ฐ๋ฅํ ์๋ ์์ง๋ง ๊ทธ ๊ฒฐ๋ก ์ ์ด๋ฅด๋ ์ฐ๊ตฌ๋ ์ฌ์ ํ ๋งค์ฐ ๊ฐ์น๊ฐ ์์ผ๋ฉฐ ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ์๊ณ ์ถ์ต๋๋ค.
๊ทธ๊ฒ์ ์๋ํ๊ณ ์ ํฌ์๊ฒ ์๋ ค์ฃผ์ญ์์ค:
์ ๋ฐ์ดํธ: ๋ชจ๋ ํ ์คํธ๊ฐ ์ง๊ธ ์งํ๋ฉ๋๋ค. ๋๊ตฐ๊ฐ๊ฐ ์์ ์ ๋ง์น ์๊ฐ์ด ์๋ค๋ฉด ๋์ค์ ์ฌ์ ๊ฐ ์๊ธธ ์ ์์ต๋๋ค.
ReactBrowserEventEmitter-test.js
( @madeinfree ์ดฌ์, https://github.com/facebook/react/issues/11299#issuecomment-355188567 ์ฐธ์กฐ)getNodeForCharacterOffset-test.js
(@accordeiro ์ดฌ์)ReactErrorUtils-test.js
(@reznord ์ดฌ์)BeforeInputEventPlugin-test.js
+ FallbackCompositionState-test.js
(@GordyD ์ดฌ์)validateDOMNesting-test.js
(@anushreesubramani ์ดฌ์) https://github.com/facebook/react/pull/11742ReactIncrementalPerf-test.js
(@dphurley ์ดฌ์)SelectEventPlugin-test.js
(@skiritsis ์ดฌ์)ReactTreeTraversal-test.js
(@timjacobi ์ดฌ์)SyntheticKeyboardEvent-test.js
+ getEventCharCode-test.js
(@aarboleda1 ์ดฌ์)escapeTextContentForBrowser-test.js
(@jeremenichelli ์ดฌ์)inputValueTracking-test.js
quoteAttributeValueForBrowser-test.js
(@jeremenichelli ์ดฌ์)ReactDOMComponent-test.js
(@AudyOdi ์ดฌ์)ReactDOMComponentTree-test.js
(@GordyD ์ดฌ์)ReactDOMEventListener-test.js
(@enapupe ์ดฌ์)ReactDOMInput-test.js
(@SadPandaBear ์ดฌ์)ReactDOMServerIntegration-test.js
(@minerado ์ดฌ์)setInnerHTML-test.js
(@silvestrijonathan ์ดฌ์)getEventKey-test.js
(@mjw56 ์ดฌ์)SyntheticClipboardEvent-test.js
(@smaniotto ์ดฌ์)SyntheticEvent-test.js
(@timjacobi ์ดฌ์)SyntheticWheelEvent-test.js
(@douglasgimli ์ดฌ์)ChangeEventPlugin-test.js
(@Ethan-Arrowood ์ดฌ์)EnterLeaveEventPlugin-test.js
(@accordeiro ์ดฌ์)ReactCoroutine-test.js
(@jstejada ์ดฌ์)ReactFiberHostContext-test.js
(@adsonpleal ์ดฌ์)์ฒซ ๊ธฐ์ฌ์?
ํน์ ํ ์คํธ๋ฅผ ์์ ํ๋ ๋ฐฉ๋ฒ์ด ๋ช ํํ์ง ์์ต๋๊น?
์ผ๋ถ ํ ์คํธ๋ฅผ ํฌ๊ธฐํ ๊ฒฝ์ฐ ๋ค์ ์์ ์ ๊ฒฐ์ ํ ์ ์๋๋ก ์๊ฒฌ์ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ํ์ญ์์ค.
์ฃผ๋ง์ ์ด๊ฒ์ ์ดํด๋ณด๊ณ ๋จ๊ธฐ๊ฐ์ ํด๊ฒฐํ ์ ์๋์ง ํ์ธํ ์ ์์ต๋๋ค.
์ข์์, ๊ฐ์ฌํฉ๋๋ค! ํน์ ํ ์คํธ๋ฅผ ์ ํํ๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ์ฌ๋์ด ๋์ผํ ํ ์คํธ์์ ์์ ์ ์์ํ์ง ์๋๋ก ์ค๋ ๋์ ํ์ผ ์ด๋ฆ์ ์ฃผ์์ผ๋ก ๋ฌ์์ฃผ์ธ์.
๋๋ ํ์คํ ์ด๊ฒ์ ๊ธฐ์ฌํ๋ ๋ฐ ๋งค์ฐ ๊ด์ฌ์ด ์์ต๋๋ค. ์ด๋ฒ ์ฃผ๋ง์ ํตํด ๊ฒํ ํ๊ณ ๋ฆฌํฉํ ๋งํ ๊ธฐํ๋ฅผ ์ฐพ์ ๊ฒ์ ๋๋ค!
์ ๋ ๊ด์ฌ ๐
์ฒซ ๋ฒ์งธ ๊ฒ์๋ฌผ์ ํ ์คํธ ๋ชฉ๋ก์ ๊ฒ์ํ์ต๋๋ค. ์ด๋ค ๊ฒ์ ์ ํํ๊ณ ์ถ์์ง ์๋ ค์ฃผ์๋ฉด ๋ฐฐ์ ํด ๋๋ฆฌ๊ฒ ์ต๋๋ค.
ReactDOMInput-test
๊ด์ฐฎ์ต๋๋ค :)
@SadPandaBear ์์ ์ต๋๋ค!
ReactErrorUtils-test
์์ ์์
ํ ์ ์์ต๋๋ค. ๐
setInnerHTML-test.js
๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
getEventCharCode-test.js
ํ๊ฒ ์ต๋๋ค. ๐
getEventKey-test.js
์์ ์์
ํ ์ ์์ต๋๋ค.
escapeTextContentForBrowser-test.js
๋ฐ์ ์ ์์ต๋๋ค.
ChangeEventPlugin-test.js
ํ ๋ฒ ํด๋ณด๊ณ ์ถ์ด์ :)
SyntheticEvent-test.js
๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค.
EnterLeaveEventPlugin-test.js
์์ ์์
ํ๊ณ ์ถ์ต๋๋ค.
ReactDOMEventListener-test.js
์์ ์์
ํ๊ณ ์ถ์ต๋๋ค.
BeforeInputEventPlugin-test.js
๋ฐ๊ณ ์ถ์ต๋๋ค
SyntheticKeyboardEvent-test.js๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค ๐
inputValueTracking-test.js
๊ฐ์ ธ๊ฐ๊ฒ ์ต๋๋ค
SyntheticWheelEvent-test.js
์์ ์์
ํ๊ณ ์ถ์ต๋๋ค.
๋ฐ์ ์ ์์ต๋๊น: ReactBrowserEventEmitter-test.js
?
SelectEventPlugin-test.js
๋ฐ๊ณ ์์ต๋๋ค
ReactDOMComponentTree-test.js
์์ ์์
ํ๊ณ ์ถ์ต๋๋ค.
ReactTreeTraversal-test.js์์ ์์ ํ๊ณ ์ถ์ต๋๋ค.
์๋
! ๐ ReactCoroutine-test.js
์์ ์์
ํ๊ณ ์ถ์ต๋๋ค.
SyntheticClipboardEvent-test.js
๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค.
validateDOMNesting-test.js
์์ ์์
ํ๊ณ ์ถ์ต๋๋ค.
EventPluginRegistry-test.js
๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค.
ReactDOMComponent-test.js
์(๋ฅผ) ์๋ํ๊ณ ์ถ์ต๋๋ค.
์ฌ๋ณด์ธ์! quoteAttributeValueForBrowser-test.js
์(๋ฅผ) ์๋ํ๊ณ ์ถ์ต๋๋ค! :๊ทผ์ก:
์ฌ๋ณด์ธ์! ReactDOMServerIntegration-test.js
์(๋ฅผ) ์๋ํ๊ณ ์ถ์ต๋๋ค!
์ ๋ ReactIncrementalPerf-test.js
๋ฅผ ๋ฐ์ต๋๋ค.
getNodeForCharacterOffset-test.js๋ฅผ ์ํํ๊ฒ ์ต๋๋ค.
@burnsbeaver FallbackCompisitionState-test
๋๋ getNodeForCharacterOffset-test
์ค ์ด๋ ๊ฒ์
๋๊น? 1์ธ๋น ํ๋์ ํ
์คํธ๋ก ์์ํ๊ณ ์ถ์ต๋๋ค.
getNodeForCharacter ๋ถํ๋๋ฆฝ๋๋ค. ๋ค๋ฅธ ๋๊ธ์ ์ง์ ์ด์ ํผ๋์ ๋๋ ค ์ฃ์กํฉ๋๋ค!
์์ง FallbackCompositionState-test.js
๋ฐReactFiberHostContext-test.js
๊ฐ ๋ฌด๋ฃ์
๋๋ค!
FallbackCompisitionState๋ฅผ ์ฌ์ฉํ๊ฒ ์ต๋๋ค!
๋๋ ReactFiberHostContext-test.js๋ฅผ ์๋ํ ์ ์์ต๋๋ค
์ ๋ฐ์ดํธ: ๋ชจ๋ ํ ์คํธ๊ฐ ์ง๊ธ ์งํ๋ฉ๋๋ค. ์ด๋ฒ ํธ๋ฅผ ๊ตฌ๋ ํ์ธ์! ๋๊ตฐ๊ฐ๊ฐ ์์ ์ ๋ง์น ์๊ฐ์ด ์๋ค๋ฉด ๋์ค์ ์ฌ์ ๊ฐ ์๊ธธ ์ ์์ต๋๋ค. ์ผ๋ถ ํ ์คํธ๋ฅผ ๋ค์ ์๋ํ ์ ์๊ฒ ๋๋ฉด ์๊ฒฌ์ ๋งํ๊ฒ ์ต๋๋ค.
์ํ์ ์์ํ ๋ชจ๋ ์ฌ๋๋ค์๊ฒ โ ๊ฐ์ฌํฉ๋๋ค! ์๋ฃจ์ ์ด ํญ์ ๋ช ํํ ๊ฒ์ ์๋๋ฉฐ ์ด๋ค ๊ฒฝ์ฐ์๋ React ์์ค ์์ฒด๋ฅผ ์ฝ๊ฐ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ๋์์ ํฉ๋ฆฌ์ ์ผ๋ก ํ ์คํธํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ ์๋ ์๋ค๋ ์ ์ ๋ฐ๋ณตํ๊ณ ์ถ์ต๋๋ค. ๋งํ๋ค๊ณ ๋๋ผ์๋ฉด ์ฌ๊ธฐ์ ๋๊ธ์ ๋จ๊ฒจ์ฃผ์ธ์. ๊ณํ์ ์ฐพ๋๋ก ๋ ธ๋ ฅํ๊ฒ ์ต๋๋ค.
@adsonpleal ์ค๋ง์์ผ๋๋ ค ์ฃ์กํฉ๋๋ค. ๋ฐฉ๊ธ ํ์ธํ๋๋ฐ ๋ถํํ๋ ์ด๋ฏธ ReactFiberHostContext-test
์ ์์ ํ์ต๋๋ค. ์ฒ์์๋ ์ด๊ฒ์ ๊นจ๋ซ์ง ๋ชปํ์ง๋ง ๊ทธ TODO๋ ๊ตฌ์์
๋๋ค. ์ด๊ฒ์ ์ด๋ฏธ ์์ ๋ ์ ์ผํ ํ
์คํธ์
๋๋ค.
@gaearon ์, ReactDOMInput-test
๋ฆฌํฉํ ๋งํ๋๋ฐ ์๊ฐ์ด ์ข ๊ฑธ๋ฆฌ๊ฒ ์ง๋ง ์ด๋ฒ ์ฃผ๋ง์ ๋ค ๋๋ด๊ธธ ๋ฐ๋๋๋ค.
๋๋ ์์ ์์ฌ์ด ์์ต๋๋ค.
inputValueTracking
setUntrackedValue
ํจ์์ ๋ชจ๋ ๋์์ ReactTestUtils.Simulate.?
์ ๊ฐ์ ๊ฒ์ผ๋ก ๊ต์ฒดํด๋ ๋ ๊น์?
๊ทธ๋ฐ๋ฐ ์ฌ๊ธฐ ์์ ๋ด PR์ ํ์ธํ์ฌ inputValueTracking
๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํด ๋ฌด์์ ํ๋์ง ํ์ธํ ์ ์์ต๋๋ค. ์ด๋ฌํ ํ
์คํธ ์ค ์ผ๋ถ๋ inputValueTracking
์ ๋งค์ฐ ๊ตฌ์ฒด์ ์ธ ํญ๋ชฉ์ ์์กดํ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ReactTestUtils
๋์ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋์ง ๊ถ๊ธํฉ๋๋ค.
inputValueTracking
์ ๊ฒฝ์ฐ @jquense ๋ ๊ฐ์ฅ ์ ์ํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ฐ์ฅ ๋ง์ ์ปจํ
์คํธ๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์๋ํ๋ ํ ์ ๊ทผ ๋ฐฉ์์ด ์๋ํ๋์ง ์ฌ๋ถ๋ฅผ ๊ฒํ ํ๊ณ ํ์ธํ ์ ์์ต๋๋ค.
๋ค๋ฅธ ์ฌ๋์๊ฒ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด๋ฉด ์ด์ ๋ฒ์ ์ ์์ฌ(0.22)๊ฐ ์ค์น๋์ด ์๊ณ ๋ก์ปฌ์์ ํ ์คํธ๋ฅผ ์คํํ๋ ค๊ณ ํ์ผ๋ ๋ชจ๋ ๊ฒ์ด ์ค๋จ๋์์ต๋๋ค. ์์ฌ๋ฅผ ์ต์ (1.2.1)์ผ๋ก ์ ๊ทธ๋ ์ด๋ํ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ผ๋ฉฐ ํ ์คํธ๊ฐ ํ์ฌ ์ ์์ ์ผ๋ก ์คํ๋๊ณ ์์ต๋๋ค.
@sadpandabear ๋ด ํ ์คํธ ํ์ผ์ ๋์ผํ ๋ชจ๋์ด ์์ผ๋ฏ๋ก ๊ณง ๊ตฌํ์ ํ์ธํ๊ฒ ์ต๋๋ค.
@gaearon setInnerHTML
ํ
์คํธ์ ๊ฒฝ์ฐ ํ
์คํธ ์ค์ํธ๊ฐ ์๋ฏธ๋ฅผ ๊ฐ๊ธฐ ์ํด์๋ setInnerHTML
์ ์กด์ฌ์ ์์กดํ๋ ๊ฒ์ฒ๋ผ ๋๋๋๋ค.
๊ธฐ์กด ๊ธฐ๋ฅ์ ๋์ฒดํ๊ธฐ ์ํด ๋ช ๊ฐ์ง ํ
์คํธ๋ฅผ ์์ฑํ ์ ์์ง๋ง ํ
์คํธ ์ค์ํธ๋ setInnerHTML
์ ํน์ ํ ๊ฒ๊ณผ ๋น๊ตํ์ฌ ๋ด๋ถ html์ ์ค์ ํ๋ ๋ผ์ธ์ ๋ ๊ฐ๊น์ต๋๋ค. ํ
์คํธ ์ค์ํธ์ ์ด๋ฆ์ ์ง๋ ๋ฐ ์กฐ๊ธ ์ฝ๋งค์ด๋ ๊ฒ ๊ฐ์์.
ํธ์ง: ๋ด๊ฐ ์ค์ํ์ง ์๋ ํ ... SVG์๋ innerHTML
์์ฑ์ด ์์ต๋๋ค. ์ด ํ์ผ์ ๋ ๋ฒ์งธ ํ
์คํธ ์ฒญํฌ๊ฐ ํ์ํ์ง ํ์คํ์ง ์์ต๋๋ค.
@silvestrijonathan ๊ทธ ํ
์คํธ๊ฐ ์ค์ ๋ก ํ์ธํ๋ ค๋ ๊ฒ์ dangerouslySetInnerHTML
๊ฐ React์์ ์์๋๋ก ์๋ํ๋ค๋ ๊ฒ์
๋๋ค. ๋ฐ๋ผ์ ์ด๋ฌํ ํ
์คํธ๋ฅผ ์์ ํ์ฌ ReactDOM์ ์ฌ์ฉํ๊ณ dangerouslySetInnerHTML
๋ก ๋์ผํ ์ฝํ
์ธ ๋ฅผ ๋ ๋๋งํ๋ฉด ์ถฉ๋ถํฉ๋๋ค. ํ
์คํธ ์ด๋ฆ์ dangerouslySetInnerHTML-test
๋ก ๋ฐ๊พธ๋ ๊ฒ์ด ๋ ์ ์ ํ๋ค๊ณ ์๊ฐ๋๋ฉด ๊ด์ฐฎ์ต๋๋ค.
๋ด ํ
์คํธ ํ์ผ์ ๊ฐ์ง๊ณ ๋ช ์๊ฐ ๋๊ณ ๋ ํ ๋๋ (๋์ ๊ฐ์) ์ด๋ณด์๋ฅผ ์ํ ๊ฐ๋ ฅํ ์ ์์ด ์์ต๋๋ค: ๊นจ๋ํ ํ๊ฒฝ(ํ์ผ)์ผ๋ก ํ
์คํธ๋ฅผ ์์ํ์ญ์์ค.
๊ธฐ์กด ํ์ผ์ ํธ์งํ๋ค๊ฐ ์ผ๋ถ ๋ด๋ถ ๊ธฐ๋ฅ์ ์กฐ๋กฑํ์ฌ ๋ช ๊ฐ์ ReactTestUtils
๊ธฐ๋ฅ์ด ๊นจ์ก์ต๋๋ค!! ์ผ์ด ์๋ํ ๋๋ก ์๋ํ์ง ์๋ ์ด์ ๋ฅผ ๊นจ๋ซ๋ ๋ฐ ์๊ฐ์ด ์ข ๊ฑธ๋ ธ์ต๋๋ค.
@gaearon ์ด๋ฒคํธ ์๋ฎฌ๋ ์ด์
์ ํฌํจํ์ฌ ReactTestUtils
๋ ๋น๊ณต๊ฐ API๋ก ๊ฐ์ฃผ๋์ด์ผ ํ๋ค๋ ์ ์ ๋ช
ํํ ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ ๋ด๋ถ API์ ๊ฐ์ ์ ์ผ๋ก ๋๋ฌํ๋ฏ๋ก ๊ทธ๋ ์ง ์์ผ๋ฉด ์ด๋ป๊ฒ ์๋ํ๋์ง ์ ๋๋ก ํ
์คํธํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ํํฌ๋ฅผ ๋
ธ์ถํ์ง ์๊ณ ์ปดํ์ผ๋ ํจํค์ง๋ฅผ ํ
์คํธํ๋ ๋ฐ ๋ฐฉํด๊ฐ ๋๋ฉฐ ์๋ก์ด ๋นํฉ์ฑ ์ด๋ฒคํธ ์์คํ
์ ํ
์คํธํ ์ ์์ต๋๋ค.
@dphurley , ReactIncrementalPerf-test
์์
์ค์ด๋ผ๋ ๊ฒ์ ์์์ต๋๋ค. ๋๋ ๋ํ ReactCoroutine
๋ฅผ ์ฌ์ฉํ๋ ํ
์คํธ ์ค์ํธ์์ ์์
ํ๊ณ ์์๊ธฐ ๋๋ฌธ์ ์ด PR์ ๋ํด ์๋ ค๋๋ฆฌ๊ณ ์ถ์์ต๋๋ค: #11338.
์ด๋ฏธ PR์ ์ ์ถํ๋์ง ํ์คํ์ง ์์ง๋ง ์์ง ์ ์ถํ์ง ์์๋ค๋ฉด #11338(์น์ธ๋ ๊ฒฝ์ฐ)์ ๊ธฐ๋ฐ์ผ๋ก ์์ฑํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
@gaearon ์กฐ์ธ ๊ฐ์ฌํฉ๋๋ค. ํ
์คํธ๋ฅผ ์ํด React-DOM
with dangerouslySetInnerHTML
๋ฅผ ์ฌ์ฉํ ์๊ฐ์ ํ๊ธฐ ๋๋ฌธ์ ๊ทธ๋ ๊ฒ ํ๋๋ก ํ๊ฒ ์ต๋๋ค!
๊ทธ๋ฆฌ๊ณ ์, ๋๋ ์๋ง๋ ๊ทธ ๊ฒฝ์ฐ์ ํ ์คํธ ์ด๋ฆ์ ๋ฐ๊ฟ ๊ฒ์ ๋๋ค. ๋ค์ ๋ ์ ๋์ ๋ด PR์ ์ฐพ์ผ์ญ์์ค.
์ฒซ ๋ฒ์งธ ๋ณํฉ๋ PR์ด ์์ต๋๋ค!
๊ทธ๊ฒ์ ์ดํด๋ณด์ญ์์ค : https://github.com/facebook/react/pull/11309
์ด๋ฒคํธ์ ๊ด๋ จ๋ ์์ ์ ํ๊ณ ์๋ค๋ฉด https://github.com/facebook/react/pull/11309 ์ ํ ๋ก ๊ณผ ๋ค์ ๋ฆฌ๋ทฐ๋ฅผ ๋ชจ๋ ์ฝ์ด๋ณด์๊ธฐ ๋ฐ๋๋๋ค.
https://github.com/facebook/react/pull/11316
https://github.com/facebook/react/pull/11317
https://github.com/facebook/react/pull/11327
https://github.com/facebook/react/pull/11332
๋ช ๊ฐ์ง ๊ณตํต ์ฃผ์ ๊ฐ ์์ผ๋ฉฐ ์ด๋ฌํ ํ ๋ก ์ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ PR์ ์ฌ๋ฐ๋ฅธ ๋ฐฉํฅ์ผ๋ก ์ด๋๋ ๊ฒ์ด ์ค์ํ ์ ์์ต๋๋ค.
์ฐธ์กฐ์ ๋ํ ํ๋ฅญํ ๋ํ - ๊ฐ์ฌํฉ๋๋ค!
์ผ์ด ์ข ๋ฐ๋นด์ง๋ง ์ด๋ฒ ์ฃผ๋ง์ ํ ์คํธ๋ฅผ ์ํด PR์ ์ด ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
๋๋ ์์ง ๋ด๊ฐ ์ง์ด๋ ์ํ์ ์ดํด๋ณด์ง ์์๋ค. ๋ค๋ฅธ ์ผ๋ก ๋ฐ๋นด์ต๋๋ค. ๋ฉฐ์น ํ์ PR์ ์ฌ๋ฆฌ๋ ค๊ณ ํฉ๋๋ค. ์๊ฐ์ ๋ฒ ์ ์์ต๋๊น?
์ ๋ค๋ฆฝ๋๋ค.
๋๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์๋ค
๋ ํ๋์ PR์ด ํฉ์ณ์ก์ต๋๋ค! https://github.com/facebook/react/pull/11316
๋ ๊ฐ ๋ ์๋๋ก. https://github.com/facebook/react/pull/11317 https://github.com/facebook/react/pull/11385
๋ด๊ฐ ํ ์คํธ ์ค ํ๋์ ์ ๊ทผํ ๋ฐฉ๋ฒ์ ๋ํ ์์ ๋ถ์์ ์์ฑํ์ต๋๋ค. https://github.com/facebook/react/pull/11385#issuecomment -341934588
๋ด๊ฐ ๋งํ ์์๋ ํ ๊ทธ๋ค์ ๋ชจ๋ ๊ฐ์ ธ ๊ฐ๊ณ ์ฌ์ ๊ฐ ์์ผ๋ฉด ์ฌ๊ธฐ์ ๊ฒ์ํ์ญ์์ค. ๊ทธ๋ฌ๋ฉด ๋ด๊ฐ ๋ณผ ๊ฒ์ ๋๋ค.
ํนํ SyntheticEvent
๋ฅผ ๋ค๋ฃจ๋ 2๊ฐ์ PR์ ๋ ๋ณํฉํ์ต๋๋ค. ๊ด๋ จ ํ
์คํธ๋ฅผ ์ํํ ๊ฒฝ์ฐ https://github.com/facebook/react/pull/11365 ๋ฐ https://github.com/facebook/react/issues/ ์์ ํ์ธํ๊ณ ์คํ์ผ๊ณผ ์ ๊ทผ ๋ฐฉ์์ ์ผ์น์ํค์ญ์์ค.
@gaearon EventPluginRegistry-test.js
์ ๊ฒฝ์ฐ ๊ณต๊ฐ API๋ฅผ ์ฌ์ฉํ์ฌ ํ
์คํธ๋ฅผ ๋ค์ ์์ฑํด์ผ ํ๋ ๊ฒฝ์ฐ ReactDom.js -> ReactDOMClientInjection.js์ ๊ธฐ๋ณธ ํ๋ฌ๊ทธ์ธ์ ์ฃผ์
ํ๊ณ ์์์ ์ ์ ์์ต๋๋ค.
{
๋จ์ ์ด๋ฒคํธ ํ๋ฌ๊ทธ์ธ,
EnterLeaveEventPlugin,
๋ณ๊ฒฝ ์ด๋ฒคํธ ํ๋ฌ๊ทธ์ธ,
์
๋ ํธ ์ด๋ฒคํธ ํ๋ฌ๊ทธ์ธ,
BeforeInputEventPlugin,
}
ํ
์คํธ ๋ชจ์ ํ๋ฌ๊ทธ์ธ์ ์ ํํ ์ด๋ป๊ฒ ์ฃผ์
ํ๊ณ EventPluginRegistry
๊ธฐ๋ฅ์ ํ
์คํธํ ์ ์์ต๋๊น?
์ฌ์ฉ์ ์ ์ ํ๋ฌ๊ทธ์ธ์ ๊ฒ์ํ๊ณ ์ฌ์ฉ์ ์ ์ ํ๋ฌ๊ทธ์ธ์ด ์ ํํ ์ฃผ์
๋๋ ๋ฐฉ๋ฒ์ ํ์ธํ๊ธฐ ์ํด react-tap-event-plugin ์ ์ฐพ์์ต๋๋ค.
์ด๊ฒ์ด ํ๋ฌ๊ทธ์ธ์ ์ฃผ์
ํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์
๋๊น?
require('react-dom').__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.EventPluginHub.injection.injectEventPluginsByName({
'TapEventPlugin': require('./TapEventPlugin.js')(shouldRejectClick)
});
ReactTreeTraversal-test.js
์์ ๋๋ฌด ๊ณผํ ๊ฒ ๊ฐ์
๋ค๋ฅธ ์ฌ๋์ด ๊ทธ๊ฒ์ ์๋ํ๊ณ ์ถ๋ค๋ฉด ์์ ๋กญ๊ฒ ๊ทธ๋ ๊ฒํ์ญ์์ค.
@aqumus
EventPluginRegistry
๋ ๊น๋ค๋กญ์ต๋๋ค. ์ฒซ ๋ฒ์งธ ๋จ๊ณ๋ ์ค์ ๋ก ์ฌ์ฉ๋๋ ์์น๋ฅผ ํ์
ํ๋ ๊ฒ์
๋๋ค. ํญ ์ด๋ฒคํธ ํ๋ฌ๊ทธ์ธ์ด ์ฐ๋ฆฌ ๊ฐ ์ฌ์ ํ ์ง์ํ๊ธฐ๋ก ์ฝ์ํ ์ ์ผํ ํ๋ฌ๊ทธ์ธ์ด๋ผ๋ ๋ง์ด ๋ง์ต๋๋ค. ํธ๋ฆฌํ๊ฒ ๋ฆฌํฌ์งํ ๋ฆฌ์ ๋ฐ๋ก ๋ณด๊ด๋์ด ์์ต๋๋ค. ๊ทธ๋์ ํน๋ณํ ์๋ํ๋ ํ
์คํธ๋ฅผ ์ถ๊ฐํ ์ ์์๊น์?
๋ํ RN์ด EventPluginRegistry
๋ฅผ ์ฌ์ฉํ ๊ฐ๋ฅ์ฑ๋ ์์ต๋๋ค. RN ์ด๋ฒคํธ๊ฐ ์๋ํ๋์ง ํ์ธํ๋ ํ
์คํธ๊ฐ ์์ต๋๊น? ๋ชจ๋ฅด๊ฒ ์ด์. EventPluginRegistry
์ ๋ค๋ฅธ ๋ถ๋ถ์ ์ฃผ์์ ๋ฌ๊ณ ํ
์คํธ๊ฐ ์คํจํ๋์ง ํ์ธํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋์ผํ ์ฝ๋๊ฐ ํด๋น ์ฝ๋ ๊ฒฝ๋ก์ ์คํธ๋ ์ค๋ฅผ ์ฃผ๋ ๋ค๋ฅธ ํ
์คํธ์ ์ด๋ฏธ ํฌํจ๋์ด ์๋ ๊ฒฝ์ฐ ๋น๊ณต๊ฐ API ํ
์คํธ๋ฅผ ์ ๊ฑฐํ ์ ์์ต๋๋ค. ์ด๊ฒ ๋ง์ด ๋์?
@gdevincenzi ์ข์ ๊ฒ ๊ฐ์ต๋๋ค. ํ ๋น์ ์ ๊ฑฐํ๊ฒ ์ต๋๋ค.
๋ํ, ์ ๋ ์ด๋ฒ ์ฃผ์ ์๋ฆฌ๋ฅผ ๋น์ธ ์์ ์ด์ง๋ง, ์ด๋ก ์ธํด ๊ณ์ ์งํ๋๋ ๋ฐ ๋ฐฉํด๊ฐ ๋์ง ์๋๋ก ํ์ญ์์ค. ๋ค์ ์ฃผ์ ์ ์ถ๋ PR์ด ๋ช ๊ฐ ๋ ๋ณํฉ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋๋ ReactTreeTraversal-test.js
๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค - ๊ทธ๊ฒ์ ์ต์ํ์ง ์์ API์ง๋ง ๊ทธ๊ฒ์ ๋ฐฐ์ฐ๊ธฐ์ ์ข์ opp์ธ ๊ฒ ๊ฐ์ต๋๋ค. ์กฐ์ธ ํ์ ํฉ๋๋ค @gdevincenzi
๋ค์ ๋ณต์กํ ์์ ์ ๋ง์น @gordyd ์๊ฒ ์ถํ์ ๋ง์ ์ ํฉ๋๋ค: https://github.com/facebook/react/pull/11383.
์ด๊ฒ์ ๋ณธ์ง์ ์ผ๋ก ๋์ผํ ๊ฒ์ ํ ์คํธํ๋ ๋์ ์ฝ๋๊ฐ ์ ํ์ ์ผ๋ง๋ ๋ค๋ฅธ์ง ๋ณด์ฌ์ฃผ๋ ์ข์ ์์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐธ์กฐ๋ฅผ ๊ฒ์ํ๊ณ , git ๊ธฐ๋ก์ ๋ณด๊ณ , ๋ค๋ฅธ ํ์ ์ฃผ์ ์ฒ๋ฆฌํ์ฌ ์ฝ๋๊ฐ ๋ฌด์ ์ ํด์ผ ํ๋์ง ์์๋ผ ์ ์๋ ๋ฐฉ๋ฒ.
๋ค์ ์ฌ์ฉ์๋ก๋ถํฐ ์์ง PR์ ๋ฐ์ง ๋ชปํ์ต๋๋ค.
@email2vimalraj
@andrevargas
@tranotheron
@๋ฏธ๋ค๋ผ๋
@sw-yx
@king0120
@aarboleda1
@danilowoz
@dms1lva
@๋ชจ๋ผ์๋น
@dphurley
@reznord
@aqumus
์ด ์์ ์ ์์ํ๋์ง ํ์ธํด ์ฃผ์๊ฒ ์ต๋๊น? ๋๊ธฐ์ด์ ๋์์ ์ฃผ๊ณ ์ถ์ ์ฌ๋๋ค์ด ๋ ๋ง๊ธฐ ๋๋ฌธ์ ์๊ฐ์ด ์๋ค๋ฉด ๋ค๋ฅธ ์ฌ๋๋ค์๊ฒ ์ด ์์ ์ ํ ์ ์๋ ๊ธฐํ๋ฅผ ์ฃผ๋ ๊ฒ์ด ์ข์ต๋๋ค.
@andrevargas ๋ฐฉ๊ธ https://github.com/facebook/react/pull/11331์์ ๊ทํ์ ํ ๋ก ์ ๋ฐ๊ฒฌํ์ต๋๋ค. ์ด๋ฌํ ๋ณ๊ฒฝ ์ฌํญ์ ํตํฉ๋ ์ํ๋ก ์ ์งํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ ๋ฅผ ๋๊ธฐ์ด์ ์ถ๊ฐํด์ฃผ์ธ์ @gaearon
@gaearon ๋ค ๋ง์ต๋๋ค. ํ์ธ์ ์ํด @jeremenichelli ๋ #11331์์ quoteAttributeValueForBrowser-test.js
์์
์ ํ๊ณ ์์ผ๋ฉฐ ์ด ์ฌ์ค์ ์๊ณ ์์ต๋๋ค. ๋๋ ๋น์ ์ด ๊ทธ์ ์ฌ์ฉ์ ์ด๋ฆ๊ณผ PR์ ๋งํฌ๋ก ์ด ์ค๋ ๋๋ฅผ ์
๋ฐ์ดํธํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ ๋ฅผ ๋๊ธฐ์ด @gaearon ์๋ ์ถ๊ฐํด์ฃผ์ธ์.
@gaearon ์์ ์ ์์ํ์ต๋๋ค. ์ด๋ฒ ์ฃผ์ ๋ด ์ฐ๊ตฌ ๊ฒฐ๊ณผ๋ PR์ ๊ฒ์ํ ๊ณํ์ ๋๋ค.
@gaearon SyntheticKeyboardEvent.js ์์ ์ ์์ํ์ต๋๋ค. ์ด๋ฒ ์ฃผ๋ง์ PR์ ํ ๊ณํ์ ๋๋ค.
@gaearon ์๋ ๋ฐฐ์ ๋ ์ฌ๋๋ค์ด ์์ ํ ์๊ฐ์ด ์์ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ์ฌ ์ด๋ค ํ ์คํธ๋ ์ํํ ์ ์์ต๋๋ค.
@gaearon ๋ฆ์ด์ ์ฃ์กํฉ๋๋ค ์ง๊ธ WIP PR์ ํ๊ณ ์์ต๋๋ค. ์
๋ฐ์ดํธ: ๋น๊ณต๊ฐ API์ ์์กดํ์ง ์์ผ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ๋์ง ๊ฐ๋จํ ์ค๋ช
ํด์ค ์ ์์ต๋๊น? ๋ํ top<EventName>
์ ๋ํด ์ ๋ชจ๋ฆ
๋๋ค. ๊ฐ์ฌ ํด์.
https://github.com/facebook/react/blob/92b7b172cce9958b846844f0b46fd7bbd8c5140d/packages/react-dom/src/events/__tests__/SelectEventPlugin-test.js > extract
ํจ์
@gaearon ๋ฆ์ด์ ์ฃ์กํฉ๋๋ค ๐. ๋๋ ์ค๋ ์ด๊ฒ์ ๋ํด ์์ ํ ๊ฒ์ด๊ณ ๊ทธ๊ฒ์ ๋ํด ์ฝ๊ฐ์ ์์ฌ์ด ์์ผ๋ฉด ๋น์ ์๊ฒ ํ์ ๋ณด๋ผ ๊ฒ์ ๋๋ค.
@morajabi ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ํ ๊ฐ์ง ์ ์ฌ์ ์ธ ๋ฐฉ๋ฒ
SelectEventPlugin
๋ฅผ ๋ณด๊ณ ์ฌ์ฉ์์๊ฒ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ์ดํดํฉ๋๋ค.SelectEventPlugin
๋ก๋๋ฅผ ๋นํ์ฑํํ๊ณ (์ฃผ์ ์ฒ๋ฆฌ) ๋ฌด์์ด ์ค๋จ๋๋์ง ํ์ธ(๋ฌด์์ด ์ค๋จ๋๋์ง ํ์ธ)SelectEventPlugin
๋ก๋๋ฅผ ๋ค์ ํ์ฑํํ๊ณ ํ
์คํธ๊ฐ ํต๊ณผํ๋์ง ํ์ธํ์ญ์์ค.@gaearon ์ง์ฐ ์ฌ๊ณผ
๊ทํ์ ์ ์์ ๋ฐ๋ผ EventPluginRegistry.js
์ ๋ช ๊ฐ์ง ๋ถ๋ถ์ ๋ํด ์ฃผ์์ ๋ฌ์๊ณ ๋ง์ ํ
์คํธ ์ฌ๋ก๊ฐ ์คํจํ์์ ๋ฐ๊ฒฌํ์ต๋๋ค( SyntheticWheelEvent
, ReactDOMComponentTree
, SyntheticClipboardEvent
, SyntheticWheelEvent
, inputValueTracking
, SimpleEventPlugin
, ChangeEventPlugin
, ReactDOMComponentTree
๋ฑ),
ReactBrowserEventEmitter.js
๊ฐ EventPluginRegistry.js
registrationNameDependencies
๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
์ฃผ์์ ๋ฌ ๋์๋
ํ
์คํธ ์ผ์ด์ค ์ค ์คํจํ์ง ์์( EventPluginRegistry
ํ
์คํธ๋ง ์คํจ)
์ด๋ฅผ ๋ฐํ์ผ๋ก EventPluginRegistry
๋ ์ด๋ฏธ ๋ค๋ฅธ ํ
์คํธ ์ค์ํธ์์ ๋ค๋ฃจ๊ณ ์์ต๋๋ค.
ํธ๋ฆฌํ๊ฒ ๋ฆฌํฌ์งํ ๋ฆฌ์ ๋ฐ๋ก ๋ณด๊ด๋์ด ์์ต๋๋ค.
๋๋ ๋น์ ์ด ์ด๊ฒ์ ์๋ฏธํ๋ ๊ฒ์ ์ดํดํ์ง ๋ชปํ์ต๋๋ค
๊ณต๊ฐ API๋ฅผ ์ฌ์ฉํ์ฌ EventPluginRegistry
๋ฅผ ๋ค์ ์์ฑํ๊ธฐ ์ํด ์์
ํ ์ ์๋ ๋ค๋ฅธ ์ ์ ์ฌํญ์ด ์์ต๋๊น?
๋ค๋ฅธ ์ฌ๋๋ค์๊ฒ๋(์ด๊ฒ์ด ์ด์ ์ ๋ฐฉ์ก๋์๋์ง ํ์คํ์ง ์์) @kentcdodds ๋น๋์ค ํ์บ์คํธ - Ben Alpert์ ๋ฐ์ ์ด๋ฒคํธ ์ฝ๋ ์ฐ์ต์ด ๋งค์ฐ ์ ์ฉํ๋ค๋ ๊ฒ์ ์์์ต๋๋ค.
@gaearon ์ฃ์กํฉ๋๋ค ํ๋ ค๊ณ ํ๋๋ฐ ์ด์ ๋๋ผ ์๊ฐ์ด ์๋ค์
๋ฐ๋ผ์ ๋ค๋ฅธ ์ฌ๋์ด ๋ด ๋ฌธ์ ๋ฅผ ์ป๊ณ ์ถ๋ค๋ฉด ์์ ๋กญ๊ฒ ๋๋ผ์ญ์์ค. :)
@danilowoz @gaearon ๊ด์ฐฎ๋ค ๋ฉด BeforeInputEventPlugin-test.js๋ฅผ ๊ฐ์ ธ๊ฐ ์ ์์ต๋๋ค.
@timjacobi ReactDOMComponentTree.getInstanceFromNode
์ ๋์ฒดํ์ ๋ฌด์์
๋๊น?
๋ํ ์ด๋์์ ๋นํ์ฑํํด์ผํฉ๋๊น?
SelectEventPlugin ๋ก๋๋ฅผ ๋นํ์ฑํํ๊ณ (์ฃผ์ ์ฒ๋ฆฌ) ์ค๋จ๋ ํญ๋ชฉ์ ํ์ธํฉ๋๋ค(๋ฌธ์ ๊ฐ ์๋์ง ํ์ธ).
@morajabi ์ ์ ํ ์์ค์์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ง๊ธ๊น์ง ๊ฐ์ง๊ณ ์๋ ๊ฒ์ผ๋ก WIP PR์ ์ด ์ ์์ต๋๊น? ์ด ์ค๋ ๋๋ฅผ ๋๋ฌด ๋๋ฝํ๊ณ ์ถ์ง ์์ต๋๋ค.
@timjacobi ๋๋ ์๋ก์ด ๊ฒ์ ์ปค๋ฐํ์ง ์์ผ๋ฉด ํ ์ ์์ต๋๋ค. ์์ฆ ์ข ๋ฐ๋น ์ SelectEventPlugin-test
๋ฐ์์ค ์ ์๋ ์ฌ๋์ด ์์ด์ ์ฃ์กํฉ๋๋ค.
๋ค๋ฅธ ๋ณ๊ฒฝ ์ฌํญ๊ณผ ํจ๊ป ๋ค๋ฃจ์๊ธฐ ๋๋ฌธ์ ๋ ์ด์ ReactDOMServerIntegration-test
(cc @minerado)๊ฐ ํ์ํ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค.
@aqumus ๊ทํ์ ๋ถ์์ ๋ฐ๋ผ ์ด ๋ชฉ๋ก์์ EventPluginRegistry-test.js
์ ์ ๊ฑฐํ๊ฒ ์ต๋๋ค. ๋๋ ์ด๊ฒ์ ํน์ ๋ด๋ถ์ ๋จ์ ํ
์คํธ๋ก ์ ์งํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง ์ค์ ๋
ผ๋ฆฌ๊ฐ ๋ค๋ฅธ ํ
์คํธ์ ํฌํจ๋๋ค๋ ๊ฒ์ ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
@king0120 @aarboleda1 ์ด https://github.com/facebook/react/pull/11631 ์์ ๋งค์ฐ ๊ด๋ จ๋ ํ
์คํธ๋ฅผ ํ๊ณ ์๊ธฐ ๋๋ฌธ์ getEventCharCode-test
๋ฅผ ๋ค์ ํ ๋นํ๊ฒ ์ต๋๋ค. ํจ๊ป ํ๋ ๊ฒ์ด ๋ ์ฌ์ธ ์ ์์ต๋๋ค.
@morajabi @gaearon SelectEventPlugin-test.js๋ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
@email2vimalraj ์ฐธ๊ณ ๋ก inputValueTracking-test
๋ฅผ ๋ค์ ์์ฑํ์ต๋๋ค.
์ด ํ ์คํธ์๋ ํ์ฌ ์์ ์๊ฐ ์์ต๋๋ค.
getNodeForCharacterOffset-test.js
(3/5)ReactBrowserEventEmitter-test.js
(5/5)BeforeInputEventPlugin-test.js
+ FallbackCompositionState-test.js
(5/5, ๊ฒฐํฉ๋์ด์ผ ํจ) @GordyD๊ฐ ๊ฐ์ ธ์ดSelectEventPlugin-test
(2/5) @skiritsis ์ดฌ์ReactTreeTraversal-test.js
(4/5) @timjacobi ์ดฌ์๋๋ ๊ทธ๋ค์ ์ด๋ ค์์ ๋ํ ๋์ ์ธ์์ ๋ฐ๋ผ ๊ทธ๊ฒ๋ค์ ๋ถ๋ฅํ๋ค.
@timjacobi @kwnccc @skiritsis ๊ฐ ์๋ ๋๊ธฐ์ด์ด ์์ผ๋ฏ๋ก ์ด ํ ์คํธ ์ค ํ๋๋ฅผ ์ํํ๊ณ ์ถ์์ง ์ธ ๋ถ ์ค 3๋ช ์๊ฒ ์๋ ค์ฃผ์ญ์์ค. ๋น์ ์ ๋ํ ํต๊ณผํ ์ ์๊ณ ์ฐ๋ฆฌ๋ ๋ค๋ฅธ ์ฌ๋์ด ์๋ํ๋๋ก ํ ๊ฒ์ ๋๋ค.
์ด๊ฒ๋ค์ ๊ฝค ๋ณต์กํด์ง๊ธฐ ๋๋ฌธ์ ์ด๋ณด์์๊ฒ ์น์ํ์ง ์์ต๋๋ค. ๊ทธ๊ฒ๋ค์ ๊ธฐ๊ณ์ ๋์ฒดํ์ด ์๋๋๋ค. ํ ์คํธ๊ฐ ๋ฌด์ ์ ํ์ธํ๋ ค๊ณ ํ๋์ง ์ดํดํ๊ณ ๊ทธ์ ์์ํ๋ ๊ณต๊ฐ API ํ ์คํธ(๋งค์ฐ ๋ค๋ฅด๊ฒ ๋ณด์ผ ์ ์์)๋ฅผ ์ ์ํด์ผ ํฉ๋๋ค.
์ด๋ฅผ ๊ฐ์ ธ์ค๋ ค๋ฉด https://github.com/facebook/react/pull/11383 ์์ @GordyD ๊ฐ ํ๋ ๊ฒ์ฒ๋ผ ์ค์ค๋ก ํธ์ํ๊ฒ ์กฐ์ฌํด์ผ ํฉ๋๋ค. ์ฌ์ค @GordyD ๊ฐ ์ด ์ค ํ๋๋ฅผ ๊ฐ์ง๊ณ ์ถ์ดํ๋ค๋ฉด ๊ธฐ๊บผ์ด ๊ทธ์๊ฒ ์ค ๊ฒ์ ๋๋ค!
@skiritsis ๊ด์ฌ์ ๊ฐ์ ธ์ฃผ์
์ SelectEventPlugin-test
์ ๋ค์ ํ ๋นํ๊ฒ ์ต๋๋ค.
๋๋ ReactBrowerEventEmitter-test.js์์ ์ผํ๊ณ ์ถ์ต๋๋ค ๐ช
@gaearon : ๊ฐ์ฌํฉ๋๋ค, ์ ๋ ์๋ตํ์ง ๋ชปํด ์ฃ์กํฉ๋๋ค. ๋ค๋ฅธ ์ผ๋ก ๋ฐ๋นด๋ค. ์ดํด๋ฅผ ๋๊ธฐ ์ํด ์ด๋ป๊ฒ ๋ค์ ์์ฑํ๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
ReactTreeTraversal-test.internal.js
๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
@madeinfree @kwnccc ๊ฐ ์ด๋ฏธ ๋๊ธฐ์ด์ ์์ผ๋ฏ๋ก ๋จผ์ ์๋ตํ ์ ์๋๋ก ๋ฉฐ์น ์ ๋๋ฆฌ๊ฒ ์ต๋๋ค. ๊ทธ๊ฐ ๊ด์ฌ์ด ์๋ค๋ฉด ๋์ค์ ๋น์ ์๊ฒ ํ ๋นํ๊ฒ ์ต๋๋ค.
@gaearon OK! ์๊ฒ ์ต๋๋ค~ ๊ฐ์ฌํฉ๋๋ค
@gaearon ๋ค๋ฅธ ํ
์ด์ปค ๊ฐ ์์ผ๋ฉด BeforeInputEventPlugin
+ FallbackCompositionState
์กฐํฉ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ข์ ์๋ฆฌ, ๊ฐ์ฌํฉ๋๋ค @GordyD!
๊ทธ๊ฑด ๊ทธ๋ ๊ณ , ์ด ์ฝ๋๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์ด๋ป๊ฒ ๋๋์ง์ ๋ํ ์์ด๋์ด๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ๋ณํ๋ ๋ช ๊ฐ์ง ์ด๋ฒคํธ ํ ์คํธ๊ฐ ๋ ์์ต๋๋ค. https://github.com/facebook/react/pull/11631 https://github. com/facebook/react/pull/11525
@gaearon ๋ค๋ฅธ ์ฌ๋์ด ์ํ์ง ์์ผ๋ฉด ReactBrowserEventEmitter-test.js
๋ ๊ฐ์ ธ๊ฐ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค.
@madeinfree
์ฌ์ ํ ReactBrowerEventEmitter
์ ๊ด์ฌ์ด ์์ต๋๊น? ๊ทธ๋ ๋ค๋ฉด, ๊ทธ๊ฒ์ ๊ฐ์ง๊ณ ์ฐ๋ฆฌ์๊ฒ ์ต์ ์ ๋ณด๋ฅผ ์ ๊ณตํ์ญ์์ค!
@gaearon OK! ๋๋ ๊ทธ๊ฒ์ ๊ฐ์ง๊ณ ์ถ์ต๋๋ค.
๋ง์์.
๋๋จธ์ง getNodeForCharacterOffset-test
๊ฐ์ ธ๊ฐ์๊ฒ ์ต๋๊น?
์ด ๋ฌธ์ ๋ฅผ ๋์๋๋ฆด ์ ์์ต๋๋ค( getNodeForCharacterOffset-test
) :)
@gaearon ์๊ฐํ๋ ๊ฒ์ฒ๋ผ ReactIncrementalPerf-test.js
์ ๋ฐ์ด๋ค ์๊ฐ์ด ์์์ต๋๋ค. ๋๋ฌด ์ค๋ ๋ถ์ก์์ ๋ฏธ์ํ์ง๋ง ์ํ๋ ์ฌ๋์ด ์๋ค๋ฉด ์ก์ ์ ์์ต๋๋ค!
@accordeiro ์์ ์ต๋๋ค!
@gaearon ์ ๋ง ์ฃ์กํฉ๋๋ค, ์๋ฆผ์๋ฐ์ง ๋ชปํ์ต๋๋ค. ์์ง ์ฒ๋ฆฌํด์ผ ํ ๋ช ๊ฐ์ง ํ ์คํธ๊ฐ ์์ผ๋ฉด ์๋ ค์ฃผ์ญ์์ค. ์์ํ๊ธฐ ์ฌ์ด ๊ฒ์ด ๋จ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
@kwnccc ReactIncrementalPerf-test.js
๋ฅผ ์ดํด๋ณด๊ณ ์ถ์ต๋๊น?
ReactIncrementalPerf-test.js
์(๋ฅผ) ์กฐ์ฌํ ์ ์์ต๋๊น? ๋๋ ํ์ํ ๊ฒฝ์ฐ ํ
์คํธ๋ฅผ ์์ฑํ๋ ๋ฐ @kwnccc ๋ฅผ ๋์ธ ์ ์์ต๋๋ค.
ReactIncrementalPerf.js
๋ผ๋ ํ์ผ์ด ํ์๋์ง ์์ผ๋ฏ๋ก ReactPortal.js
์ ๋ํ ํ
์คํธ๋ฅผ ์์ฑํด์ผ ํฉ๋๊น?
ReactIncrementalPerf-test.js
์ ๋ฌธ์ ๋ฅผ ์กฐ๊ธ์ด๋ผ๋ ์ดํดํ๋ค๋ฉด(์๋ชป๋ ๊ฒฝ์ฐ ์์ ) ReactPortal.createPortal(...)์์ ReactDOM์ด ์๋ react-dom๊ณผ ๊ฐ์ ๊ณต๊ฐ API๋ก ์ ํํด์ผ ํจ์ ์๋ฏธํฉ๋๋ค. .createPortal(...) ? @gaearon
@gaearon ์ ๋ง ReactIncrementalPerf-test.js
ํด๋ณด๊ณ ์ถ์ด์. @abiduzz420 ์ด ํ์ธ์ ์์ํ๊ธฐ ๋๋ฌธ์ ํ์ํ ๊ฒฝ์ฐ ํ์ ๊ตฌ์ฑํ ์๋ ์์ต๋๋ค.
๋ค ๋ฌผ๋ก @kwnccc ํจ๊ป ์ผํ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค. ๋น์ ์ ๋๋ณด๋ค ๋จผ์ ๋๊ธฐ์ด์ ์์๊ณ , ๊ทธ๋์ ๋ชจ๋ ๋น์ ์ ๊ฒ์ ๋๋ค!
@kwnccc yarn test
์์ ํ๋์ ํ
์คํธ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ณ $ yarn flow
์คํํ ๋ Flow ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ๋๋ ๋น์ ์ด ์์
ํ ์ ์๋๋ก https://github.com/abiduzz420/react ๋ด fork repo์ ์ฝ๋๋ฅผ ํธ์ํ ๊ฒ์
๋๋ค.
FAIL packages\react-reconciler\src\__tests__\ReactIncrementalPerf-test.internal.js (11.191s)
โ ReactDebugFiberPerf โบ supports portals
Invariant Violation: Target container is not a DOM element.
at invariant (node_modules/fbjs/lib/invariant.js:42:15)
at Object.createPortal (packages/react-dom/src/client/ReactDOM.js:1112:70)
at Object.<anonymous> (packages/react-reconciler/src/__tests__/ReactIncrementalPerf-test.internal.js:510:116)
$ yarn flow
yarn run v1.3.2
$ node ./scripts/tasks/flow.js
Error: packages/react-reconciler/src/ReactFiberHostContext.js:87
87: const nextContext = getChildHostContext(context, fiber.type, rootInstance);
^^^^^^^ NoContextT. This type is incompatible with the expected param type of
v---------------------------------------------
31: export default function<T, P, I, TI, HI, PI, C, CC, CX, PL>(
32: config: HostConfig<T, P, I, TI, HI, PI, C, CC, CX, PL>,
33: ): HostContext<C, CX> {
--------------------^ some incompatible instantiation of `CX`
Error: packages/react-reconciler/src/ReactFiberHostContext.js:87
87: const nextContext = getChildHostContext(context, fiber.type, rootInstance);
^^^^^^^^^^^^ NoContextT. This type is incompatible with the expected param type of
v---------------------------------------------
31: export default function<T, P, I, TI, HI, PI, C, CC, CX, PL>(
32: config: HostConfig<T, P, I, TI, HI, PI, C, CC, CX, PL>,
33: ): HostContext<C, CX> {
--------------------^ some incompatible instantiation of `C`
Found 2 errors
Flow failed
error Command failed with exit code 2.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
@abiduzz420 ํ๋ฆ ๋ฌธ์ ๋ Windows์์ ์๋ ค์ง ๋ฌธ์ ์ ๋๋ค. ๊ทธ๊ฒ์ ๊ด๋ จ์ด ์์ต๋๋ค(๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ด ์ ์ผ์ด๋๋์ง ์์๋ด์ผ ํ ๊ฒ์ ๋๋ค). https://github.com/facebook/react/issues/11703์ ์ฐธ์กฐํ์ธ์.
@kwnccc ReactIncrementalPerf-test
์ ๊ฒฝ์ฐ ์, ์ฝ๊ฐ์ ์๊ฐ์ด ํ์ํฉ๋๋ค. ์ด ์์ ์์ ์ผ์์ ์ผ๋ก ReactPortal
์ shared
๋ก ์ด๋ํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ReactNoop
๊ฐ ์์ฒด createPortal()
๋ฉ์๋๋ฅผ ์ ๊ณตํ๋๋ก ํฉ๋๋ค( ReactDOM
์ฒ๋ผ).
ํ๋ ๋ ๋ค์ด! https://github.com/facebook/react/issues/11299
@gaearon ReactPortal์ ๊ณต์ ๋๋ ํ ๋ฆฌ๋ก ์ฎ๊ฒผ๊ณ ๋ชจ๋ ํ
์คํธ๋ฅผ ํต๊ณผํ์ต๋๋ค. ReactNoop
$์ ๋ํ ๋ด ์์ ์ ๋ฐฉ๋ฒ createPortal()
์ ๊ตฌํํ๋ ๋ฐ ์ฝ๊ฐ์ ๋์์ด ํ์ํฉ๋๋ค. createPortal()
๊ฐ ReactDOM
์ ์ด๋ป๊ฒ ์ฐ์ฌ ์๋์ง์์ ์๊ฐ์ ๋ฐ์ ReactPortal.createPortal(children,container,null,key)
๋ฅผ ๋ฐํํ๊ฒ ์ต๋๋ค.
๋๋ ๋ค์ ๋ผ์ธ์ ๋ํด ์๊ฐํ๊ณ ์์ต๋๋ค.
function createPortal( children: ReactNodeList, container: Container, key: ?string = null) {
invariant(
// TODO: Need to figure out this part of the code
);
return ReactPortal.createPortal(children, container, null, key);
}
๋ด๊ฐ ์ ๋๋ก ํ๊ณ ์๋์ง ์๋ ค์ฃผ์ธ์?
@gaearon ๋ด ์ฝ๋๋ ์ฌ์ ํ wip์ ๋๋ค. ํ์ง๋ง ๋ด๊ฐ ์ฌ๋ฐ๋ฅธ ๊ธธ์ ๊ฐ๊ณ ์๋์ง ๋ค์ ํ์ธํ๊ณ ์ถ์์ต๋๋ค. ๋ด ์ฝ๋๋ฅผ ๋น ๋ฅด๊ฒ ์ดํด๋ณด๊ณ ๋ช ๊ฐ์ง ์์ฌ์ ๋ช ํํ ํ ์ ์๋ค๋ฉด ์ ๋ง ๋์์ด ๋ ๊ฒ์ ๋๋ค.
@abiduzz420 ๋ค ๋ง์์
@anushreesubramani
๋ด๊ฐ ์ทจํ ์ ๊ทผ ๋ฐฉ์์ด ์ฌ๋ฐ๋ฅธ๊ฐ์?
์ผ๋ฐ์ ์ผ๋ก ๊ทธ๋ ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ๊ฑฐ๊ธฐ์์ ์ค๋ณต์ ํผํ๊ธฐ๋ฅผ ์ํ ๊ฒ์ ๋๋ค. ์ด์์ ์ผ๋ก๋ ์ผ๋ จ์
expect(isTagStackValid(['a', 'a'])).toBe(false);
์ผ๋ จ์
expectInvalidNestingWarning(true, ['a', 'a']);
์ฌ๊ธฐ์ expectInvalidNestingWarning
๋ ๊ตฌ์ฑ ์์๋ฅผ ์์ฑํ ๋ค์ ์ด๋ฅผ ๋ ๋๋งํ๋ฉด ๊ฒฝ๊ณ ๋ฅผ ์์ฑํ๋ค๊ณ ์ฃผ์ฅํ๋ ์ฌ์ฉ์ ์ ์ ํจ์์
๋๋ค.
์ด๋ฌํ ํน์ ๋ฐ ํ์ ์ง์ ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ์ฑ ์์๋ฅผ ๋์ ์ผ๋ก ์์ฑํ๋ ๋ฐฉ๋ฒ์ด ์๋์ง ํ์คํ์ง ์์ต๋๋ค. ์ด๊ฒ์ ๋ฌ์ฑํ๋ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ๋ํ ๋ช ๊ฐ์ง ์ง์นจ์ ์ค ์ ์์ต๋๊น?
์, ๋ค์๊ณผ ๊ฐ์ด ์๊ฐํ๊ณ ์์ต๋๋ค.
function expectInvalidNestingWarning(shouldWarn, tags) {
let element = null;
tags = [...tags];
while (tags.length) {
element = React.createElement(tags.pop(), null, element);
}
const container = document.createElement('div');
ReactDOM.render(element, container);
// assert either a warning or lack of one based on shouldWarn
}
๋ฐฐ์ด์ ์ดํด๋ณด๊ณ ๋ง์ง๋ง ํญ๋ชฉ์ ์ ํํ๊ณ ํ์ฌ ์์๋ฅผ ํด๋น ํ๊ทธ๊ฐ ์๋ ์์ ์์๋ก ๋ํํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๊ฒฐ๊ตญ ํด๋น ํธ๋ฆฌ๊ฐ ์์ฑ๋ฉ๋๋ค. ๋ด๊ฐ ๋ญ๊ฐ๋ฅผ ์๋ชป ์ผ์ ์๋ ์์ง๋ง ๊ทธ๊ฒ์ด ์ผ๋ฐ์ ์ธ ์๊ฐ์ ๋๋ค.
๋น์ ์ ๋ํ ์๋ง ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ ๋ฃ๊ณ ์ถ์ ๊ฒ์ ๋๋ค
jest.resetModules();
React = require('react');
ReactDOM = require('react-dom');
๊ทธ๋ ์ง ์์ผ๋ฉด ๊ฒฝ๊ณ ๊ฐ ์ค๋ณต ์ ๊ฑฐ๋ ์ ์๊ณ ์์ ์ ์ผ๋ก ํ ์คํธํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
isTagValidInContext() ๋ฉ์๋๊ฐ ํ ์คํธ ํ์ผ ์ด์ธ์ ๋ค๋ฅธ ๊ณณ์์๋ ์ฌ์ฉ๋์ง ์๊ธฐ ๋๋ฌธ์ ๊ณต๊ฐ API๋ก '๋ชจ๋ ํ๊ทธ ์์ ์ปจํ ์คํธ' ํ ์คํธ์ '์ปจํ ์คํธ ์์' ๋ถ๋ถ์ ํ ์คํธํ๋ ๋ฐฉ๋ฒ์ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๋น๋์ ๋ณด๋ฉด https://github.com/facebook/react/commit/76bb96ef21b7c665e1b51b6bb90e64ec40c0f16a ์ ์ถ๊ฐ๋์๊ณ ๊ทธ ์์ ์์ ํ ์คํธ ์ธ๋ถ์์๋ ํธ์ถ๋์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ฏธ๋์ ์ด๋ ์์ ์์ ๋ ์ด์ ์ฌ์ฉ๋์ง ์์์ต๋๋ค. ํ ์คํธ๋ ์๋ฒ ๋ ๋๋ง์ ์ธ๊ธํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ด ๊ธฐ๋ฅ์ ๋ ์ด์ ์๋ฒ ๋ ๋๋ง์์๋ ์ฌ์ฉ๋์ง ์์ต๋๋ค.
์ด ์๊ฒฌ์์ ๋๋ ๋ชฉํ๊ฐ ์กฐ์์ ๋ชจ๋ฅผ ๋ ๊ฒฐ์ฝ ๊ฒฝ๊ณ ํ์ง ์๋๋ก ํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ null
๋ฅผ ancestorInfo
๋ก validateDOMNesting
๋ก ์ ๋ฌํ๋ ์ฝ๋ ๊ฒฝ๋ก๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ฐ๋ฆฌ๋ ์๋ง๋ ํญ์ ํ์ฌ ๋ฒ์ ์ ์กฐ์์ ์๊ณ ์์ ๊ฒ์
๋๋ค. ๋ฐ๋ผ์ ์ด ํ
์คํธ๋ฅผ ์์ ํ ์ญ์ ํ๋ ๊ฒ์ด ์์ ํ๋ค๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค.
@gaearon ReactNoop.js
createPortal()
๋ฉ์๋๋ฅผ ์์ฑํ๊ณ ๊ทธ ์ ์ ์ ์ํ ๋๋ก ReactPortal.js
ํ์ผ๋ ๊ณต์ ๋๋ ํ ๋ฆฌ๋ก ์ด๋ํ์ต๋๋ค. ๋ด ์ฝ๋๋ฅผ ์ดํด๋ณด๊ณ ์์ ํ๊ฑฐ๋ ์ถ๊ฐํด์ผ ํ ์ฌํญ์ด ์์ผ๋ฉด ์์ ํ๊ฒ ์ต๋๋ค.
PR ์ข ๋ณด๋ด์ฃผ์ค ์ ์๋์? ๋ฆฌ๋ทฐ์์ ๋ ผ์ํ๋ ๊ฒ์ด ๋ ์ฝ์ต๋๋ค.
@abiduzz420 ์ ๋ง ์ํ์ ๊ฒ ๊ฐ์๋ฐ์, ์ฃ์กํฉ๋๋ค๋ง ์ค๋๊น์ง ์์
์ ์์ํ ์๊ฐ์ด ์์์ต๋๋ค! ํ
์คํธ๋ฅผ ์๋ฃํ ์ ์์ด์ ์ ๋ง ๊ธฐ๋ปค์ต๋๋ค! ๐๐
@gaearon next ๊ผญ ์ข์ ๋งค๋ฌผ ํ๋ณดํ๊ฒ ์ต๋๋ค
@gaearon ๋น ๋ฅธ ์
๋ฐ์ดํธ: BeforeInputEventPlugin
+ FallbackCompositionState
ํ
์คํธ๋ฅผ ๋ฆฌํฉํ ๋ง/๊ฒฐํฉํ๊ธฐ ์์ํ์ต๋๋ค. ๊ณต๊ฐ API๋ฅผ ํตํด ๊ตฌํ์ ํ
์คํธํ๋ ๋ฐฉ๋ฒ์ ์ ์๊ณ ์์ต๋๋ค. ์ง๊ธ์ ๋ค๋ฅธ ์คํ ํ๊ฒฝ/๋ธ๋ผ์ฐ์ ์์ง์ ๋ฐ๋ผ ๋ค๋ฅธ ์ฝ๋ ๊ฒฝ๋ก๋ฅผ ์คํํ๊ธฐ ์ํด ํ
์คํธ ์ผ์ด์ค๋ฅผ ๋ง๋๋ ์์
์ ํ๊ณ ์์ต๋๋ค. ์ด๋ฒ ์ฃผ ๋ง์ ์ฒซ ๋ฒ์งธ PR์ด ์์ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค(12์ 10์ผ๊น์ง ์
๋ฐ์ดํธ๋จ - ์๊ฐ์ด ์กฐ๊ธ ๋ ํ์ํจ - 12์ 12์ผ ๊ธฐ์ค).
์ข์์, ์ ๋ฐ์ดํธํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
@gaearon ๋น ๋ฅธ ์
๋ฐ์ดํธ: ์ด๋ฏธ getNodeForCharacterOffset-test
์ ๋ํ ํ
์คํธ๋ฅผ ๋ค์ ์์ฑํ๋ ์์
์ ์์ํ์ผ๋ฉฐ ๋ชฉ์์ผ๊น์ง PR์ ํธ์ํ ์ ์์ด์ผ ํฉ๋๋ค. ๊ด์ฐฎ์ต๋๊น?
์ข์ ์๋ฆฌ
ํ๋ ๋ ๋ค์ด! https://github.com/facebook/react/pull/11742
@reznord ์์ง ์์์ด ์์ต๋๋ค. ์์ํ์ จ๋์? ๋๋ฌด ๋ฐ์๋ค๋ฉด ๋ค๋ฅธ ์ฌ๋์๊ฒ ์๋ํด ๋ณผ ๊ธฐํ๋ฅผ ์ฃผ๋ ๊ฒ์ด ์ข์ต๋๋ค.
ํ @reznord
@gaearon๋ , ์ฒซ ๊ธฐ๋ถ๋ก ReactErrorUtils-test.js
๋ฅผ ๋ฐ์๋ ๋ ๊น์?
์๋
ํ์ธ์ @gaearon ReactErrorUtils-test.js
๋ก ํ ์ ์๋ ์ผ์ด ์๋์?
์๋ ํ์ธ์, ์๋ฌด๋ ์ ๊ฐ ReactBrowserEventEmitter-test.js ํ ์คํธ๋ฅผ ๊ณ์ํ๋๋ก ๋์์ค ์ ์์ต๋๊น? ์ง๊ธ์ ๋ฐ๋น ์ ๊ณ์ํ ์๊ฐ์ด ์์ผ๋ PR์ https://github.com/facebook/react/pull/11713 ์ ๋๋ค. ์ ๋ง ๊ฐ์ฌํฉ๋๋ค!!
๋ค์ ํ ๋ฒ ๋ชจ๋ ๋ถ๋ค๊ป ๊ฐ์ฌ๋๋ฆฝ๋๋ค! ์์ง ๋ช ๊ฐ์ง ๋ฏธํด๊ฒฐ ํ ์คํธ๊ฐ ์์ง๋ง ์ข ๋ฃํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
@gaearon : ReactErrorUtils-test.js
์์
ํ๊ณ ์ถ์ต๋๋ค. ๋ด๊ฐ ํฝ์
ํ ์ ์๋์ง ํ์ธํด ์ค ์ ์๋?
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ฒซ ๋ฒ์งธ ๋ณํฉ๋ PR์ด ์์ต๋๋ค!
๊ทธ๊ฒ์ ์ดํด๋ณด์ญ์์ค : https://github.com/facebook/react/pull/11309
์ด๋ฒคํธ์ ๊ด๋ จ๋ ์์ ์ ํ๊ณ ์๋ค๋ฉด https://github.com/facebook/react/pull/11309 ์ ํ ๋ก ๊ณผ ๋ค์ ๋ฆฌ๋ทฐ๋ฅผ ๋ชจ๋ ์ฝ์ด๋ณด์๊ธฐ ๋ฐ๋๋๋ค.
https://github.com/facebook/react/pull/11316
https://github.com/facebook/react/pull/11317
https://github.com/facebook/react/pull/11327
https://github.com/facebook/react/pull/11332
๋ช ๊ฐ์ง ๊ณตํต ์ฃผ์ ๊ฐ ์์ผ๋ฉฐ ์ด๋ฌํ ํ ๋ก ์ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ PR์ ์ฌ๋ฐ๋ฅธ ๋ฐฉํฅ์ผ๋ก ์ด๋๋ ๊ฒ์ด ์ค์ํ ์ ์์ต๋๋ค.