naver/fe-news ๋‰ด์Šค๋ ˆํ„ฐ ๋ทฐ์–ด (๋น„๊ณต์‹)

๋ชฉ์ฐจ
๋ชฉ์ฐจ

    2021-04

    ๋งํฌ & ์ฝ์„๊ฑฐ๋ฆฌ

    Finding conversations on Clubhouse

    ์ตœ๊ทผ ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ์Œ์„ฑ ๊ธฐ๋ฐ˜์˜ ์†Œ์…œ ๋„คํŠธ์›Œํฌ ์•ฑ์ธ Clubhouse๋Š” ๋งŽ์€ ์ด๋“ค์—๊ฒŒ ํšŒ์ž๋˜๊ณ  ์žˆ๋‹ค.

    UX๋Š” FE ๊ด€์ ์—์„œ๋„ ๋งค์šฐ ์ฃผ์š”ํ•œ ์˜์—ญ ์ค‘ ํ•˜๋‚˜์ด๊ธฐ ๋•Œ๋ฌธ์—, Clubhouse์˜ UX ์‚ฌ๋ก€ ๋ถ„์„์„ ํ†ตํ•ด ์ข‹์€ UI/UX๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ธ์‚ฌ์ดํŠธ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ?

    Mini apps

    Mini apps๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ 4MB ๋‚ด์™ธ์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๋ฉฐ, ์‹คํ–‰๋˜๊ธฐ ์œ„ํ•œ super app์„ ํ•„์š”๋กœ ํ•œ๋‹ค. ์ด๋“ค์€ ์›น ๊ธฐ์ˆ (HTML, CSS, JS)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋œ๋‹ค. (์˜ˆ: WeChat, Line ๋“ฑ๊ณผ ๊ฐ™์€ ๋ฉ”์‹ ์ €์—์„œ ์„ค์น˜ ์—†์ด ๋ฐ”๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋‹ค์–‘ํ•œ ๋ฏธ๋‹ˆ ์•ฑ๋“ค์ด ์ด์— ์†ํ•œ๋‹ค.)

    ๋ธŒ๋ผ์šฐ์ €(mini apps์˜ ๋Ÿฐํƒ€์ž„์€ super app์˜ WebView)์—์„œ ์ง์ ‘ ์‹คํ–‰์€ ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ, ์›น ๊ธฐ์ˆ ์ด ์‚ฌ์šฉ๋˜๋ฏ€๋กœ ๋˜ ๋‹ค๋ฅธ ์˜๋ฏธ์—์„œ์˜ Front-end ๊ธฐ์ˆ  ์‚ฌ์šฉ ํ™•๋Œ€๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

    ์ด ๊ธ€์—์„  Mini apps์˜ ๊ฐœ๋ก ์ ์ธ ๋ถ€๋ถ„๊ณผ ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ ๋„๊ตฌ ๋ฐ ์ƒํƒœ๊ณ„ ๋“ฑ์„ ๋ชจ๋‘ ํ›‘์–ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

    Offline mode in Liftosaur

    PWA ์•ฑ์˜ ๊ฐ€์žฅ ์ฃผ์š”ํ•œ ์ด์  ์ค‘์— ํ•˜๋‚˜๋Š” ๋ฐ”๋กœ ์˜คํ”„๋ผ์ธ ๋ชจ๋“œ๋ฅผ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค. ์บ์‹ฑ์€ Service Worker๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„๋˜๋ฉฐ, ์ด๋ฏธ ์ˆ˜๋งŽ์€ ํŠœํ† ๋ฆฌ์–ผ๊ณผ ์‚ฌ๋ก€๋“ค์„ ์˜จ๋ผ์ธ์—์„œ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์บ์‹ฑ์€ ์˜คํ”„๋ผ์ธ ๋ชจ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๋น™์‚ฐ์˜ ์ผ๊ฐ์œผ๋กœ, ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š” ์˜คํ”„๋ผ์ธ ์•ฑ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„  ๋” ๋งŽ์€ ๊ณ ๋ ค์™€ ์ž‘์—…๋“ค์ด ํ•„์š”ํ•˜๋‹ค.

    ์ด ๊ธ€์€ ์—ญ๋„ ์šด๋™ ํŠธ๋ž˜ํ‚น ์•ฑ์ธ Liftosaur ๊ฐœ๋ฐœํŒ€์—์„  ์–ด๋–ป๊ฒŒ ์˜คํ”„๋ผ์ธ ๋ชจ๋“œ ์ง€์›์„ ์ถ”๊ฐ€ํ–ˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ํ˜„์‹ค์  ๊ณ ๋ ค ์‚ฌํ•ญ๋“ค์ด ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…ํ•œ๋‹ค.

    React authentication, simplified

    ๊ถŒํ•œ ์ธ์ฆ์€ ํ•ญ์ƒ ๋งŽ์€ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•œ ์˜์—ญ์ด๋‹ค. ์ด ๋ฌธ์„œ์—์„œ๋Š” React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ธ์ฆ(๋ฐ ์•ก์„ธ์Šค ์ œ์–ด, SSO ๋“ฑ)์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์„ค๋ช…ํ•œ๋‹ค.

    ๊ตฌํ˜„/์ ์šฉ ์‹œ๋งˆ๋‹ค ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๊ฑฐ๋‚˜ ๋‹ค์‹œ ์กฐ์‚ฌ๊ฐ€ ํ•„์š”ํ•œ ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€ ๋ฐฉ์‹ ๋Œ€์‹ , ์ž๋™์œผ๋กœ ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€๋˜๊ณ  Auth0, Okta ๋ฐ ๊ธฐํƒ€ ๊ธฐ๋Šฅ๋ณด๋‹ค ํ›จ์”ฌ ๊ฐ„๋‹จํ•œ ๋Œ€์ฒด ์„œ๋น„์Šค(https://userfront.com/)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•œ๋‹ค.

    Fundamentals of Functional JavaScript

    ์ด ๋ฌธ์„œ๋Š” JavaScript ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๊ด€๋ จ๋œ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์‚ฌํ•ญ์„ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ๊ณผ ํ•จ๊ป˜ ๋‹ค์Œ์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉํ‘œ๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค.

    • ํ•จ์ˆ˜๋ž€ ๋ฌด์—‡์ธ๊ฐ€?
    • ํ•จ์ˆ˜(Functions) vs ํ”„๋Ÿฌ์‹œ์ €(Procedures)
    • ์„ ์–ธ์ (Declarative) vs ๋ช…๋ น์ (Imperative)
    • ํ•จ์ˆ˜ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์— ๋Œ€ํ•œ ์ดํ•ด

    React Component Tests for Humans

    React์—์„œ ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฌ์šด ์ปดํฌ๋„ŒํŠธ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์–ด๋ ค์šด ์ผ์ด๋‹ค. ์ด ๊ธ€์—์„œ๋Š” ๋‹ค์Œ ์„ธ ๋‹จ๊ณ„๋กœ ์ด๋ฃจ์–ด์ง„ ํŒจํ„ด์„ ํ†ตํ•ด ๊ฐ€๋…์„ฑ์ด ์ข‹์€ ์ปดํฌ๋„ŒํŠธ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•œ๋‹ค.

      1. Arrange: ์ปดํฌ๋„ŒํŠธ props๋ฅผ ์ค€๋น„ํ•œ๋‹ค.
      1. Act: ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”ํ•˜๊ณ  ์‚ฌ์šฉ์ž์˜ ์ด๋ฒคํŠธ๋ฅผ ์ฝ”๋“œ๋กœ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.
      1. Assert: ๊ธฐ๋Œ“๊ฐ’์„ ์„ค์ •ํ•ด์„œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

    Before You memo()

    React์—์„œ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด memo ํ˜น์€ useMemo๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ํ•˜์ง€๋งŒ Dan Abramov๋Š” memo๋ฅผ ๋ฌด์ž‘์ • ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— memo๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋‘๊ฐ€์ง€ ๊ธฐ์ดˆ์ ์ธ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•œ๋‹ค.

    ์ด ๊ธ€์—์„œ ์„ค๋ช…ํ•˜๋Š” ํŒจํ„ด์„ ์ ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ ํ–ฅ์ƒ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๋” ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

    [์ฐธ๊ณ ] One simple trick to optimize React re-renders

    JavaScript: What is the meaning of this?

    JavaScript์—์„œ this๋Š” ๊ต‰์žฅํžˆ ๋ณต์žกํ•œ ๊ฐœ๋…์ด๋‹ค. ์ด ๊ธ€์—์„œ๋Š” if (โ€ฆ) โ€ฆ else if () โ€ฆ else if (โ€ฆ) โ€ฆ ์‹์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ€์ด์Šค๋ฅผ ๋‚˜๋ˆ„์–ด์„œ this๋ฅผ ์„ค๋ช…ํ•œ๋‹ค.

      1. ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ
      1. new์™€ ํ•จ๊ป˜ ํ•จ์ˆ˜/ํด๋ž˜์Šค๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ๊ฒฝ์šฐ
      1. bind ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ
      1. ํ˜ธ์ถœ๋˜๋Š” ์‹œ์ ์— this๊ฐ€ ์„ค์ •๋˜๋Š” ๊ฒฝ์šฐ
      1. ์ƒ์œ„ ๊ฐ์ฒด์—์„œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ
      1. ํ•จ์ˆ˜ ํ˜น์€ ์ƒ์œ„ ์Šค์ฝ”ํ”„๊ฐ€ strict mode ๋‚ด์— ์žˆ๋Š” ๊ฒฝ์šฐ
      1. ๊ทธ ์™ธ ๊ฒฝ์šฐ

    [์ฐธ๊ณ ] ํ•œ๊ธ€ ๋ฒˆ์—ญ

    CSS-in-JS support in DevTools

    ๊ตฌ๊ธ€์€ Chrome 85 ๋ฒ„์ „๋ถ€ํ„ฐ ๊ฐœ๋ฐœ์ž๋„๊ตฌ์—์„œ CSS-in-JS ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์œ„ํ•œ ์Šคํƒ€์ผ ์ˆ˜์ • ๊ธฐ๋Šฅ์„ ์ง€์›ํ–ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋„๊ตฌ์˜ ์Šคํƒ€์ผ ์ฐฝ์—์„œ ์–ด๋–ป๊ฒŒ CSS-in-JS ๊ทœ์น™ ์ˆ˜์ • ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ–ˆ๋Š”์ง€ ์„ค๋ช…ํ•˜๋Š” ๊ธ€์ด๋‹ค.

    ์›น ์„ฑ๋Šฅ ์ตœ์ ํ™” SSR + Cache ์ ์šฉ๊ธฐ

    ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์€ ๋งค์ถœ์—๋„ ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค. ๋˜ํ•œ, ๊ตฌ๊ธ€์€ ์‚ฌ์ดํŠธ ์ˆœ์œ„๋ฅผ ์ง€์ •ํ•  ๋•Œ ์†๋„๋ฅผ ์ค‘์š”ํ•œ ์š”์†Œ๋กœ์„œ ๊ณ ๋ คํ•œ๋‹ค.

    ์ด ๊ธ€์—์„œ๋Š” SSR๊ณผ Cache๋ฅผ ์ ์šฉํ•ด์„œ ์›น ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•œ ๊ฒฝํ—˜์„ ๊ณต์œ ํ•˜๊ณ  ์žˆ๋‹ค.

    How GitHub Actions renders large-scale logs

    GitHub ํ”„๋กœ์ ํŠธ๋“ค์˜ ๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ ์ž๋™ํ™”๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” GitHub Actions์—์„œ ๋Œ€์šฉ๋Ÿ‰ ๋กœ๊ทธ ๋ Œ๋”๋ง ๊ฐœ์„ ์„ ์œ„ํ•œ ์—ฌ์ •์„ ์†Œ๊ฐœํ•œ๋‹ค.

    ๋Œ€์šฉ๋Ÿ‰์˜ ๋กœ๊ทธ๋ฅผ ํ•œ ๋ฒˆ์— ๋ Œ๋”๋ง ํ•˜๋Š” ๊ฒƒ์€ ์„ฑ๋Šฅ์ ์œผ๋กœ ์ข‹์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, UI ๊ฐ€์ƒํ™”๋ฅผ ํ†ตํ•ด ๋ทฐํฌํŠธ๋ฅผ ํ†ตํ•ด ๋…ธ์ถœ๋˜๋Š” ์˜์—ญ ๋งŒ์„ ๋ Œ๋”๋ง ํ•˜๋Š” ๊ฒƒ๊ณผ ์ตœ์†Œ 5๋งŒ ๋ผ์ธ์„ ๊ฐ–๋Š” ๋กœ๊ทธ๋ฅผ ๋ฌธ์ œ์—†์ด ๋ Œ๋”๋ง ํ•˜๋Š” ์ž์ฒด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐœ๋ฐœ์— ์ด๋ฅด๊ฒŒ ๋œ ๋ฐฐ๊ฒฝ ๋“ฑ์„ ์„ค๋ช…ํ•œ๋‹ค.

    Compat2021

    ๋ธŒ๋ผ์šฐ์ € ๋ฒค๋”๋“ค์ธ Google, Mozilla ๊ทธ๋ฆฌ๊ณ  Microsoft์€ ๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜์„ฑ ์ด์Šˆ ํ•ด๊ฒฐ์ด ์‹œ๊ธ‰ํ•œ TOP 5 ํ•ญ๋ชฉ๋“ค์— ๋Œ€ํ•ด 2021๋…„ ๋‚ด ํ˜ธํ™˜์„ฑ ์ด์Šˆ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ž‘์—… ํŒŒํŠธ๋„ˆ์‹ญ์„ ๊ตฌ์„ฑํ•˜๋Š”๋ฐ ํ•ฉ์˜ํ–ˆ๋‹ค.

    ์—ฐ๋‚ด ํ•ด๊ฒฐํ•˜๊ธฐ๋กœ ํ•ฉ์˜ํ•œ TOP 5 ์ด์Šˆ๋“ค์€ ์ฃผ๋กœ CSS ์˜์—ญ์ด๋ฉฐ, ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    • CSS Flexbox
    • CSS Grid
    • position: sticky
    • aspect-ratio
    • CSS transforms

    [์ฐธ๊ณ ] Compat 2021 Dashboard๋ฅผ ํ†ตํ•ด ๊ฐ ๋ธŒ๋ผ์šฐ์ €๋“ค์—์„œ์˜ TOP 5 ์ง€์›์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์ˆ˜ํ–‰ ์ ์ˆ˜๋ฅผ ํ™•์ธํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

    You (Might) Don't Need jQuery

    React, Vue ๋“ฑ์˜ ํ”„๋ŸฐํŠธ์—”๋“œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋‚˜ํƒ€๋‚˜๋ฉด์„œ jQuery ์‚ฌ์šฉ์€ ์ ์ฐจ ์ค„์–ด๋“ค๊ณ  ์žˆ๋‹ค. ๋ณธ ๊ธ€์—์„œ๋Š” jQuery๊ฐ€ ์ œ๊ณตํ•˜๋˜ ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ๋Šฅ์„ ๋„ค์ดํ‹ฐ๋ธŒ๋กœ์„œ ๋Œ€์ฒดํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ์‹œํ•œ๋‹ค.

    ํšจ์œจ์ ์ธ ํ”„๋ŸฐํŠธ์—”๋“œ ์—๋Ÿฌ ํ•ธ๋“ค๋ง

    ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ ์—๋Ÿฌ ํ•ธ๋“ค๋ง์€ ๋นผ๋†“์„ ์ˆ˜ ์—†๋Š” ๊ด€์‹ฌ์‚ฌ๋‹ค. React์—์„œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ณ ๋ คํ•˜๋ฉด์„œ ํšจ์œจ์ ์œผ๋กœ ์—๋Ÿฌ๋ฅผ ์ฒ˜๋ฆฌํ–ˆ๋˜ ๊ฒฝํ—˜์„ ๊ณต์œ ํ•œ ๊ธ€์ด๋‹ค.

    ์ด ๊ธ€์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ธ ๊ฐœ์˜ ๊ธ€์„ ์‹œ๋ฆฌ์ฆˆ๋กœ ๋ฌถ์–ด ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋‹ค.

    ํŠœํ† ๋ฆฌ์–ผ

    Beyond Console.log() โ€“ Level up Your Debugging Skills

    ๋ธŒ๋ผ์šฐ์ €์˜ ๊ฐœ๋ฐœ์ž๋„๊ตฌ๋Š” ๋””๋ฒ„๊น…ํ•  ๋•Œ ๋„์›€์ด ๋˜๋Š” ์—ฌ๋Ÿฌ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

    ์ด ๊ธ€์—์„œ ์„ค๋ช…ํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋„๊ตฌ์˜ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ์ตํžˆ๋ฉด ๋””๋ฒ„๊น… ๋Šฅ๋ ฅ์„ ํ•œ์ธต ๋” ๋Œ์–ด์˜ฌ๋ฆด ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

    How to Fetch Data in React: Cheat Sheet + Examples

    ์ด ๊ธ€์€ React์—์„œ HTTP ์š”์ฒญ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ fetchํ•˜๋Š” ๋ฐฉ๋ฒ• ๋‹ค์„ฏ ๊ฐ€์ง€๋ฅผ ์˜ˆ์ œ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ์„ค๋ช…ํ•œ๋‹ค.

    The Ultimate CSS Grid Tutorial for Beginners (With Interactive Examples)

    Grid Layout ๋ช…์„ธ์˜ ์ฃผ์š”ํ•œ ๊ธฐ๋Šฅ์„ ๋งŽ์€ CodePen ์˜ˆ์ œ์™€ ํ•จ๊ป˜ ์„ค๋ช…ํ•œ๋‹ค.

    ๊ตญ์ œํ™”(i18n) ์ž๋™ํ™” ๊ฐ€์ด๋“œ

    ๊ธ€๋กœ๋ฒŒ ์„œ๋น„์Šค๋ฅผ ์ง€์›ํ•˜๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ตญ์ œํ™”(i18n)๋Š” ํ•„์ˆ˜์ ์ด๋‹ค. ๊ตญ์ œํ™”๋ฅผ ์ง€์›ํ•  ๋•Œ ๊ฐœ๋ฐœ๊ณผ ๋ฒˆ์—ญ ๊ณผ์ •์—์„œ ๋ฐ˜๋ณต์ ์ธ ์ˆ˜๋™ ์ž‘์—…์œผ๋กœ ์ธํ•ด ๊ณ ํ†ต ๋ฐ›๊ธฐ ์‰ฝ๋‹ค.

    ์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” ๊ตฌ๊ธ€ ์Šคํ”„๋ ˆ๋“œ ์‹œํŠธ์™€ i18next, i18next-scanner ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋‹จ ๋ช‡๊ฐœ์˜ ์Šคํฌ๋ฆฝํŠธ๋กœ ํšจ์œจ์ ์ธ ํ˜‘์—…๊ณผ ํ”„๋กœ์„ธ์Šค ์ž๋™ํ™”๋ฅผ ์ด๋ฃฌ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋‹ค.

    ์ฝ”๋“œ์™€ ๋„๊ตฌ

    Stoxy

    ์›น ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žฅ์ฐฉ๋œ ๋ฐ˜์‘ํ˜• ์ƒํƒœ ๊ด€๋ฆฌ์ž ์‹œ์Šคํ…œ์œผ๋กœ, ์ƒํƒœ๋“ค์€ ์ธ ๋ธŒ๋ผ์šฐ์ €(in-browser)์˜ IndexedDB ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๋ฉฐ, ๋งˆ์ง€๋ง‰ ์ ‘๊ทผ๋œ 5๊ฐœ ๊ฐ์ฒด๋“ค๋งŒ ์ธ ๋ฉ”๋ชจ๋ฆฌ(in-memory)๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ตฌ์„ฑ๋œ๋‹ค.

    // Write
    import { write } from "@stoxy/core";
    
    write("Shoppingcart", [{ id: 123, name: "Free gift" }]);
    
    // Read
    import { read } from "@stoxy/core";
    
    async function getItems() {
      const items = await read("shoppingcart");
      return items;
    }
    
    // Clear
    import { clear } from "@stoxy/core";
    
    clear("shoppingcart");
    

    Raycast

    Canvas๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , React์™€ HTML๋กœ ๊ตฌ์„ฑ๋œ Raycasting(๊ด‘์„  ํˆฌ์‚ฌ) JavaScript ์—”์ง„์ด๋‹ค.

    [์ฐธ๊ณ ] ๋ผ์ด๋ธŒ ๋ฐ๋ชจ

    KiwiTalk

    React, Typescript๋กœ ๊ฐœ๋ฐœ๋œ ํฌ๋กœ์Šคํ”Œ๋žซํผ ๋น„๊ณต์‹ ์นด์นด์˜คํ†ก ํด๋ผ์ด์–ธํŠธ

    github-elements

    GitHub์˜ ์›น ์ปดํฌ๋„ŒํŠธ ์ปฌ๋ ‰์…˜์œผ๋กœ, ํ˜„์žฌ 16๊ฐœ์˜ ์ปค์Šคํ…€ ์—˜๋ฆฌ๋จผํŠธ๋“ค์ด ์ œ๊ณต๋˜๊ณ  ์žˆ๋‹ค.

    simple-git-hooks

    Git Hook์˜ ๋Œ€ํ‘œ ์ฃผ์ž์ธ husky์— ๋น„ํ•ด ์˜์กด์„ฑ ์—†๋Š” ๊ฐ€๋ฒผ์šด ์šฉ๋Ÿ‰์˜ hook ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค.

    ํŒจํ‚ค์ง€ ์„ค์น˜ ํ›„, ๊ฐ„๋‹จํ•˜๊ฒŒ package.json์— ์ปค๋ฐ‹ ํ›…์„ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค. ๋‹ค์Œ์€ ์ปค๋ฐ‹ ์ „์— linter๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ํ‘ธ์‹œ ์‹œ์ ์— formatter๋ฅผ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•˜๋Š” ์˜ˆ์ œ๋‹ค.

    // package.json
     "simple-git-hooks": {
        "pre-commit": "npx lint-staged",
        "pre-push": "cd ../../ && npm run format"
      }
    

    React Dev Inspector

    ๋ธŒ๋ผ์šฐ์ €์—์„œ React ์ปดํฌ๋„ŒํŠธ๋ฅผ ํด๋ฆญํ•˜๋ฉด ๋กœ์ปฌ IDE์˜ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ ์ฝ”๋“œ๋กœ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ด๋™์‹œ์ผœ์ฃผ๋Š” ๋„๊ตฌ๋‹ค.

    Shepherd.js

    ์‚ฌ์šฉ์ž์—๊ฒŒ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‚ฌ์šฉ๋ฒ•์„ ์‰ฝ๊ฒŒ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค. React, Vue, Angular ๋“ฑ ์ฃผ์š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์œ„ํ•œ Wrapper ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ๊ฐœ๋ฐœ๋˜์–ด์žˆ๋‹ค.

    dnd kit

    React์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋ณ๊ณ  ์„ฑ๋Šฅ๊ณผ ํ™•์žฅ์„ฑ์ด ์ข‹์€ drag & drop ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค.

    GUI tool to generate React-Table code for your projects

    ํŽ˜์ด์ง€๋„ค์ด์…˜, ์ •๋ ฌ, ๊ฒ€์ƒ‰, ํ•„ํ„ฐ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” React ํ…Œ์ด๋ธ” ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‹ค. ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„ ํ…Œ์ด๋ธ”์„ ๊ฐœ๋ฐœํ•  ๋•Œ ์ƒ์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ์ฐธ๊ณ ํ•ด ์œ ์šฉํ•˜๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

    Svelte NodeGUI: Build Cross Platform Apps with Node and Svelte

    NodeGUI๋Š” Qt5 ๊ธฐ๋ฐ˜์˜ ํฌ๋กœ์Šคํ”Œ๋žซํผ ๋ฐ์Šคํฌํ†ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ ๋„๊ตฌ๋‹ค. NodeGUI๋Š” Chromium ๊ธฐ๋ฐ˜์˜ electron๋ณด๋‹ค CPU์™€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋” ํšจ์œจ์ ์œผ๋กœ ํ™œ์šฉํ•œ๋‹ค๊ณ  ์•Œ๋ ค์ ธ ์žˆ๋‹ค.

    ๊ธฐ์กด์— React์šฉ ๋ Œ๋”๋Ÿฌ์ธ React NodeGUI์™€ Vue์šฉ ๋ Œ๋”๋Ÿฌ์ธ Vue NodeGUI๊ฐ€ ์กด์žฌํ–ˆ๋Š”๋ฐ ์ตœ๊ทผ Svelte์šฉ ๋ Œ๋”๋Ÿฌ์ธ Svelte NodeGUI๊ฐ€ ๋ฆด๋ฆฌ์ฆˆ๋˜์—ˆ๋‹ค.

    classdiagram-ts (VS Code ํ”Œ๋Ÿฌ๊ทธ์ธ)

    TypeScript๋กœ UML ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด์ฃผ๋Š” VS Code ํ”Œ๋Ÿฌ๊ทธ์ธ์ด๋‹ค.

    probe-image-size

    ์ด๋ฏธ์ง€๋Š” ์›น์—์„œ ๊ฐ€์žฅ ๋งŽ์€ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐจ์ง€ํ•˜๋Š” ์š”์†Œ ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ๋งŒ์•ฝ, ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ๋งŒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋ผ๋ฉด ์ด๋ฏธ์ง€ ์ „์ฒด๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๊ฒƒ์€ ๋‚ญ๋น„์ผ ์ˆ˜ ์žˆ๋‹ค. ํŠนํžˆ๋‚˜ ํฐ ์ด๋ฏธ์ง€๋ผ๋ฉด ๋”๋”์šฑ ๊ทธ๋ ‡๋‹ค.

    ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ด๋ฏธ์ง€ ์ „์ฒด๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์ง€ ์•Š๊ณ , ํฌ๊ธฐ์™€ ์ •๋ณด๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค.