2022-06 
๋งํฌ & ์ฝ์๊ฑฐ๋ฆฌ
Web at IO 2022
๊ตฌ๊ธ์ ๊ฐ๋ฐ์ ์ฐ๋ก ํ์ฌ์ธ Google I/O 2022๊ฐ ์ง๋ 5์ 11~12์ผ ์งํ๋์์ผ๋ฉฐ, Web at IO 2022๋ ์ด๋ค ์ค 23๊ฐ์ ์น ์ธ์ ๋ค์ ๋ํ ์ฌ์ ๋ชฉ๋ก์ด๋ค. ์น ํ๋ซํผ, ๊ฐ๋ฐ์ ๋๊ตฌ, ๋ฐ์ํ ํ์ด์ง์ ํ์ฃผ์, ์ฑ๋ฅ, PWA ๋ฑ ๋ค์ฑ๋ก์ด ์๋ก์ด ์์๋ค๋ก ๊ฐ๋ ์ฐจ ์๋ค. ์น์ ์ต์ ๋ํฅ์ ์๊ณ ์ถ๋ค๋ฉด ์ดํด๋ณด๊ธฐ๋ฅผ ์ถ์ฒํ๋ค.
[์ฐธ๊ณ ] ์ฌ์ ๋ชฉ๋ก์๋ ํฌํจ๋์ด ์์ง ์์ง๋ง, ์ด์ด์ State of CSS๋ ํจ๊ป ์ดํด๋ณด๋ฉด ์ข๋ค.
Meta Open Source is transferring Jest to the OpenJS Foundation
์ง๋ FE News '22/3์ ์์์ ํตํด์ ์๋ ๊ฐ Jest์ ๊ธฐ์ฌํ๋ ๋ฉํ ์์ ๊ฐ๋ฐ์๋ค์ด ์์๋ค๋ ์์์ ๊ณต์ ํ ๋ฐ ์์๋๋ฐ, ๊ทธ ์์์ ์ด์ด ์ง๋ 5์ 11์ผ, Meta๋ Jest ํ๋ก์ ํธ๋ฅผ OpenJS ์ฌ๋จ์ผ๋ก ์ด๊ด์ ์งํํ๋ค๋ ์์์ ๋ฐํํ๋ค.
Jest์ ๊ฐ๋ฐ์ ๊ธฐ์กด๊ณผ ๊ฐ์ด ํ์ฌ์ ์ฝ์ด ํ์ ์ํด ๋ฆฌ๋ฉ ๋๋ฉฐ, ์ด๊ด์ ๋ฐ๋ผ ํฌ๊ฒ ๋ฌ๋ผ์ง๋ ๊ฒ์ ์์ ๊ฒ์ด๋ผ๊ณ ๋ฐํ๋ค. ํฅํ ๋ช ๋ฌ๊ฐ Jest์ ์์ฐ(๋๋ฉ์ธ, ์ ์ฅ์, ์น์ฌ์ดํธ ๋ฑ)์ด ์ด๊ด๋๋ฉฐ, ์ด๊ด์ ๋ฐ๋ฅธ ์๋ก์ด ์ ์ฑ ๋ฑ์ ์๋ฆฝํ ๊ณํ์์ ๋ฐํ๊ณ ์๋ค.
New from Anaconda: Python in the Browser
Anaconda๊ฐ PyCon US 2022์์ PyScript ํ๋ก์ ํธ๋ฅผ ๋ฐํํ์๋ค.
PyScript๋ Python ์ ํ๋ฆฌ์ผ์ด์ ์ ์น์์ ์คํํ ์ ์๋๋ก ํด์ฃผ๋ ํ๋ ์์ํฌ์ด๋ค. JS์์ Python, Python์์ JS๋ก ์๋ฐฉํฅ ์ปค๋ฎค๋์ผ์ด์ ์ด ๊ฐ๋ฅํ๋ค๊ณ ํ๋ค. ์ฆ, Python์ด DOM์ ์ฐธ์กฐํ๋ ๊ฒ ๋ฑ์ด ๊ฐ๋ฅํ๋ค.
๋ค์์ ๊ฐ๋จํ Pi ๊ฐ์ ๊ณ์ฐํด ํ๋ฉด์ ์ถ๋ ฅํ๋ ์์์ด๋ค:
<html>
<head>
<link rel="stylesheet" href="https://pyscript.net/alpha/pyscript.css" />
<script defer src="https://pyscript.net/alpha/pyscript.js"></script>
</head>
<body>
<py-script>
print("Let's compute ฯ:")
def compute_pi(n):
pi = 2
for i in range(1,n):
pi *= 4 * i ** 2 / (4 * i ** 2 - 1)
return pi
pi = compute_pi(100000)
s = f"ฯ is approximately {pi:.3f}"
print(s)
</py-script>
</body>
</html>
๋ ๋ง์ ์์๋ https://pyscript.net/examples/ ์์ ํ์ธํ ์ ์๋ค.
React may be getting a new hook โ useEvent
์ง๋ 5์ 4์ผ, useEvent
๋ก ๋ช
๋ช
๋ ์๋ก์ด ํ
์ ๋ํ ์ ์์ด RFC๋ก ์ ์ถ๋์์ผ๋ฉฐ, ํญ์ ์์ ์ (always-stable)์ธ ํจ์ ์์ด๋ดํฐํฐ๋ฅผ ๊ฐ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ ์ํ ์ ์๊ฒ ํ๋ค.
// ์ด๋ฒคํธ ํธ๋ค๋ฌ์์ state/props๋ฅผ ์ฝ์ผ๋ฉด ์ต์ ํ๊ฐ ์ค๋จ๋๋ค.
function Chat() {
const [text, setText] = useState('');
// 1) ์ฌ๋ ๋๋ง์, ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ์์ด๋ดํฐํฐ๋ ๋งค๋ฒ ๋ฌ๋ผ์ง๋ค.
const onClick = () => {
sendMessage(text);
};
// 2) `text`์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด, ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ์์ด๋ดํฐํฐ๋ ๋ฌ๋ผ์ง๋ค.
const onClick = useCallback(() => {
sendMessage(text);
}, [text]);
return <SendButton onClick={onClick} />;
}
// useEvent Hook
function Chat() {
const [text, setText] = useState('');
// ํญ์ ๋์ผํ ํจ์๊ฐ ์ ๊ณต๋๋ค. (`text`๊ฐ ๋ณ๊ฒฝ๋์ด๋ ๊ทธ๋ฌํ๋ค)
const onClick = useEvent(() => {
sendMessage(text);
});
return <SendButton onClick={onClick} />;
}
How to use Decorators in JavaScript
๋ฐ์ฝ๋ ์ดํฐ(@
)๋ฅผ ์ ์ฉํ JavaScript ์ฝ๋๋ ์ด๋ ต์ง ์๊ฒ ์ฐพ์๋ณผ ์ ์๋ค. ํ์ง๋ง, ๋ณดํต์ ๋ฐ์ฝ๋ ์ดํฐ ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค(e.g. core-decorators.js) ํน์ ํ๋ ์์ํฌ์ ๋ด์ฅ๋ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ๊ธฐ์ ์ง์ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๋ง๋ค์ด ๋ณธ ๊ฒฝํ์ ์๊ฐ๋ณด๋ค ํ์น ์์ ๊ฒ์ด๋ค.
๋ณธ ๊ธ์์๋ ๋ฐ์ฝ๋ ์ดํฐ์ ๋ํ ์ค๋ช ๋ถํฐ ์ด๋ป๊ฒ ์ง์ ๋ง๋ค ์ ์๋์ง ์ค๋ช ํ๋ค.
๋ค์์ ํ๋์ ์ฌํ ๋น์ ๋ง์์ฃผ๋ locked
๋ฐ์ฝ๋ ์ดํฐ ์์์ด๋ค:
function locked(target, key, descriptor) {
return {
...descriptor,
writable: false,
};
}
class Data {
@locked
password = 'mypwd';
}
์ฐธ๊ณ ๋ก, ํ์ฌ JavaScript์์ ๋ฐ์ฝ๋ ์ดํฐ ์ฌ์ฉ์ด ๊ฐ๋ฅํ ๊ฒ์ babel๊ณผ ๊ฐ์ transpiler์ ํ์ ๋น๋ ธ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ ๊ฒ์ด๋ค. ์ฆ, ํ์ฌ๋ก์๋ ํ์ค์ด ์๋๋ค.
์ต๊ทผ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ํ์ค์ผ๋ก ์ง์ ํ๊ณ ์ ํ๋ ํ๋ฌํฌ์ ์ด stage 3๊น์ง ์ฌ๋ผ์๋ค. ๋ณธ ๊ธ์ ํด๋น ํ๋ฌํฌ์ ๊ณผ ๋ค์ ๊ตฌํ์ ์ฐจ์ด๊ฐ ์์ ์ ์์ผ๋ ์ฐธ๊ณ ํ๊ธธ ๋ฐ๋๋ค.
Announcement: Passing the torch
Lerna ํ๋ก์ ํธ์ ๋ฆฌ๋ ์์ง๋์ด์ธ Daniel Stockman์ ํ๋ก์ ํธ ๊ณต์ง๋ฅผ ํตํด 5์ 5์ผ๋ถ๋ก ๋ฒ์์์ผ๋ก ์ธํด ๋ชจ๋ ์ฑ ์์์ ๋ฌผ๋ฌ๋ ๊ฒ์ด๋ผ๊ณ ๋ฐํ๋ค. ๊ทธ๋ฆฌ๊ณ ํ๋ก์ ํธ์ ์ค๋์ญ์ ๋ ๋ค๋ฅธ ์ ๋ช ํ ๋ชจ๋ ธ๋ ํฌ ๋๊ตฌ์ธ Nx์ ๊ฐ๋ฐ์ฌ์ด๊ธฐ๋ ํ Nrwl๋ก ์ด์ ํ๋ค๊ณ ๋ฐํ๋ค.
ํํ ๋ฆฌ์ผ
The DOM Challenge
Front-end ๋ฌธ์ ๋ก ์ด๋ฃจ์ด์ง ์ฑ๋ฆฐ์ง์ด๋ค. HTML + CSS + Vanilla JS๋ฅผ ์ด์ฉํด ํ์ด์ผ ํ๋ค. Front-end ๊ฐ๋ฐ์๋ผ๋ฉด ํ๋ฒ ๋์ ํด ๋ณด์๋ ์ข์ ๋ฏํ๋ค.
Web Audio Modem
Web Audio API๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ธ์ฝ๋ฉํ๊ณ ๋์ฝ๋ฉ ํด, ๊ฒฐ๊ณผ์ ์ผ๋ก ์๊ทธ๋์ ํตํ ๋ฐ์ดํฐ ์ ์ก์ด ๊ฐ๋ฅํ ๋ชจ๋์ ๊ตฌํ ๋ฐฉ๋ฒ์ ์๊ฐํ๋ค.
์ ์๋ ์ธํฐ๋ท์ ์ฌ์ฉํ ์ ์๋ ์ ๋ฌด ํ๊ฒฝ์์ ๋ฐ์ดํฐ๋ฅผ ์์ฝ๊ฒ ์ ์กํ ์ ์๋ ๋ฐฉ๋ฒ์ ๊ณ ์ํ๊ธฐ ์ํด ๋ง๋ค๊ฒ ๋์์ผ๋ฉฐ, ๋ฐ์ดํฐ ์ธ์ฝ๋ฉ์ Web Audio API์ OscillatorNode๋ฅผ ํตํด, ๊ทธ๋ฆฌ๊ณ ๋์ฝ๋ฉ AnalyserNode๋ฅผ ํ์ฉํด ๊ตฌํ๋์๋ค.
๋ชจ๋ JavaScript ํํ ๋ฆฌ์ผ
๋ชจ๋ JavaScript(ES6 ์ดํ)๋ฅผ ๋ฐฐ์ฐ๊ณ ์ถ๋ค๋ฉด ์ด ์ฌ์ดํธ๋ฅผ ์ถ์ฒํ๋ค. ์ฒด๊ณ์ ์ผ๋ก ๋ถ๋ฅ๋์ด ์์ผ๋ฉฐ, ํ๊ธํ๋ ์ ๋์ด ์์ด ๋ฐ๋ผ ํ๋ฉด์ ์ดํดํ๊ธฐ ์ฝ๋ค.
nodejs.dev Learn
OpenJS ์ฌ๋จ์์ ์ง์ ์ด์ํ๊ณ ์๋ nodejs ํํ ๋ฆฌ์ผ ์ฌ์ดํธ์ด๋ค. nodejs์ ๋ค์ํ ๊ธฐ๋ฅ๋ค์ ๋ํด ์ฝ๊ฒ ๋ฐ๋ผ๊ฐ ์ ์๋๋ก ์ ๊ตฌ์ฑ๋์ด ์๋ค.
Building an Animated Piano Keyboard with JavaScript and MIDI
์ด ๊ธ์์๋ ์ฌ์ฆ ํผ์๋ ธ ํํ ๋ฆฌ์ผ ์ฌ์ดํธ์์ JavaScript์ MIDI๋ก ํผ์๋ ธ ์ ๋๋ฉ์ด์ ์ ๊ฐ๋ฐํ ๋ฐฉ๋ฒ์ ์๊ฐํ๋ค.
ํผ์๋ ธ ํค๋ณด๋๋ฅผ ๊ทธ๋ฆฌ๋ ๋ฐ์๋ SVG๋ฅผ ์ฌ์ฉํ๊ณ , MIDI๋ฅผ JSON ํ์์ผ๋ก ๋ฐ๊พธ๋ ๋ถ๋ถ์ ๋ธ๋ผ์ฐ์ ์์ ์ธํฐ๋ํฐ๋ธํ ์์ ์ ๋ง๋ค ์ ์๋ ์น ์ค๋์ค ํ๋ ์์ํฌ์ธ Tone.js๋ฅผ ์ฌ์ฉํ์ผ๋ฉฐ, ์ค๋์ค๋ฅผ ๋ค๋ฃจ๋ ๋ถ๋ถ์ Howler.js๋ฅผ ์ฌ์ฉํ๋ค๊ณ ํ๋ค.
ํด๋น CodeSandbox์์ ๋ฐ๋ชจ์ ์ฝ๋๋ฅผ ๋ณผ ์ ์๋ค.
์ฝ๋์ ๋๊ตฌ
wireit
NPM ์คํฌ๋ฆฝํธ๋ฅผ ๋ ์ค๋งํธํ๊ณ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก ํด์ฃผ๋ ํด์ด๋ค.
๋์ ๋๋ ํน์ง์ผ๋ก๋ Cross-package dependencies, Parallelism, Incremental build ๋ฑ์ด ์๋ค.
package.json์ ์คํฌ๋ฆฝํธ๋ฅผ ์กฐ๊ธ๋ง ์์ ํ๋ฉด ๊ธฐ์กด npm run
์ปค๋งจ๋๋ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์๋ค.
TypeScript Error Translator
TypeScript ์๋ฌ๋ฅผ ์ฌ๋์ด ์ฝ๊ธฐ ์ฌ์ด ๋ฌธ์ฅ์ผ๋ก ๋ฐ๊พธ์ด ์ฃผ๋ VSCode extension์ด๋ค.
lexical
Meta์์ ์๋ก ๋ง๋ ํ ์คํธ ์๋ํฐ์ด๋ค. ์ด์ ์ React๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์๋ ์๋ํฐ Draft.js์ ๋ฌ๋ฆฌ, ๋ฐ๋๋ผ JS๋ก ๋ง๋ค์๋ค.
design-resources-for-developers
๊ฐ๋ฐ์๋ฅผ ์ํ UI, ๋์์ธ ๋ฆฌ์์ค๋ค์ ํ๋ ์ด์ ํด ๋ Github ์ ์ฅ์์ด๋ค. ํฐํธ, ์์ด์ฝ, ์คํก ์ฌ์ง, ์น ํ ํ๋ฆฟ, CSS ํ๋ ์์ํฌ, ํฌ๋กฌ ์ต์คํ ์ ๋ฑ ๋ง์ ๋ฆฌ์์ค๋ฅผ ์ฐพ์๋ณผ ์ ์๋ค.
Stacks
๊ฐ๋ฐ์๋ผ๋ฉด ๋๊ตฌ๋ ์๊ณ ์๋ ์คํ์ค๋ฒํ๋ก์ฐ์ ๋์์ธ ์์คํ ์ด๋ค.