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

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

    2020-12

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

    npm-init <initializer>

    ๋ณดํ†ต ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ, npm init -y๋ฅผ ์ˆ˜ํ–‰ํ•ด ๊ธฐ๋ณธ ๊ฐ’์ด ์ง€์ •๋œ package.json์„ ๋งŒ๋“ค๊ฑฐ๋‚˜, ๋˜๋Š” ํŠน์ • ํ”„๋ ˆ์ž„์›Œํฌ๋ผ๋ฉด create-XXX(create-react-app)์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด ํ”„๋กœ์ ํŠธ ์Šค์บํด๋”ฉ์„ ํ†ตํ•ด ์‹œ์ž‘ํ•œ๋‹ค.

    ์Šค์บํด๋”ฉ ๋„๊ตฌ๋ฅผ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด, ์ „์—ญ ์˜์—ญ์— ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ž์ฃผ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด npx๋ฅผ ํ†ตํ•ด ํ•œ ๋ฒˆ๋งŒ ๋‹ค์šด๋กœ๋“œํ•ด ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ผ๋ฐ˜์ ์ด๋‹ค.

    npx create-react-app my-app
    

    ์ž˜ ์•Œ๋ ค์ง€์ง€ ์•Š์€ ์‚ฌ์‹ค ์ค‘ ํ•œ ๊ฐ€์ง€๋Š”, npm init ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด๋‹ค ๊ฐ„ํŽธํ•˜๊ฒŒ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค. npm v6+๋ถ€ํ„ฐ <initializer>์ง€์ •์„ ํ†ตํ•ด ์™ธ๋ถ€ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•œ ์Šค์บํด๋”ฉ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

    npm init <initializer>
    
    npm init foo # ==> npx create-foo
    npm init foo -- --hello # ==> npx create-foo --hello
    

    npm ํŒจํ‚ค์ง€๋ช…์ด create-<initializer>์™€ ๊ฐ™์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ, npx๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ํŒจํ‚ค์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œ ํ›„ ํ•ด๋‹น ํŒจํ‚ค์ง€๋ฅผ ํ†ตํ•œ ํ”„๋กœ์ ํŠธ ์Šค์บํด๋”ฉ์„ ์ƒ์„ฑํ•œ๋‹ค.

    npm init react-app my-app
    npm init react-app@3.3.0 my-app
    
    # Yarn์˜ ๊ฒฝ์šฐ๋„, ์œ ์‚ฌํ•œ "yarn create"๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    yarn create react-app my-app # Yarn 0.25+
    

    How Web Apps Work: JavaScript and the DOM

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

    ์ด ๊ธ€์—์„œ๋Š” ๊ธฐ๋ณธ์ ์ธ ์›น ๊ฐœ๋ฐœ ๊ฐœ๋…๊ณผ ๊ธฐ์ˆ ๋“ค์— ๋Œ€ํ•ด ๋ฌด์—‡์ธ์ง€, ์™œ ํ•„์š”ํ•œ์ง€, ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ๋“ค์ด ์–ด๋–ป๊ฒŒ ์„œ๋กœ ์—ฐ๊ด€๋˜์–ด ์žˆ๋Š”์ง€๋ฅผ ๊ฐœ๊ด„์ ์œผ๋กœ ๋‹ค๋ฃฌ๋‹ค.

    Chrome Dev Summit 2020

    12์›” 9-10์ผ, ํฌ๋กฌ ๋ธŒ๋ผ์šฐ์ €์™€ ์›น ๊ธฐ์ˆ ๊ณผ ๊ด€๋ จ๋œ ์ด 26๊ฐœ์˜ ์„ธ์…˜์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š” ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ์„œ๋ฐ‹์ด ์ง„ํ–‰๋œ๋‹ค. ์˜ฌํ•ด๋Š” ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž ํ–‰์‚ฌ๋“ค๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์˜จ๋ผ์ธ์œผ๋กœ ์ง„ํ–‰๋œ๋‹ค.

    ๋ณธ ํ–‰์‚ฌ์— ์•ž์„œ 12์›” 7-8์ผ ์ง„ํ–‰๋˜๋Š” ์›Œํฌ์ˆ์„ ํ†ตํ•ด ๊ฐ ๋ถ„์•ผ๋ณ„ ์ „๋ฌธ๊ฐ€๋“ค์„ ํ†ตํ•ด ์ง์ ‘ ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ๋“ค์„ ๋ฐฐ์›Œ๋ณผ ์ˆ˜๋„ ์žˆ๋‹ค.

    Why I will no longer be using console.log() to check React state updates

    React ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค ๋ณด๋ฉด ์ข…์ข… state๋ฅผ ๋ณด๊ธฐ ์œ„ํ•ด console.log๋ฅผ ์ด์šฉํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ, console.log๋Š” ๊ฐ€๋…์„ฑ ๋ฉด์—์„œ ์ข‹์ง€ ์•Š์„ ๋•Œ๊ฐ€ ๋งŽ๋‹ค. ์ด ๊ธ€์€ console.table๊ณผ columns ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ†ตํ•ด React state๋ฅผ ์ข€ ๋” ๋ณด๊ธฐ ์‰ฝ๊ฒŒ ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•œ๋‹ค.

    10 React security best practices

    React ํ™˜๊ฒฝ์—์„œ ๊ฐœ๋ฐœ ์‹œ ์‰ฝ๊ฒŒ ๋†“์น  ์ˆ˜ ์žˆ๋Š” 10๊ฐ€์ง€ ๋ณด์•ˆ ์œ„ํ˜‘ ์ผ€์ด์Šค์™€ ๊ทธ์— ๋Œ€ํ•œ ํ•ด๋ฒ•์„ ์ œ์‹œํ•œ๋‹ค.

    TypeScript's Release Process

    ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํŒ€์ด ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๋ฆด๋ฆฌ์Šค ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•œ ๊ธ€์„ ์ž‘์„ฑํ•˜์˜€๋‹ค. ๋ฆด๋ฆฌ์Šค ๋‹จ๊ณ„, ์ฃผ๊ธฐ ๋“ฑ์„ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํŒ€์€ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ•˜๋Š”์ง€ ์—ฟ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

    React SSR ๊ทธ ๊ณ ํ†ต์˜ ๊ธฐ๋ก

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

    SSR์ด ์ดˆ๊ธฐ ํŽ˜์ด์ง€ ๋ Œ๋”๋ง ์†๋„ ํ–ฅ์ƒ๊ณผ SEO๋ฅผ ์œ„ํ•ด ๊ผญ ์ ์šฉํ•ด์•ผ ํ•˜๋Š” ํ…Œํฌ๋‹‰์ฒ˜๋Ÿผ ์ธ์‹๋˜๊ณ  ์žˆ์ง€๋งŒ, ๋ฌด์กฐ๊ฑด ์ ์šฉํ•˜๋ฉด ์ข‹๋‹ค๋Š” ์‹์˜ ์ ‘๊ทผ๋ณด๋‹ค๋Š” ๊ท ํ˜• ์žกํžŒ ์ ‘๊ทผ์ด ํ•„์š”ํ•จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

    ํŠœํ† ๋ฆฌ์–ผ

    Web Development for Beginners - A Curriculum

    MS์—์„œ 12์ฃผ, 24๊ฐœ์˜ ๊ฐ•์ขŒ๋กœ ์ด๋ฃจ์–ด์ง„ JS, CSS, HTML ๊ธฐ์ดˆ ์ˆ˜์—…์„ ๊ณต๊ฐœํ–ˆ๋‹ค. ๊ฐ ๊ฐ•์ขŒ๋งˆ๋‹ค ํ€ด์ฆˆ์™€ ๊ณผ์ œ, ๋น„๋””์˜ค ๋“ฑ์ด ํฌํ•จ๋˜์–ด ์žˆ์–ด ํ•™์Šต์„ ๋•๋Š”๋‹ค.

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

    aleph

    Next.js ์˜๊ฐ์„ ๋ฐ›์€ Deno ๋Ÿฐํƒ€์ž„์„ ์œ„ํ•œ React ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, ๊ธฐ๋ณธ์ ์œผ๋กœ ESM import ๋ฌธ๋ฒ• ์ง€์›์„ ํ†ตํ•ด Next.js์™€๋Š” ๋‹ค๋ฅด๊ฒŒ Webpack ๋˜๋Š” ๊ทธ ์™ธ ๋‹ค๋ฅธ ๋ฒˆ๋“ค๋Ÿฌ์˜ ์‚ฌ์šฉ์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค.

    SvgPathEditor

    ์˜จ๋ผ์ธ SVG path ์—๋””ํ„ฐ๋กœ, path ๊ฐ’๋งŒ ๋„ฃ์œผ๋ฉด ๋ฐ”๋กœ ์‹œ๊ฐํ™”๋œ ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ๊ณ  ์ง์ ‘ ํŽธ์ง‘์ ๋“ค์„ ์กฐ์ž‘ํ•ด ์›ํ•˜๋Š” ํ˜•ํƒœ๋กœ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

    spacetime

    15kb (gizipped) ํฌ๊ธฐ๋ฅผ ๊ฐ–๋Š” ์•„์ฃผ ๊ฒฝ๋Ÿ‰ํ™”๋œ(moment-timezone์€ 98kb) timezone ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, moment์™€ ์œ ์‚ฌํ•œ API๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

    let s = new spacetime('January 5 2018', 'Africa/Djibouti');
    
    s.date() // 5
    s.isAsleep() // true
    s.time() // '2:30pm'
    

    Operator Lookup

    JavaScript์˜ ๋‹ค์–‘ํ•œ ์—ฐ์‚ฐ์ž๋“ค์˜ ์‚ฌ์šฉ๋ฒ•๊ณผ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ๊ฒ€์ƒ‰ํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

    faker.js

    ๋”๋ฏธ ๋ฐ์ดํ„ฐ(fake data)๋ฅผ ์ƒ์„ฑํ•ด ์ฃผ๋Š” JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. address, commerce, company ๋“ฑ ๋งค์šฐ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ํ˜•์‹์„ ์ง€์›ํ•œ๋‹ค.

    ๋‹ค์Œ์€ Browser์™€ Node ํ™˜๊ฒฝ์—์„œ์˜ ์‚ฌ์šฉ ์˜ˆ์‹œ์ด๋‹ค:

    <script src = "faker.js" type = "text/javascript"></script>
    <script>
        var randomName = faker.name.findName(); // Caitlyn Kerluke
        var randomEmail = faker.internet.email(); // Rusty@arne.info
        var randomCard = faker.helpers.createCard(); // random contact card containing many properties
    </script>
    
    var faker = require('faker');
    
    var randomName = faker.name.findName(); // Rowan Nikolaus
    var randomEmail = faker.internet.email(); // Kassandra.Haley@erich.biz
    var randomCard = faker.helpers.createCard(); // random contact card containing many properties
    

    [์ฐธ๊ณ ] ํ”„๋กœ์ ํŠธ์˜ ๋†’์€ ์ธ๊ธฐ๋„์™€๋Š” ์ƒ๊ด€์—†์ด ์› ๊ฐœ๋ฐœ์ž๋Š” ํ”„๋กœ์ ํŠธ ๋ฉ”์ธํ„ฐ๋„Œ์Šค๋ฅผ ์œ„ํ•œ ์–ด๋ ค์›€์„ ๊ฒช๊ณ  ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ, ์ตœ๊ทผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์„ ์›ํ•˜๋Š” ๊ธฐ์—…๋“ค์€ ๋น„์šฉ์„ ์ง€๋ถˆํ•˜๊ฑฐ๋‚˜ ํฌํฌ ํ•˜๋ผ๊ณ  ์„ ์–ธํ•˜๊ธฐ๋„ ํ–ˆ๋‹ค.

    jsdiff

    ๋ฌธ์ž์—ด ๋น„๊ต(diff) Javascript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ„๋‹จํ•œ ๋กœ์ง์œผ๋กœ ๋ฌธ์ž์—ด ๋น„๊ต ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค:

    require('colors');
    const Diff = require('diff');
    
    const one = 'beep boop';
    const other = 'beep boob blah';
    
    const diff = Diff.diffChars(one, other);
    
    diff.forEach((part) => {
      // green for additions, red for deletions
      // grey for common parts
      const color = part.added ? 'green' :
        part.removed ? 'red' : 'grey';
      process.stderr.write(part.value[color]);
    });
    
    console.log();