React: ๋ฒ„๊ทธ : DevTools DOM ๊ฐ•์กฐ ํ‘œ์‹œ๊ฐ€ ์žฅ์‹œ๊ฐ„ ๋งˆ์šฐ์Šค ์˜ค๋ฒ„ ํ›„ ์ค‘๋‹จ๋จ

์— ๋งŒ๋“  2020๋…„ 01์›” 16์ผ  ยท  6์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: facebook/react

์žฌํ˜„ ๋‹จ๊ณ„

  1. DevTools์—์„œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌ ํ‚ค์‹ญ์‹œ์˜ค.
  2. 1 ์ดˆ ์ •๋„ ๊ณ„์† ํ˜ธ๋ฒ„๋ง
  3. ๋‹ค๋ฅธ ํ•ญ๋ชฉ์„ ๊ฐ€๋ฆฌ ํ‚ค์ง€ ์•Š๊ณ  ์ปค์„œ๋ฅผ DevTools ๋ฐ–์œผ๋กœ ๋น ๋ฅด๊ฒŒ ์ด๋™

์˜ˆ์ƒ : DOM ๊ฐ•์กฐ ํ‘œ์‹œ๊ฐ€ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.
์‹ค์ œ : DOM ๊ฐ•์กฐ ํ‘œ์‹œ๊ฐ€ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.

Developer Tools Bug

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

๋‚˜๋Š” Twitter ์—์„œ ์ด๊ฒƒ์„ ์–ธ๊ธ‰ํ–ˆ์ง€๋งŒ devtools ์†Œ์Šค๋ฅผ ํ†ตํ•ด ๋งˆ์šฐ์Šค ์›€์ง์ž„์„ ์ฒ˜๋ฆฌํ•˜๊ณ  DOM ์š”์†Œ๋ฅผ ๊ฐ•์กฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํŒŒ์•…ํ–ˆ์Šต๋‹ˆ๋‹ค.

hover ์ƒํƒœ๊ฐ€ _onmousemove ํ•ธ๋“ค๋Ÿฌ์—์žˆ๋Š” devtools ์—…๋ฐ์ดํŠธ์˜ ์ฃผ์š” ์žฅ์†Œ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ํฅ๋ฏธ๋กญ๊ฒŒ๋„ ๋‹ค๋ฅธ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ฐธ์กฐํ•˜์ง€ ์•Š๋Š” _highlightTreeElement ๋ฅผ ์ฐจ๋ก€๋กœ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ ( _onfocusout , _onmouseleave , _ondragstart ๋ฐ _reset )๋Š” ์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด SDK.OverlayModel.hideDOMNodeHighlight() ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์ธ ํŽ˜์ด์ง€์—์„œ ํ•˜์ด๋ผ์ดํŠธ.

ํŽธ์ง‘ : itemData ์˜ ํ˜„์žฌ ๊ตฌํ˜„์ด onMouseMove ๋ฐ onMouseLeave ์— ๋ฐ”์ธ๋”ฉ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๊ธฐ ์ง‘ํ•ฉ์„ ํ˜ธ์ถœํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. devtools๊ฐ€ ๊ด€์ฐฐํ•˜๋Š” ์ถ”๊ฐ€ ์ด๋ฒคํŠธ๋Š” ๋“œ๋ž˜๊ทธํ•˜๊ฑฐ๋‚˜ ๋” ๋งŽ์€ ํฌ์ปค์Šค ๋ณ€๊ฒฝ ์ฒ˜๋ฆฌ๊ฐ€ ๊ด€์‹ฌ์‚ฌ ์ธ ๊ฒฝ์šฐ ์ƒํ™ฉ์„ ์ข€ ๋” ๊ฒฌ๊ณ ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ด๊ฒƒ์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ๋” ์‰ฌ์šด ๋ฐฉ๋ฒ• :

  1. ๊ตฌ์„ฑ ์š”์†Œ ํŠธ๋ฆฌ์—์„œ ์š”์†Œ๋ฅผ ์„ ํƒํ•˜๋ ค๋ฉด ํด๋ฆญํ•˜์‹ญ์‹œ์˜ค.
  2. DevTools ์™ธ๋ถ€๋กœ ๋งˆ์šฐ์Šค ์ด๋™
  3. ์œ„์ชฝ ๋˜๋Š” ์•„๋ž˜์ชฝ ํ™”์‚ดํ‘œ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

DevTools์—์„œ ๋‹ค๋ฅธ ๊ฒƒ์— ์ง‘์ค‘ํ•  ๋•Œ๊นŒ์ง€ ํ•˜์ด๋ผ์ดํŠธ๋Š” ์ด์ œ "๊ณ ์ •"๋ฉ๋‹ˆ๋‹ค.

TBH ์ด๊ฒƒ์€ ๋‚ด ๋งˆ์Œ์— ์˜ˆ์ƒ๋˜๋Š” ๋™์ž‘์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋„ค์ดํ‹ฐ๋ธŒ ์š”์†Œ๊ฐ€ ํ˜ธ๋ฒ„๋ง๋˜๊ฑฐ๋‚˜ ์ดˆ์ ์ด ๋งž์ถฐ์ ธ์žˆ๋Š” ํ•œ ๋ธŒ๋ผ์šฐ์ €์˜ ์š”์†Œ ํŒจ๋„์ดํ•˜๋Š” ์ผ๊ณผ ์ผ์น˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. 1

์›ํ•˜๋Š” ๊ฒฝ์šฐ Tree ์„ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ๋ช‡ ์ดˆ ํ›„์— ์ž๋™ ์ˆจ๊น€์„ ํ™œ์„ฑํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/facebook/react/blob/95bd7aad7daa80c381faa3215c80b0906ab5ead5/packages/react-devtools-shared/src/devtools/views/Components/Tree.js#L207 -L223

... hideAfterTimeout: true ์ฒ˜๋Ÿผ SelectedElement hideAfterTimeout: true ๋„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค ...
https://github.com/facebook/react/blob/95bd7aad7daa80c381faa3215c80b0906ab5ead5/packages/react-devtools-shared/src/devtools/views/Components/SelectedElement.js#L75 -L89

1 ๋‘˜ ์‚ฌ์ด์˜ ์ž‘์ง€๋งŒ ์ค‘์š”ํ•œ ์ฐจ์ด์  ์ค‘ ํ•˜๋‚˜๋Š” ๊ธฐ๋ณธ ์š”์†Œ ํŒจ๋„์ด ๋งˆ์šฐ์Šค ์•„์›ƒ์‹œ "๊ณ ์ • ๋œ"๊ฐ•์กฐ ํ‘œ์‹œ๋ฅผ ๋‚จ๊ธฐ์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ „์ฒด ๊ฐœ๋ฐœ์ž ๋„๊ตฌ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ๋งˆ์šฐ์Šค๋ฅผ ๋” ์•ˆ์ •์ ์œผ๋กœ ๊ฐ์ง€ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ ์š”? ์–ด๋–ป๊ฒŒ ๋“  ๋” ์ž˜ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

Firefox์—์„œ ๊ฐ•์กฐ ํ‘œ์‹œ๊ฐ€ ๋ฉˆ์ถ”์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ์ƒ๋˜๋Š” ๋™์ž‘ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด Firefox์™€ Chrome ๊ฐ„์˜ ๋™์ž‘์ด ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‘˜ ์‚ฌ์ด์˜ ์ž‘์ง€๋งŒ ์ค‘์š”ํ•œ ์ฐจ์ด์  ์ค‘ ํ•˜๋‚˜๋Š” ๊ธฐ๋ณธ ์š”์†Œ ํŒจ๋„์ด ๋งˆ์šฐ์Šค ์•„์›ƒ์‹œ "๊ณ ์ • ๋œ"๊ฐ•์กฐ ํ‘œ์‹œ๋ฅผ ๋‚จ๊ธฐ์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ œ๊ฐ€ ๋ฌธ์ œ๋ฅผ ์ œ๊ธฐ ํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. :-) ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ์ฐจ์ด์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋งค์ผ์ด ๋ฌธ์ œ๋ฅผ ๋‹ค๋ฃจ๊ณ ์žˆ๋‹ค.

... hideAfterTimeout๋„ ์ „๋‹ฌํ•˜๋ ค๋ฉด : SelectedElement์ฒ˜๋Ÿผ true ...

๋ช‡ ์ดˆ ํ›„์— ํ•ญ์ƒ ๊ฐ•์กฐ ํ‘œ์‹œ๊ฐ€ ์ œ๊ฑฐ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ์ด ๋ฌธ์ œ๋Š” ํ•ด๊ฒฐ๋˜์ง€๋งŒ ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋Š” ๋” ์•…ํ™”๋ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์ˆ˜์šฉ ๊ฐ€๋Šฅํ•œ ํ•ด๊ฒฐ์ฑ…์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด์ƒ์ ์œผ๋กœ, ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์€ DevTools ์™ธ๋ถ€์— ์ปค์„œ๋ฅผ ๋†“๋Š” ์ˆœ๊ฐ„ ๊ฐ•์กฐ ํ‘œ์‹œ๊ฐ€ ์•ˆ์ •์ ์œผ๋กœ ์ œ๊ฑฐ๋˜๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ๋„ค์ดํ‹ฐ๋ธŒ์ฒ˜๋Ÿผ.

"ํ‚ค๋ณด๋“œ๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋–จ๊นŒ์š”"์™€ ๊ฐ™์€ ์˜ˆ์™ธ์  ์ธ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€๋งŒ ํ•ญ์ƒ ๋‘๋“œ๋ฆฌ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์กฐ์ ์œผ๋กœ,์ด ํŠน์ • ๋ฒ„๊ทธ (๋กœ ๋งˆ์šฐ์Šค์— ์ผ๊ด€์„ฑ ๋ฆฌ์…‹ ๊ฐ•์กฐ) ๋งค์ผ ์—ฌ๋Ÿฌ ๋ฒˆ ํƒ€๊ฒฉํ•˜๊ณ ์žˆ๋‹ค.

๋‚˜๋Š” ์—ฌ๊ธฐ์„œ 30 ๋ถ„์„ ๋ณด๋ƒˆ๊ณ  ์™œ ์ด๋ฒคํŠธ๊ฐ€ ์‹œ์ž‘๋˜์ง€ ์•Š๋Š”์ง€์— ๋Œ€ํ•œ ๋จผ ์ƒ๊ฐ์กฐ์ฐจํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ํŠธ์œ„ํ„ฐ์— ๋ฌผ์–ด ๋ณด์ž. https://twitter.com/dan_abramov/status/1222178476817633282

๋‚˜๋Š” Twitter ์—์„œ ์ด๊ฒƒ์„ ์–ธ๊ธ‰ํ–ˆ์ง€๋งŒ devtools ์†Œ์Šค๋ฅผ ํ†ตํ•ด ๋งˆ์šฐ์Šค ์›€์ง์ž„์„ ์ฒ˜๋ฆฌํ•˜๊ณ  DOM ์š”์†Œ๋ฅผ ๊ฐ•์กฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํŒŒ์•…ํ–ˆ์Šต๋‹ˆ๋‹ค.

hover ์ƒํƒœ๊ฐ€ _onmousemove ํ•ธ๋“ค๋Ÿฌ์—์žˆ๋Š” devtools ์—…๋ฐ์ดํŠธ์˜ ์ฃผ์š” ์žฅ์†Œ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ํฅ๋ฏธ๋กญ๊ฒŒ๋„ ๋‹ค๋ฅธ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ฐธ์กฐํ•˜์ง€ ์•Š๋Š” _highlightTreeElement ๋ฅผ ์ฐจ๋ก€๋กœ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ ( _onfocusout , _onmouseleave , _ondragstart ๋ฐ _reset )๋Š” ์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด SDK.OverlayModel.hideDOMNodeHighlight() ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์ธ ํŽ˜์ด์ง€์—์„œ ํ•˜์ด๋ผ์ดํŠธ.

ํŽธ์ง‘ : itemData ์˜ ํ˜„์žฌ ๊ตฌํ˜„์ด onMouseMove ๋ฐ onMouseLeave ์— ๋ฐ”์ธ๋”ฉ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๊ธฐ ์ง‘ํ•ฉ์„ ํ˜ธ์ถœํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. devtools๊ฐ€ ๊ด€์ฐฐํ•˜๋Š” ์ถ”๊ฐ€ ์ด๋ฒคํŠธ๋Š” ๋“œ๋ž˜๊ทธํ•˜๊ฑฐ๋‚˜ ๋” ๋งŽ์€ ํฌ์ปค์Šค ๋ณ€๊ฒฝ ์ฒ˜๋ฆฌ๊ฐ€ ๊ด€์‹ฌ์‚ฌ ์ธ ๊ฒฝ์šฐ ์ƒํ™ฉ์„ ์ข€ ๋” ๊ฒฌ๊ณ ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

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