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();