React: autoFocusλŠ” React 16의 SSRμ—μ„œ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

에 λ§Œλ“  2017λ…„ 10μ›” 09일  Β·  12μ½”λ©˜νŠΈ  Β·  좜처: facebook/react

<input autoFocus /> λŠ” ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μž‘λ™ν•˜μ§€λ§Œ μˆ˜ν™”λ˜μ—ˆμ„ λ•ŒλŠ” μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

이것은 νŠΉμˆ˜ν•œ 경우둜 JSμ—μ„œ κ΅¬ν˜„λ˜μ—ˆμ§€λ§Œ hydrateInstance λŠ” .focus() 처럼 finalizeChildren .focus() 호좜 ν•  μˆ˜μžˆλŠ” 컀밋 효과λ₯Ό μ˜ˆμ•½ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

μ—¬κΈ°μ„œ μ§ˆλ¬Έμ€ 더 이상 JSμ—μ„œμ΄λ₯Ό κ΅¬ν˜„ν•΄μ•Όν•˜λŠ”μ§€ μ•„λ‹ˆλ©΄ SSRμ—μ„œ autofocus 속성을 내보내고 λΈŒλΌμš°μ €κ°€ μ²˜λ¦¬ν•˜λ„λ‘ν•΄μ•Ό ν•˜λŠ”κ°€μž…λ‹ˆλ‹€.

Server Rendering Bug

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

autofocus-attributeλ₯Ό ν‘œμ‹œν•˜μ§€ μ•ŠλŠ” 초기 μ΄μœ λŠ” λΈŒλΌμš°μ € κ΅¬ν˜„μ΄ 처리 λ°©μ‹μ—μ„œ κ΄‘λ²”μœ„ν•˜κ²Œ 일관성이 μ—†μ—ˆκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€ (μΌλΆ€λŠ” μ§€μ›ν•˜μ§€ μ•Šκ³  μΌλΆ€λŠ” νŽ˜μ΄μ§€λ‘œλ“œμ—λ§Œ μ΄ˆμ μ„ λ§žμΆ”λŠ” λ“±). IMHOλŠ” μžλ™ μ΄ˆμ μ— λŒ€ν•΄ μ§„μ§€ν•œ μ‚¬λžŒμ΄λΌλ©΄ μ–΄μ¨Œλ“  JSλ₯Ό 톡해 μˆ˜λ™μœΌλ‘œ μ μš©ν•΄μ•Ό 함을 μ˜λ―Έν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μ΄μ œλŠ” JS 포컀슀λ₯Ό μ‹€μ œλ‘œ 듣지 μ•Šμ§€λ§Œ μ–΄λŠ 정도 μžλ™ 포컀슀λ₯Ό μ‘΄μ€‘ν•˜λŠ” λͺ¨λ°”일 λΈŒλΌμš°μ €κ°€ μžˆλ‹€λŠ” 것을 λ§‰μ—°ν•˜κ²Œ κΈ°μ–΅ν•©λ‹ˆλ‹€.

μ—‰λ§μ΄μ§€λ§Œ 속성을 λ‚΄λ³΄λ‚΄λŠ” κ²ƒμ—λŠ” μ•½κ°„μ˜ μž₯점이 있으며, 그것에 λŒ€ν•΄ κ°•ν•˜κ²Œ 느끼면 μˆ˜λ™μœΌλ‘œ μ§‘μ€‘ν•©λ‹ˆλ‹€. λͺ¨λ“  도ꡬ가 μ œκ³΅λ©λ‹ˆλ‹€.

λͺ¨λ“  12 λŒ“κΈ€

μžλ™ μ΄ˆμ μ„ μ†μ„±μœΌλ‘œ λ‚΄ λ³΄λ‚΄μ•Όν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

μ£Όμš” 단점은 autofocus κ°€ IE9, iOS Safari 및 Android λΈŒλΌμš°μ €μ—μ„œ μ§€μ›λ˜μ§€ μ•ŠλŠ”λ‹€λŠ” 것 μž…λ‹ˆλ‹€. λ‚΄κ°€ λ†“μΉœ λ‹€λ₯Έ 단점이 μžˆμŠ΅λ‹ˆκΉŒ? JSλ₯Ό 톡해 μžλ™ μ΄ˆμ μ„ μΆ”κ°€ν•˜λŠ” 것이 μ–Όλ§ˆλ‚˜ μ–΄λ ΅κ±°λ‚˜ 기계적인가?

μš°λ¦¬κ°€ 항상 JSλ‘œν•œλ‹€λ©΄, κ½€ μ‰½μ§€λ§Œ μ˜λ―Έλ‘ μ—λŠ” κ½€ λ‚˜λΉ  λ³΄μž…λ‹ˆλ‹€. μ‹€μ œλ‘œ μ΄ˆμ μ„ λ§žμΆ”κΈ° 전에 λͺ¨λ“  μŠ€ν¬λ¦½νŠΈκ°€λ‘œλ“œλ˜λŠ” 데 μ‹œκ°„μ΄ 걸릴 수 μžˆμŠ΅λ‹ˆλ‹€. μ‚¬μš©μžλŠ” κ·Έ λ™μ•ˆ λ‹€λ₯Έ 것에 집쀑할 수 있으며 κ°‘μžκΈ° μ§‘μ€‘λ©λ‹ˆλ‹€. Fiberλ₯Ό μ‚¬μš©ν•˜λ©΄ 비동기 적으둜 μž¬μˆ˜ν™”ν•  수 있고 λΆ€λΆ„ μˆ˜ν™”λ₯Ό 원할 μˆ˜λ„ 있기 λ•Œλ¬Έμ— μ΄λ―ΈμžˆλŠ” 것보닀 더 λ‚˜λΉ μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.

λ‘˜ λ‹€ ν•  수 μžˆμ§€λ§Œ μ΄ˆμ μ„ 맞좜 μˆ˜μžˆλŠ” μ΄μƒν•œ 인곡물이 μžˆμŠ΅λ‹ˆλ‹€. μŠ€μœ„μΉ˜λ₯Ό 끄고 λ‹€μ‹œ μ΄ˆμ μ„ 맞 μΆ₯λ‹ˆ λ‹€.

정상적인 것이 μ‹€νŒ¨ν•œ κ²½μš°μ—λ§Œ JSμ—μ„œ μˆ˜ν–‰ ν•  수 μžˆμ§€λ§Œμ΄λ₯Ό κ°μ§€ν•˜λŠ” 방법을 λͺ¨λ₯΄κ³  λ§Žμ€ μ½”λ“œλ₯Ό μΆ”κ°€ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λΈŒλΌμš°μ € 지원 문제λ₯Ό κ°μ•ˆν•  λ•Œ μ˜¬λ°”λ₯Έ 절좩이 무엇인지 잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€.

μ‹€μ œλ‘œ μ΄ˆμ μ„ λ§žμΆ”κΈ° 전에 λͺ¨λ“  μŠ€ν¬λ¦½νŠΈκ°€λ‘œλ“œλ˜λŠ” 데 μ‹œκ°„μ΄ 걸릴 수 μžˆμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” 이것이 속성을 λ°©μΆœν•˜λŠ” 맀우 κ°•λ ₯ν•œ 사둀라고 μƒκ°ν•©λ‹ˆλ‹€. document.activeElement ν™•μΈν•˜λ”λΌλ„ μ‚¬μš©μžκ°€ 이미 흐름에 μžˆκ±°λ‚˜ νŽ˜μ΄μ§€λ₯Ό μ•„λž˜λ‘œ μŠ€ν¬λ‘€ν–ˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. νŽ˜μ΄μ§€κ°€ μ ν”„ν•˜κ±°λ‚˜ ν‚€ μž…λ ₯ 쀑간에 λ‹€λ₯Έ μž…λ ₯ μƒμžμ— μž…λ ₯을 μ‹œμž‘ν•˜λŠ” 것을 μ›ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

κ·Έ 쀑 일뢀가 μž¬ν•΄μ‹œλΌλ©΄ λ―Έμ•ˆν•˜μ§€λ§Œ λˆ„κ΅°κ°€κ°€ 그것에 λŒ€ν•΄ 문제λ₯Ό μ œκΈ°ν•˜λ©΄ λ‚΄κ°€ μ£Όμž₯ ν•  λ…ΌμŸμ΄ 될 κ²ƒμž…λ‹ˆλ‹€.

속성을 λ°©μΆœν•˜λŠ” 것은 μ˜¬λ°”λ₯Έ λ°©λ²•μ²˜λŸΌ λ“€λ¦½λ‹ˆλ‹€. μžλ™ μ΄ˆμ μ„ μ§€μ›ν•˜μ§€ μ•ŠλŠ” λΈŒλΌμš°μ €μ—μ„œ μž‘λ™ν•˜λ„λ‘ν•˜λ €λ©΄ λ³Έλ¬Έ 끝에 슀크립트λ₯Ό μΆ”κ°€ν•˜λŠ” 것이 κ°€μž₯ 정상인 것 κ°™μŠ΅λ‹ˆλ‹€.

    <script>!function(el){el&&el.focus()}(document.querySelector('[autofocus]'))</script>

HTML νŽ˜μ΄μ§€κ°€ 맀우 큰 κ²½μš°μ—λ§Œ λ¬Έμ œκ°€ λ°œμƒν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. λ‚˜λŠ” λ˜ν•œ activeElementλ₯Ό 검사 ν•  수 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€ (μ—†κ±°λ‚˜ body이면 focus)ν•˜μ§€λ§Œ 과도 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

autofocus-attributeλ₯Ό ν‘œμ‹œν•˜μ§€ μ•ŠλŠ” 초기 μ΄μœ λŠ” λΈŒλΌμš°μ € κ΅¬ν˜„μ΄ 처리 λ°©μ‹μ—μ„œ κ΄‘λ²”μœ„ν•˜κ²Œ 일관성이 μ—†μ—ˆκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€ (μΌλΆ€λŠ” μ§€μ›ν•˜μ§€ μ•Šκ³  μΌλΆ€λŠ” νŽ˜μ΄μ§€λ‘œλ“œμ—λ§Œ μ΄ˆμ μ„ λ§žμΆ”λŠ” λ“±). IMHOλŠ” μžλ™ μ΄ˆμ μ— λŒ€ν•΄ μ§„μ§€ν•œ μ‚¬λžŒμ΄λΌλ©΄ μ–΄μ¨Œλ“  JSλ₯Ό 톡해 μˆ˜λ™μœΌλ‘œ μ μš©ν•΄μ•Ό 함을 μ˜λ―Έν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μ΄μ œλŠ” JS 포컀슀λ₯Ό μ‹€μ œλ‘œ 듣지 μ•Šμ§€λ§Œ μ–΄λŠ 정도 μžλ™ 포컀슀λ₯Ό μ‘΄μ€‘ν•˜λŠ” λͺ¨λ°”일 λΈŒλΌμš°μ €κ°€ μžˆλ‹€λŠ” 것을 λ§‰μ—°ν•˜κ²Œ κΈ°μ–΅ν•©λ‹ˆλ‹€.

μ—‰λ§μ΄μ§€λ§Œ 속성을 λ‚΄λ³΄λ‚΄λŠ” κ²ƒμ—λŠ” μ•½κ°„μ˜ μž₯점이 있으며, 그것에 λŒ€ν•΄ κ°•ν•˜κ²Œ 느끼면 μˆ˜λ™μœΌλ‘œ μ§‘μ€‘ν•©λ‹ˆλ‹€. λͺ¨λ“  도ꡬ가 μ œκ³΅λ©λ‹ˆλ‹€.

λ‚˜λŠ” 이것 에 λŒ€ν•΄ λ‚˜λˆ„μ—ˆκ³  이것이 κ·ΈλŸ΄λ“―ν•œ λ°©λ²•μœΌλ‘œ λ“€λ¦°λ‹€ κ³  μƒκ°ν•©λ‹ˆλ‹€.

λ°˜μ‘ 16

  • SSR HTML둜 λ‚΄ λ³΄λƒ…λ‹ˆλ‹€.
  • μˆ˜ν™” 된 μš”μ†Œμ— λŒ€ν•΄ JS 폴리 필을 ν˜ΈμΆœν•˜μ§€ μ•Šλ„λ‘ν•©λ‹ˆλ‹€.
  • ν΄λΌμ΄μ–ΈνŠΈκ°€ λ§Œλ“  μš”μ†Œμ— λŒ€ν•΄ 계속 λΈ”λž™λ¦¬μŠ€νŠΈν•˜κ³  JS polyfill을 μ‚¬μš©ν•˜μ‹­μ‹œμ˜€.

λ°˜μ‘ 17

  • JS polyfill을 μ™„μ „νžˆ μ œκ±°ν•˜μ‹­μ‹œμ˜€.
  • 컀밋 쀑에 autoFocus μš”μ†Œκ°€ 두 개 이상 μΆ”κ°€λ˜λ©΄ κ²½κ³ ν•©λ‹ˆλ‹€ (λΈŒλΌμš°μ € λΆˆμΌμΉ˜κ°€ λ°œμƒν•˜λŠ” 곳이기 λ•Œλ¬Έμ—).

이게 말이 돼?

컀밋 쀑에 ν•˜λ‚˜ μ΄μƒμ˜ autoFocus μš”μ†Œκ°€ μΆ”κ°€ 된 경우 κ²½κ³ ν•©λ‹ˆλ‹€ (λΈŒλΌμš°μ € λΆˆμΌμΉ˜κ°€ λ°œμƒν•˜λŠ” μœ„μΉ˜μ΄λ―€λ‘œ).

적어도 μ–Όλ§ˆ μ „κΉŒμ§€ λ§Œν•΄λ„ λΈŒλΌμš°μ €λŠ” autoFocus 속성을 ν•΄μ„ν•˜λŠ” λ°©μ‹μ—μ„œλ„ 일관성이 μ—†μŠ΅λ‹ˆλ‹€. λ‚˜λŠ” 예λ₯Ό λ“€μ–΄ FFκ°€ νŽ˜μ΄μ§€λ‘œλ“œμ‹œμ—λ§Œ 그것을 μ‘΄μ€‘ν•˜κ³  λ™μ μœΌλ‘œ μ‚½μž… 된 것을 μ™„μ „νžˆ λ¬΄μ‹œν•œλ‹€λŠ” 것을 μ•Œκ³  μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ‚˜λŠ” 그것을 μ˜€λž«λ™μ•ˆ μ‘°μ‚¬ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

κ·Έλž˜λ„ μ ‘κ·Ό 방식이 μ˜³λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

기본적인 쑰사 κ²°κ³Ό Safariλ₯Ό μ œμ™Έν•œ λŒ€λΆ€λΆ„μ˜ μ΅œμ‹  λΈŒλΌμš°μ €λŠ” νŽ˜μ΄μ§€λ‘œλ“œ ν›„ autoFocus μ „ν˜€ μ‘΄μ€‘ν•˜μ§€ μ•ŠλŠ” κ²ƒμ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€.

HTML λ¬Έμ„œμ—λŠ” μ΄μΉ˜μ— λ§žμ•˜μ„ κ²ƒμž…λ‹ˆλ‹€.ν•˜μ§€λ§Œ μ•±μ—μ„œλŠ” λ™μ μœΌλ‘œ μ‚½μž… 된 μš”μ†Œμ— λŒ€ν•΄ autoFocus 이 기본적으둜 SPA의 첫 νŽ˜μ΄μ§€λ‘œλ“œλ§ŒνΌ "νŽ˜μ΄μ§€ μ „ν™˜"이기 λ•Œλ¬Έμ— 쑴쀑 될 κ²ƒμœΌλ‘œ μ˜ˆμƒν•©λ‹ˆλ‹€.

κ·Έλž˜μ„œ μš°λ¦¬λŠ” μ•„λ§ˆλ„ polyfill을 μœ μ§€ν•΄μ•Ό ν•  κ²ƒμž…λ‹ˆλ‹€.

더 μ΄μƒν•΄μ§‘λ‹ˆλ‹€.

Chrome은 이전에 μš”μ†Œκ°€ μ—†μ—ˆλ˜ 경우 autoFocus λ™μ μœΌλ‘œ μΆ”κ°€ 된 μš”μ†Œλ₯Ό μ‘΄μ€‘ν•©λ‹ˆλ‹€. autoFocus 둜 μž…λ ₯을 μƒμ„±ν•˜κ³  λ¬Έμ„œμ— μΆ”κ°€ν•˜κ³  λ‹€μŒ ν‹±μ—μ„œ μ œκ±°ν•˜λŠ” κ²ƒλ§ŒμœΌλ‘œλ„ ν–₯ν›„ Chromeμ—μ„œ μΆ”κ°€λ˜λŠ” μš”μ†Œμ˜ μžλ™ μ΄ˆμ μ„ λΉ„ν™œμ„±ν™” ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

FirefoxλŠ” autoFocus 둜 λ™μ μœΌλ‘œ μΆ”κ°€ 된 μš”μ†Œμ— λŒ€ν•΄ μ „ν˜€ μ‹ κ²½ 쓰지 μ•ŠμŠ΅λ‹ˆλ‹€.

그리고 SafariλŠ” 항상 그듀을 μ‘΄μ€‘ν•©λ‹ˆλ‹€.

https://github.com/facebook/react/pull/11192 μ—μ„œ μˆ˜μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰