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

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

    2020-09

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

    JavaScript ๋ฒˆ๋“ค๋Ÿฌ๋กœ ๋ณธ ์กฐ์„ ์‹œ๋Œ€ ๋ถ•๋‹น์˜ ์ดํ•ด

    Javascript์˜ ๋ชจ๋“ˆ์‹œ์Šคํ…œ๊ณผ ๋ฒˆ๋“ค๋Ÿฌ๋Š” ์ข…๋ฅ˜๋„ ๋งŽ๊ณ  ๋ฐฉ์‹๋„ ๋‹ฌ๋ผ์„œ ์ฒ˜์Œ ์ง„์ž…ํ•˜๋Š”๋ฐ ์–ด๋ ค์›€์ด ์žˆ๋‹ค.

    ์ด ๊ธ€์—์„œ๋Š” ์—ฌ๋ ค์šด ๋‚ด์šฉ์„ ์‰ฝ๊ฒŒ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด "์กฐ์„ ์‹œ๋Œ€ ๋ถ•๋‹น์˜ ์ดํ•ด"๋ผ๋Š” ์งค์— ์œ ๋จธ๋Ÿฌ์Šคํ•˜๊ฒŒ ๋น„์œ ํ•ด ์ œ์‹œํ•˜๊ณ , ์‹œ๊ฐ„์˜ ํ๋ฆ„์— ๋”ฐ๋ผ ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋‹ค.

    ๋ณต์žกํ•˜๊ณ  ์–ด๋ ค์šด Javascript์˜ ๋ชจ๋“ˆ์‹œ์Šคํ…œ๊ณผ ๋ฒˆ๋“ค๋Ÿฌ์˜ ์ดํ•ด๋ฅผ ๋„์™€์ค„ ๊ธ€์ด๋‹ค.

    The cost of parsing JSON

    ์•„๋ž˜์˜ JS ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด๊ณผ JSON.parse()๋ฅผ ํ†ตํ•œ ๋ฌธ์ž์—ด ํŒŒ์‹ฑ ๋ฐฉ์‹๋“ค ์ค‘, ์–ด๋–ค ๊ฒƒ์ด ์„ฑ๋Šฅ์ ์œผ๋กœ ๋” ๋น ๋ฅผ๊นŒ?

    const data = { foo: 42, bar: 1337 };
    const data = JSON.parse('{"foo":42,"bar":1337}');
    

    JSON.parse()๋Š” ํŒŒ์‹ฑ, ์ปดํŒŒ์ผ ๊ทธ๋ฆฌ๊ณ  ์‹คํ–‰ ๋ชจ๋“  ๋‹จ๊ณ„์— ์žˆ์–ด, ๋Œ€๋‹ค์ˆ˜์˜ JS ์—”์ง„์—์„œ ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ๋Œ€๋น„ ์•ฝ 1.7๋ฐฐ ์ด์ƒ ๋” ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ๋œ๋‹ค.

    JSON์˜ ๋น ๋ฅธ ํŒŒ์‹ฑ์„ ์œ„ํ•ด SIMD(Single Instruction Multiple Data)๋ฅผ ์‚ฌ์šฉํ•ด GB ๋‹จ์œ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ดˆ๋‹น ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” simdjson ํ”„๋กœ์ ํŠธ๋„ ํฅ๋ฏธ๋กœ์›Œ ๋ณด์ด๋ฉฐ, ๋‹ค์–‘ํ•œ ๋ฐ”์ธ๋”ฉ(Node.js ๋ฐ”์ธ๋”ฉ์€ simdjson_nodejs)๊ณผ ํฌํŠธ๋“ค์ด ์ œ๊ณต๋œ๋‹ค.

    ์•”ํ˜ธํ™”ํ ํ˜ธ๊ฐ€ JSON ๋ฐ์ดํ„ฐ๋ฅผ simdjson๋ณด๋‹ค ๋” ๋น ๋ฅด๊ฒŒ ํŒŒ์‹ฑํ•˜๋Š” C++ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ ๊ฒฝํ—˜์„ ๋‹ค๋ฃฌ "์„ธ๊ณ„์—์„œ ์ œ์ผ ๋น ๋ฅธ JSON ํŒŒ์„œ ๋งŒ๋“ค๊ธฐ" ๊ธ€๋„ ์žฌ๋ฐŒ๊ฒŒ ์ฝ์–ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

    ๋‹ค์Œ์˜ ๋ฒค์น˜๋งˆํฌ์™€ ์ ์šฉ ์‚ฌ๋ก€ ๋“ฑ๋„ ๊ฐ™์ด ์ฐธ๊ณ ํ•ด ๋ณด๊ธฐ ๋ฐ”๋ž€๋‹ค.

    Whatโ€™s New in TypeScript 4

    typescript 4.0 ๋ฒ„์ „์ด ๋ฐœํ‘œ๋˜์—ˆ๋‹ค.

    ์ด๋ฒˆ ๋ฒ„์ „์—์„œ๋Š” ํŠœํ”Œ ํƒ€์ž…์— ๋ผ๋ฒจ๋ง์„ ํ•  ์ˆ˜ ์žˆ๊ณ  ์Šคํ”„๋ ˆ๋“œ ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ์ œ๋„ค๋ ‰ ํƒ€์ž…์—๋„ ์“ธ ์ˆ˜ ์žˆ๊ฒŒ๋˜์—ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ธ€์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

    ๋˜ํ•œ ๊ณต์‹๋ธ”๋กœ๊ทธ์—์„œ๋Š” ๋ณด๋‹ค ๋” ์ƒ์„ธํ•œ ๋‚ด์šฉ์„ ์ฐธ๊ณ ํ•  ์ˆ˜ ์žˆ๋‹ค.

    React v17.0 Release Candidate: No New Features

    React major ๋ฒ„์ „์ด ๊ณง ์˜ฌ๋ผ๊ฐ„๋‹ค. ๊ณง๋ฐ”๋กœ ์ถ”๊ฐ€๋˜๋Š” ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์€ ์—†๊ณ , ์‚ฌ์šฉ์ž๋“ค์ด ํฐ ๋ฌด๋ฆฌ์—†์ด ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ๋” ํ•˜๋Š” ๊ฒƒ์„ ์ค‘์ ์œผ๋กœ ๋‘์—ˆ๋‹ค. ์ด ์™ธ์— document์—์„œ root๋…ธ๋“œ๋กœ ์ด๋ฒคํŠธ ์œ„์ž„๋ณ€๊ฒฝ ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ฐœ์„ ํ•œ ๋‚ด์šฉ์„ ๋‹ด๊ณ  ์žˆ๋‹ค.

    What Actually is a String in JavaScript?

    ๋‹ค์Œ ์ถœ๋ ฅ๊ฐ’์€ ๋ฌด์—‡์ผ๊นŒ?

    console.log("๐Ÿฅถ".length);
    console.log([..."๐Ÿฅถ"].length);
    

    ํ•œ ์ด๋ชจ์ง€์ด๋ฏ€๋กœ ์ฐจ๋ก€๋กœ 1, 1์ด๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ ๊ฒฐ๊ณผ๋Š” 2, 1์ด๋‹ค. ์™œ ๊ทธ๋Ÿด๊นŒ? ์ด ๊ธ€์—์„œ๋Š” Javascript๊ฐ€ ๋ฌธ์ž์—ด์„ ๋‹ค๋ฃจ๋Š” ๋ฐฉ์‹์„ ์„ค๋ช…ํ•˜๊ณ , ์–ด๋–ป๊ฒŒ ์œ„์™€ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋„์ถœ๋˜๋Š”์ง€ ๊ฐ„๋žตํ•˜๊ฒŒ ์„ค๋ช…ํ•œ๋‹ค.

    Why I Donโ€™t Use GraphQL Anymore

    MongoDB ์—”์ง€์–ด์ธ Harry Wolff๊ฐ€ ๋ฐํžˆ๋Š” ์™œ GraphQL์„ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”์ง€์— ๋Œ€ํ•œ ๋™์˜์ƒ์ด๋‹ค.

    GraphQL์€ ๋งค๋ ฅ์ ์ด๊ณ  FE ๊ฐœ๋ฐœ์— ๋†€๋ผ์šด ๊ธฐ๋Šฅ๋“ค์„ ์ œ๊ณตํ•˜์ง€๋งŒ ๊ทธ์— ๋ฐ˜ํ•ด ์„œ๋ฒ„ ๊ตฌํ˜„์€ ๋งค์šฐ ์–ด๋ ต๋‹ค.

    ๋˜ํ•œ Facebook๊ณผ ๊ฐ™์€ ์Šค์ผ€์ผ์˜ ์„œ๋น„์Šค์—์„œ๋Š” ๋งŽ์€ ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ•ด ์ค„ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋Œ€๋‹ค์ˆ˜์˜ ์‚ฌ์šฉ์ž๋“ค์€ ๊ทธ๋Ÿฌํ•œ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•˜์ง€๋Š” ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ๊ทธ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•œ๋‹ค.

    10 Awesome Chrome Flags You Should Enable Right Now

    ๋ฐ”๋กœ ์‚ฌ์šฉํ•ด๋„ ์ข‹์€ 10๊ฐ€์ง€ ํฌ๋กฌ ํ”Œ๋ž˜๊ทธ๋ฅผ ์†Œ๊ฐœํ•œ๋‹ค.

    ํŠœํ† ๋ฆฌ์–ผ

    I created the exact same app in React and Vue. Here are the differences

    React์™€ Vue๋ฅผ ์ด์šฉํ•ด์„œ ๋˜‘๊ฐ™์€ TODO ์•ฑ์„ ๋งŒ๋“ค์–ด ๋ณด๋ฉด์„œ ์–ด๋–ค ์ ์ด ๋‹ค๋ฅธ์ง€, ์ฝ”๋“œ ์Šคํƒ€์ผ์€ ์–ด๋–ค ์‹์œผ๋กœ ์ฐจ์ด๊ฐ€ ์žˆ๋Š”์ง€๋ฅผ ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋‹ค. 2020๋…„ ๋ฒ„์ „์œผ๋กœ React๋Š” Hooks๋ฅผ Vue(3+)๋Š” Composition API๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. (2019๋…„, 2018๋…„ ๋ฒ„์ „๋„ ๋ณธ๋ฌธ ํ•˜๋‹จ ๋งํฌ์— ์žˆ๋‹ค.)

    ์†Œ์Šค๋ฅผ ์˜ฌ๋ ค๋†“์€ ์ €์žฅ์†Œ ๋งํฌ๋„ ์žˆ์œผ๋‹ˆ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ์ง์ ‘ ์‹คํ–‰ํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

    ๋‘ ๊ฐœ์˜ ์„ ํƒ์ง€์—์„œ ๊ฐˆ๋“ฑํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ์–ด๋ณด๊ธฐ๋ฅผ ์ถ”์ฒœํ•œ๋‹ค.

    TypeScript Exercises

    ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒํ•œ ๊ตฌ์„ฑ์„ ํ†ตํ•ด ์ œ๊ณต๋˜๋Š” 16๊ฐœ์˜ ์—ฐ์Šต๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ์„ ํ†ตํ•ด ์•„๋ž˜์˜ TS ๊ธฐ๋Šฅ๋“ค์„ ํ•™์Šตํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

    • Basic typing.
    • Refining types.
    • Union types.
    • Merged types.
    • Generics.
    • Type declarations.
    • Module augmentation.
    • Advanced type mapping.

    Let's build BATTLESHIPS in JavaScript, HTML and CSS

    ๋ฐฐํ‹€์‰ฝ ๊ฒŒ์ž„์„ ์ œ์ž‘ํ•˜๋Š” ๊ณผ์ •์„ ์†Œ๊ฐœํ•œ ์œ ํŠœ๋ธŒ ๋™์˜์ƒ ๊ฐ•์˜์ด๋‹ค.

    1์‹œ๊ฐ„ 40๋ถ„๊ฐ„์˜ ๊ฐ•์˜๋ฅผ ๋”ฐ๋ผ์„œ ๊ฐ„๋‹จํ•œ ๊ฒŒ์ž„์„ ๋งŒ๋“ค์–ด๋ณธ๋‹ค๋ฉด,

    HTML, CSS, JavaScript์„ ํ•™์Šตํ•จ์€ ๋ฌผ๋ก  ํฐ ์„ฑ์ทจ๊ฐ์„ ๋А๋‚„ ์ˆ˜ ์žˆ์„๊ฒƒ์ด๋‹ค.

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

    Mock Service Worker

    ๊ธฐ์กด์˜ mock API ๋„๊ตฌ ๋˜๋Š” ์„œ๋น„์Šค๋“ค์€ ๋ณ„๋„๋กœ ์ œ๊ณต๋˜๋Š” API ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํ…Œ์ŠคํŠธ ์šฉ๋„๋กœ์จ๋Š” ์œ ์šฉํ•˜์ง€๋งŒ ์‹ค ์„œ๋น„์Šค ๋‹จ๊ณ„์—์„œ๋Š” ์‹ค API๋กœ์˜ ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๋‹จ์ ์ด ์กด์žฌํ•œ๋‹ค.

    MSW(Mock Service Worker)๋Š” ServiceWorker๋ฅผ ์‚ฌ์šฉํ•ด ๋„คํŠธ์›Œํฌ ๋ ˆ๋ฒจ์—์„œ mocking์ด ์ด๋ค„์ง€๊ธฐ ๋•Œ๋ฌธ์— ์‹ค ์„œ๋น„์Šค API ์ฃผ์†Œ๋ฅผ ํ…Œ์ŠคํŠธ ๋‹จ๊ณ„์—์„œ๋„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

    import { setupWorker, rest } from 'msw'
    
    const worker = setupWorker(
      // 'https://github.com/octocat'์— ๋Œ€ํ•œ mock response๋ฅผ ๊ตฌ์„ฑ
      rest.get('https://github.com/octocat', (req, res, ctx) => {
        return res(
          ctx.delay(1500),
          ctx.status(202, 'Mocked status'),
          ctx.json({
            message: 'Mocked response JSON body',
          }),
        )
      }),
    )
    
    worker.start();
    

    pattern.css

    background์— ๋‹ค์–‘ํ•œ ํŒจํ„ดํšจ๊ณผ๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

    WebGL water ripples

    WebGL base์ธ curtain.js๋กœ ๋งŒ๋“  ๋ฌผ๊ฒฐํšจ๊ณผ.

    Debug Visualizer

    ๋””๋ฒ„๊น… ์‹œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์‹œ๊ฐํ™”ํ•ด ๋ณด์—ฌ์ฃผ๋Š” VS Code ํ™•์žฅ๋„๊ตฌ๋กœ JS/TS ๋ฐ ๋Œ€๋‹ค์ˆ˜ ์–ธ์–ด๋“ค์„ ์ง€์›ํ•œ๋‹ค.

    JS/TS ์™ธ ์–ธ์–ด๋“ค์€ ๊ธฐ๋ณธ์  ์ˆ˜์ค€์— ํ•œํ•ด์„œ๋งŒ ์ง€์›๋œ๋‹ค.