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 ์คํฌ๋ฆฝํธ ์ฝ๋๋ก ๋ง๋ค์ด ์ค๋ค.
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์ ๊ฐ๋ฐ์ด ์๋ฃ๋์ง ์์ ์ํฉ์์ ๊ฐ๋ฐ ์์ ์ ์งํํ ์ ์๋๋ก ๋์์ค๋ค.