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

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

    2020-08

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

    Safari Web Extensions

    ์ง€๋‚œ WWDC ํ–‰์‚ฌ์—์„œ ์ฐจ๊ธฐ OS์ธ Big Sur์—์„œ Chrome, Firefox, Edge ๋“ฑ๊ณผ ๋Œ€๋ถ€๋ถ„ ํ˜ธํ™˜๋˜๋Š” ํ™•์žฅ ๊ธฐ๋Šฅ API์ธ "Safari Web Extensions"์— ๋Œ€ํ•œ ์ง€์›(Safari 14)์„ ๋ฐœํ‘œํ–ˆ๋‹ค.

    ์ž‘์„ฑ๋œ ํ™•์žฅ ๊ธฐ๋Šฅ์€ Native ์•ฑ์œผ๋กœ ํŒจํ‚ค์ง• ๋œ ํ›„, ์•ฑ์Šคํ† ์–ด๋ฅผ ํ†ตํ•ด ํ˜ธ์ŠคํŒ… ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋‹ค๋ฅธ ๋ธŒ๋ผ์šฐ์ €๋“ค์˜ ๊ธฐ์กด ํ™•์žฅ ๊ธฐ๋Šฅ ์•ฑ๋“ค์€ Xcode 12(safari-web-extension-converter)๋ฅผ ํ†ตํ•ด Safari์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๋„๋ก ์†์‰ฝ๊ฒŒ ๋ณ€ํ™”๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

    Mozilla๋Š” ์ด๋ฒˆ ๊ฒฐ์ •์— ํ™˜์˜ ํ•œ๋‹ค๋Š” ์ž…์žฅ์„ ๋ฐํžˆ๊ธฐ๋„ ํ–ˆ๋‹ค.

    devhints.io

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

    ์œ ์‚ฌํ•œ ํ”„๋กœ์ ํŠธ์ธ 1loc (Favorite single line of code)๋„ ๊ฐ™์ด ์ฐธ๊ณ ํ•˜๋ฉด ์ข‹๋‹ค.

    Observables, Reactive Programming, and Regret

    RxJS ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฆฌ๋”ฉ ํ•˜๋Š” Ben Lesh์˜ ๊ธ€๋กœ, ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์€ Observables vs Reactive Programming vs RxJS ๋“ค์„ ๋™์ผ์‹œํ•˜๊ฑฐ๋‚˜ ์ž˜๋ชป ์ดํ•ดํ•˜๊ณ  ์žˆ๋Š” ๋‚ด์šฉ๋“ค์„ ์„ค๋ช…ํ•˜๊ณ , RxJS์— ๋Œ€ํ•œ ํ›„ํšŒ๋ฅผ ๋‹ด์€ ๊ธ€์ด๋‹ค.

    Algorithms in CSS

    ๋ฐœํ‘œ ์Šฌ๋ผ์ด๋“œ

    CSS๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ผ๊นŒ ์•„๋‹๊นŒ?

    ์ด๋Š” ๋ช…๋ นํ˜•(imperative) ์–ธ์–ด๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ•ด ์˜จ JavaScript ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์„ ์–ธ์ (declarative) ์–ธ์–ด์ธ CSS๋Š” ๋•Œ๋ก  ๊นŠ์€ ์ขŒ์ ˆ๊ฐ์„ ์•ˆ๊ฒจ์ฃผ๊ธฐ๋„ ํ•œ๋‹ค.

    2019๋…„ ์•”์Šคํ…Œ๋ฅด๋‹ด์—์„œ ๊ฐœ์ตœ๋œ CSS Day 2019 ์ฝ˜ํผ๋Ÿฐ์Šค ์„ธ์…˜์—์„œ๋Š” CSS๋„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ์ผ์ข…์ด๋ฉฐ, ์™œ ์ค‘์š”ํ•œ๊ฐ€์— ๋Œ€ํ•ด ์–ธ์–ด์  ์ธก๋ฉด์—์„œ์˜ ์ ‘๊ทผ์„ ํ†ตํ•ด ์„ค๋ช…ํ•œ๋‹ค.

    Svelte <3 TypeScript

    Svelte ๊ฐœ๋ฐœํŒ€์€ ๊ณต์‹์ ์ธ TypeScript ์ง€์› ์ถ”๊ฐ€๋ฅผ ๋ฐœํ‘œํ–ˆ๋‹ค.

    ์ƒˆ๋กœ์šด ๊ณต์‹ Svelte for VS Code ํ™•์žฅ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด syntax highlighting, Svelte ์ปดํฌ๋„ŒํŠธ๋ฅผ ์œ„ํ•œ intellisense ๋“ฑ์˜ ์ง€์›์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

    Use Chrome DevTools Like a Senior Frontend Developer

    FE ๊ฐœ๋ฐœ์ž ํ•„์ˆ˜ํ…œ(?) ์ค‘ ํ•˜๋‚˜์ธ Chrome DevTools. ์ด ๊ธ€์—์„œ๋Š” Chrome DevTools์˜ ์ž˜ ์•Œ๋ ค์ง€์ง€ ์•Š์€ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ์†Œ๊ฐœํ•˜๊ณ  ์žˆ๋‹ค.

    ๊ธ€์—์„œ ์†Œ๊ฐœํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋Šฅ๋“ค์„ ์ตํ˜€ ๋†“๋Š”๋‹ค๋ฉด ๋ณธ์ธ์˜ ๊ฐœ๋ฐœ๋ ฅ์„ ์ƒ์Šน์‹œํ‚ค๋Š” ๋ฐ ๋„์›€์ด ๋˜์ง€ ์•Š์„๊นŒ?

    return null vs undefined

    JavaScript์—์„œ ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, ํ•จ์ˆ˜ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ null ๊ณผ undefined ์ค‘ ์–ด๋–ค ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„์ง€์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์ด ๋…น์•„ ์žˆ๋Š” ๊ธ€์ด๋‹ค.

    ์–ด์„œ ์™€, SSR์€ ์ฒ˜์Œ์ด์ง€? - ๊ฐœ๋ฐœ ํŽธ

    Node.js ๊ธฐ๋ฐ˜์˜ SSR ๊ฐœ๋ฐœ๊ณผ ์šด์˜์„ ํ†ตํ•ด ๊ฒช์€ ๊ฒฝํ—˜๊ธฐ ์ด 3ํŽธ ์ค‘ ๋‘ ๋ฒˆ์งธ ๊ธ€๋กœ, 17๋…„๊ฐ„ ์ž”์กดํ•ด ์™”๋˜ ๋ ˆ๊ฑฐ์‹œ ์‹œ์Šคํ…œ ๋‚ด์—์„œ ๋„ค์ด๋ฒ„ ๋ชจ๋ฐ”์ผ ๋ธ”๋กœ๊ทธ ์„œ๋น„์Šค๋ฅผ ์–ด๋–ป๊ฒŒ SSR๋กœ ์ „ํ™˜ํ–ˆ๋Š”์ง€์™€ ๋Œ€ํ•œ๋ฏผ๊ตญ์˜ ๊ฑฐ์˜ ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์ด ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋ฐ”์ผ ๋ธ”๋กœ๊ทธ ์„œ๋น„์Šค์˜ ํŠธ๋ž˜ํ”ฝ์— ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•ด SSR ๊ตฌ์ถ•์„ ์–ด๋–ป๊ฒŒ ์ค€๋น„ํ•˜๊ณ  ๊ฐœ๋ฐœํ–ˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๋ฅผ ๋‹ค๋ฃฌ๋‹ค.

    https://beta.caniuse.com/

    ์›น ๋ช…์„ธ๋“ค์˜ ๋ธŒ๋ผ์šฐ์ € ์ง€์› ์—ฌ๋ถ€๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” Can I use... ์‚ฌ์ดํŠธ์˜ ๋ฒ ํƒ€ ๋ฒ„์ „์ด ๊ณต๊ฐœ๋˜์—ˆ๋‹ค.
    ๋ฒ ํƒ€ ๋ฒ„์ „์—์„œ๋Š” ๋ณด๋‹ค ๊ฐœ์„ ๋œ ์ ‘๊ทผ์„ฑ, ๋‹คํฌ ๋ชจ๋“œ ์ง€์›, ๊ฐœ์„ ๋œ URL ์ ‘๊ทผ ๊ฒฝ๋กœ ๋“ฑ์ด ์ œ๊ณต๋œ๋‹ค.

    ๋ณด๋‹ค ์ž์„ธํ•œ ์—…๋ฐ์ดํŠธ ์„ค๋ช…์€ ๋‹ค์Œ์„ ์ฐธ๊ณ ํ•˜๋ผ.
    Canise: Beta site updates

    Google JavaScript Technical Interview (Callbacks, Promises, Await/Async)

    ๊ตฌ๊ธ€์—์„œ ๊ธฐ์ˆ ๋ฉด์ ‘ ๋ฌธ์ œ๋กœ ์ถœ์ œํ•˜๊ณ  ์žˆ๋Š” JavaScript ๋ฌธ์ œ๋“ค ์ค‘ callback, promise, await/async๋ฅผ ๋น„๊ตํ•˜๋ฉฐ ์„ค๋ช…ํ•œ๋‹ค.

    React defaultProps is dying, whoโ€™s the contender?

    React์—์„œ props์— ๊ธฐ๋ณธ ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ๋Œ€ํ‘œ์ ์œผ๋กœ ES6์—์„œ ๋„์ž…๋œ ๊ธฐ๋ณธ ๋งค๊ฐœ ๋ณ€์ˆ˜ ๋ฌธ๋ฒ•๊ณผ, React์—์„œ ์ œ๊ณตํ•˜๋Š” defaultProps๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

    ์ด ๊ธ€์—์„œ๋Š” ๋‘ ๋ฐฉ๋ฒ•์˜ ์ฐจ์ด์ ๊ณผ ์žฅ๋‹จ์ ์€ ๋ฌด์—‡์ด ์žˆ๋Š”์ง€ ์„ค๋ช…ํ•œ๋‹ค.

    2020๋…„๊ณผ ์ดํ›„ JavaScript์˜ ๋™ํ–ฅ - JavaScript(ECMAScript)

    2016๋…„๋ถ€ํ„ฐ ๋งคํ•ด ๊ณต์œ ๋˜๊ณ  ์žˆ๋Š” JavaScript ๋ฐ Front-end ๋™ํ–ฅ์— ๋Œ€ํ•œ ์‹œ๋ฆฌ์ฆˆ๋กœ, ๊ทธ ์ฒซ ๋ฒˆ์งธ ์˜์—ญ์ธ "JavaScript(ECMAScript)"์— ๋Œ€ํ•œ ๊ธ€์ด๋‹ค.

    ์ง€๋‚œ JavaScript(ECMAScript) ๋™ํ–ฅ ์‹œ๋ฆฌ์ฆˆ: 2016, 2017, 2018, 2019

    ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์ƒˆ๋กœ์šด ์ „ํ™˜์ ์˜ ์‹œ์ž‘์„ ๋งž๊ณ  ์žˆ๋Š” JavaScript์˜ ๋ณ€ํ™”์™€ ์•ž์œผ๋กœ์˜ ์ „๋ง ๊ทธ๋ฆฌ๊ณ , ECMAScript 2020/2021 ์ƒˆ๋กœ์šด ์ฃผ์š” ๋ช…์„ธ๋“ค์„ ํ™•์ธํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

    ํŠœํ† ๋ฆฌ์–ผ

    Ten modern layouts in one line of CSS

    FE News 6์›” ์†Œ์‹์—์„œ ๊ณต์œ ํ–ˆ์—ˆ๋˜ web.dev LIVE ์„ธ์…˜๋“ค ์ค‘ ํ•˜๋‚˜๋กœ, ๋ชจ๋˜ CSS ๋ ˆ์ด์•„์›ƒ ๋ช…์„ธ๋“ค์„ ์ด์šฉํ•ด ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” 10์—ฌ ๊ฐœ์˜ ๋ ˆ์ด์•„์›ƒ์„ ๋น ๋ฅด๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์ฝ”๋“œ ์˜ˆ์ œ์™€ ํ•จ๊ป˜ ์†Œ๊ฐœํ•œ๋‹ค. ์‹คํ–‰ ๊ฒฐ๊ณผ ๋˜ํ•œ ์‹œ๊ฐํ™”ํ•ด ๋ณด์—ฌ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

    WebGL Fundamentals

    WebGL์ด ์‹ค์ œ๋กœ ๋ฌด์—‡์ด๊ณ  ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๊ธฐ์ดˆ๋ถ€ํ„ฐ 2D, 3D, ์กฐ๋ช…, ํ…์Šค์ฒ˜ ๋“ฑ WebGL์—์„œ ์•Œ์•„์•ผ ํ•˜๋Š” ๋ชจ๋“  ์š”์†Œ๋“ค์— ๋Œ€ํ•œ ๊ธฐ์ดˆ์ ์ธ ์„ค๋ช…๊ณผ ์˜ˆ์ œ์™€ ํ•จ๊ป˜ ์ œ๊ณต๋œ๋‹ค.

    ํ•œ๊ธ€ ๋ฒˆ์—ญ๋„ ์ œ๊ณต๋˜์ง€๋งŒ, ์ผ๋ถ€ ์˜์—ญ์— ๋Œ€ํ•ด์„œ๋งŒ ํ•œ์ •์ ์œผ๋กœ ์ œ๊ณต๋œ๋‹ค.

    Build Instagram Using TypeScript, Node, Express and Vue

    ์ด 5๊ฐœ์˜ ์‹œ๋ฆฌ์ฆˆ๋กœ ๊ตฌ์„ฑ๋œ ์ด ํŠœํ† ๋ฆฌ์–ผ์€ Node.js, Express, TypeScript, Vue๋ฅผ ์‚ฌ์šฉํ•ด instagram๊ณผ ์œ ์‚ฌํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ–๋Š” ์›น์•ฑ์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ๋‹จ๊ณ„๋ณ„๋กœ ์„ค๋ช…ํ•œ๋‹ค.

    inline vs block

    ์งง์€ ์ฝ”๋ฏน ์ปท์„ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ด€๋ จ ๊ฐœ๋…๋“ค์„ ์†Œ๊ฐœํ•˜๋Š” Julia Evans๊ฐ€ inline๊ณผ block ์š”์†Œ์˜ ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•œ ๊ทธ๋ฆผ์œผ๋กœ, ๊ฐ„๋‹จํ•˜๊ณ  ๋น ๋ฅด๊ณ  ์‰ฝ๊ฒŒ ๊ฐœ๋…์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

    ํŠธ์œ„ํ„ฐ ๊ณ„์ •์—์„œ๋Š” ์›น ์ด์™ธ์—๋„ ๋‹ค์–‘ํ•œ ๊ธฐ์ˆ ์  ์˜์—ญ๋“ค์— ๋Œ€ํ•œ ์ฝ”๋ฏน๋“ค์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

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

    Playwright

    Playwright์€ MS์—์„œ ๊ฐœ๋ฐœํ•œ Node ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, Chromium, Firefox ๊ทธ๋ฆฌ๊ณ  WebKit ๋“ฑ์˜ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ € ๋‹จ์ผ API๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

    ๋‹ค์Œ์€ Chromium, Firefox ๊ทธ๋ฆฌ๊ณ  WebKit์œผ๋กœ http://whatsmyuseragent.org/ ๋ฅผ ๋ฐฉ๋ฌธํ•˜๊ณ , 3๊ฐœ์˜ ์Šคํฌ๋ฆฐ์ˆ์„ ์ €์žฅํ•˜๋Š” ์˜ˆ์ œ ์ฝ”๋“œ๋‹ค.

    const playwright = require('playwright');
    
    (async () => {
      for (const browserType of ['chromium', 'firefox', 'webkit']) {
        const browser = await playwright[browserType].launch();
        const context = await browser.newContext();
        const page = await context.newPage();
    
        await page.goto('http://whatsmyuseragent.org/');
        await page.screenshot({ path: `example-${browserType}.png` });
        await browser.close();
      }
    })();
    

    Puppeteer Recorder

    Chrome ํ™•์žฅ ๊ธฐ๋Šฅ์œผ๋กœ, ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ˆ˜ํ–‰ํ•œ ์ธํ„ฐ๋ ‰์…˜์„ ๊ธฐ๋กํ•˜๊ณ  ์ด๋ฅผ Puppeteer ์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋กœ ๋งŒ๋“ค์–ด ์ค€๋‹ค.

    chrome ์›น ์Šคํ† ์–ด์—์„œ ์„ค์น˜ํ•˜๊ธฐ

    My favorite CSS hack

    ์•„๋ž˜์˜ ๊ดด์ƒํ•œ CSS ์Šค๋‹ˆํŽซ์€ ๋ฌด์Šจ ์ผ์„ ํ• ๊นŒ?

    * { background-color: rgba(255,0,0,.2); }
    * * { background-color: rgba(0,255,0,.2); }
    * * * { background-color: rgba(0,0,255,.2); }
    * * * * { background-color: rgba(255,0,255,.2); }
    * * * * * { background-color: rgba(0,255,255,.2); }
    * * * * * * { background-color: rgba(255,255,0,.2); }
    * * * * * * * { background-color: rgba(255,0,0,.2); }
    * * * * * * * * { background-color: rgba(0,255,0,.2); }
    * * * * * * * * * { background-color: rgba(0,0,255,.2); }
    

    ์œ„์˜ ์Šค๋‹ˆํŽซ์€ ์•„๋ž˜์˜ ์šฐ์ธก ์ด๋ฏธ์ง€์™€ ๊ฐ™์ด ์š”์†Œ๋“ค์„ ๊ตฌ๋ถ„ํ•ด ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ํ•ด ํŽ˜์ด์ง€ ๋ ˆ์ด์•„์›ƒ ์ž‘์—… ์‹œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.

    ๋ณธ๋ฌธ ๊ธ€์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€์—์„œ๋Š” ๋ช‡๋ช‡ ์‚ฌ์šฉ์ž๋“ค์ด ๊ฐœ์„ ํ•œ ๋ฒ„์ „๋“ค๋„ ํ•จ๊ป˜ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ๋‹ค.

    TSDX

    ์ตœ๊ทผ์˜ TypeScript ์ธ๊ธฐ์— ๋”ฐ๋ผ ๋งŽ์€ ํ”„๋กœ์ ํŠธ๋“ค์ด TypeScript๋กœ ๊ฐœ๋ฐœ๋˜๊ณ  ์žˆ๋‹ค. ํ•˜์ง€๋งŒ, TS ํ”„๋กœ์ ํŠธ๋ฅผ ์„ค์ •ํ•˜๋Š” ์ผ์€ ๋•Œ๋กœ๋Š” ๋„์ „์ ์ธ ์ผ์ด ๋˜๊ธฐ๋„ ํ•œ๋‹ค. ๋‹ค์–‘ํ•œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๊ทธ์— ๋งž๋Š” TS ๊ด€๋ จ ๋„๊ตฌ๋“ค์„ ์„ค์น˜ํ•˜๊ณ  ์„ค์ •ํ•˜๋Š” ๊ฒƒ์€ ๊ณจ์น˜ ์•„ํ”„๋ฉด์„œ ๊ท€์ฐฎ์€ ์ผ์ด๋‹ค.

    TSDX๋Š” ๋ฌด์„ค์ •(Zero-Config)์„ ํ‘œ๋ฐฉํ•˜๋Š” CLI ๋„๊ตฌ๋กœ, ๊ฐ„๋‹จํ•˜๊ณ  ๋น ๋ฅด๊ฒŒ ์ƒˆ๋กœ์šด TS ํ”„๋กœ์ ํŠธ๋ฅผ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํ•ด ์ฃผ๋Š” ๋„๊ตฌ๋‹ค.

    npx tsdx create ํ”„๋กœ์ ํŠธ๋ช…
    

    ์ด 3๊ฐ€์ง€ ํ˜•ํƒœ์˜ ํ”„๋กœ์ ํŠธ ํ…œํ”Œ๋ฆฟ์„ ์ œ๊ณตํ•œ๋‹ค.

    • basic: Plain TypeScript ํ”„๋กœ์ ํŠธ
    • react: React๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์ ํŠธ
    • react-with-storybook: React + React Storybook ์„ค์ •

    npmview

    npm ํŒจํ‚ค์ง€ ๋‚ด์˜ ํŒŒ์ผ๋“ค์„ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ ํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ๋กœ, ํŒจํ‚ค์ง€ ๋‚ด์˜ ํŒŒ์ผ ๊ตฌ์„ฑ๊ณผ ํ•ด๋‹น ํŒŒ์ผ์˜ ๋‚ด์šฉ๊นŒ์ง€ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์‚ฌ์šฉ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™์ด npm์— ๋ฐฐํฌ๋œ ํŒจํ‚ค์ง€๋ช…์„ ๋ง๋ถ™์ด๋ฉด ๋ฐ”๋กœ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

    https://npmview.now.sh/ํŒจํ‚ค์ง€๋ช…
    https://npmview.now.sh/ํŒจํ‚ค์ง€๋ช…@๋ฒ„์ „
    

    Screen size map

    ๋‹ค์–‘ํ•œ ๋””๋ฐ”์ด์Šค๋“ค์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์Šคํฌ๋ฆฐ ํฌ๊ธฐ๋ฅผ ๋น„๊ตํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

    Mocky

    ์›ํ•˜๋Š” ํ˜•ํƒœ(status code, content-type ๋“ฑ์˜ ์„ค์ •์ด ๊ฐ€๋Šฅ)๋กœ ์‘๋‹ต์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๋ชฉ์—… API๋ฅผ ๋งŒ๋“ค๊ณ  ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋‹ค.

    ๋ณ„๋„์˜ ๋กœ๊ทธ์ธ ์—†์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, JSONP, CORS ๋“ฑ๋„ ์ง€์›ํ•˜๊ณ  ์žˆ์–ด ์•„์ง ์‹ค API์˜ ๊ฐœ๋ฐœ์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์€ ์ƒํ™ฉ์—์„œ ๊ฐœ๋ฐœ ์ž‘์—…์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค.