2024-03 
๐ ๋งํฌ & ์ฝ์ ๊ฑฐ๋ฆฌ
Itโs Official, Apple Kills Web Apps in the EU
์ผ๋ถ ๊ฐ๋ฐ์๋ค์ iOS 17.4 ๋ฒ ํ๋ฒ์ ๋ถํฐ ์น์ฑ(PWA) ์ค์น๊ฐ ์ ๋๋ก ์ด๋ค์ง์ง ์๋ ๋ฒ๊ทธ์ ๋ํ ๋ฆฌํฌํ ์ ํ๊ธฐ ์์ํ์ผ๋, ์ด๋ ์ค์ ๋ก ๋ฒ๊ทธ๊ฐ ์๋ 24/3์๋ถํฐ ์ํ๋๋ EU ๋์งํธ์์ฅ๋ฒ(DMA)์ ๋ฐ๋ฅธ ์ ํ์ ์๋์ ๊ธฐ๋ฅ์ ์ ํ์ผ๋ก ํ์ธ๋์๋ค.
[์ฐธ๊ณ ] ์ ํ์ ์กฐ์น์ ๋ํ ์ค๋ช ์์ฝ
- Why donโt users in the EU have access to Home Screen web apps? (
ORIGINAL
ํ๊ธฐ ํญ๋ชฉ์ ๋ ธํธ ์ฐธ๊ณ )๊ฐ๋ตํ๊ฒ ์์ฝํ๋ฉด, PWA์ ์์คํ ๊ธฐ๋ฅ(์นด๋ฉ๋ผ, ๋ง์ดํฌ ๋ฑ) ์ ๊ทผ๊ณผ ์ง์์ ์ง์ ๊ตฌ์ถ๋ iOS์ WebKit์ ๋ณด์ ์ํคํ ์ฒ๋ฅผ ํตํด ์ด๋ค์ ธ์์ผ๋, DMA์ ๋์ฒด ๋ธ๋ผ์ฐ์ ์์ง ํ์ฉ ๋ฑ์ ๊ธฐ์ค์ ๋ง์ถ๊ธฐ ์ํด ์๋ก์ด ์ํคํ ์ฒ ๊ตฌ์ถ์ด ํ์ํด์ก๋ค. ๊ทธ๋ฌ๋ HSW์ ๋ฎ์ ์ฑํ๋ฅ ์ ํฌํจ, ์ด๋ ํ์ค์ ์ผ๋ก ์ด๋ ต๊ธฐ ๋๋ฌธ์ ์ง์์ ์ค๋จํ๋ค๊ณ ๋ฐํ๋ค.
์ดํ, ์ ํ์ ์กฐ์น์ ๋ํ ์จ๋ผ์ธ ์ฒญ์์ด ์งํ๋์๊ณ , EU ๋ํ ๊ด๋ จ ์กฐ์น์ ๋ํ ์ถ๊ฐ ์กฐ์ฌ๋ฅผ ์งํํ๊ณ ์๋ค๋ ์์์ด ์ ํด์ง๊ธฐ๋ ํ์๋ค.
์ฌ๋ฌ ์ผ๋ จ์ ์ํฉ๋ค ๋๋ฌธ์ธ์ง๋ ์ ์ ์์ผ๋, ๊ฒฐ๊ตญ ์ ํ์ 3์ 1์ผ Home Screen web app ์ค์น ์ ํ ๊ฒฐ์ ์ ์ฒ ํํ๋ค๊ณ ๋ค์ ๊ณต์งํ๋ค.
- Why donโt users in the EU have access to Home Screen web apps? (
UPDATE
ํ๊ธฐ ํญ๋ชฉ์ ๋ ธํธ ์ฐธ๊ณ )
Interaction to Next Paint (INP)
INP๋ 3์ 12์ผ๋ถํฐ ์๋ก์ด Core Web Vitals ์ธก์ ์งํ๋ก ํฌํจ๋๋ฉฐ, ๊ธฐ์กด์ FID(First Input Delay)๋ฅผ ๋์ฒด(FID๋ ์ญ์ ๋ ์์ ) ํ๊ฒ ๋๋ค. ์ด๋ FID๊ฐ ํ๋ก๊ทธ๋จ์ ๋ฐ์์ฑ ์ธก๋ฉด์ ๋ํ๋ด์ง๋ง, ์น์์์ ์ํธ์์ฉ ์ธก๋ฉด์ ํฌ์ฐฉํ์ง๋ ๋ชปํ๊ธฐ ๋๋ฌธ์ด๋ค.
INP๋ ์ฌ์ฉ์๊ฐ ํ์ด์ง ๋ฐฉ๋ฌธ ์ ์ฒด ๊ธฐ๊ฐ์ ๋ฐ์ํ๋ ๋ชจ๋ ์ํธ์์ฉ์ ์ง์ฐ ์๊ฐ์ ๊ด์ฐฐํ๊ณ , ์ด์ ๋ํ ํ์ด์ง์ ์ ๋ฐ์ ์ธ ์๋ต์ฑ์ ํ๊ฐํ๋ ์ธก์ ํญ๋ชฉ์ด๋ค.
JSR
JSR์ Deno ํ์์ ์๋กญ๊ฒ ๊ณต๊ฐํ JavaScript/TypeScript ๋ ์ง์คํธ๋ฆฌ๋ค. npm์ ์ํผ ์ ์ผ๋ก npm ๋์ฒด์ ๊ฐ ์๋๋ฉฐ, JSR ๋ชจ๋์ ๋ชจ๋ ํจํค์ง ๋งค๋์ ์ ๊ธฐ์กด์ node_modules์ ์ค์น๋๋ ํ๋ก์ ํธ์ ํธํ๋๋ค.
๋ช ๊ฐ์ง ํน์ง๋ค์ ๋ค์๊ณผ ๊ฐ๋ค.
- ์ฌ์ฉ์ ์ ํฉ ๋ฒ์ ์ ๊ณต: JS ๋๋ TS ๋ง์ผ๋ก ์ด๋ค์ง ์์ค๊ฐ ํผ๋ธ๋ฆฌ์ฑ ๋๋๋ผ๋, JSR์ ์ฌ์ฉ์์๊ฒ ํ์ํ ์ฝ๋ ๋ฒ์ ์ ์ฌ์ฉํ๋๋ก ์ ๊ณต
- JS ํธ๋์คํ์ผ ๋ฐ Type Definition ์ ๊ณต:
- ์์ง ์ง์๋์ง ์์ง๋ง ์กฐ๋ง๊ฐ npm ์ํ๊ณ ๋์์ผ๋ก ์ ๊ณต์ด ๋ ๋, JSR์ ํธ๋์คํ์ผ๋ JavaScript ์ฝ๋์ Type Definition์ ์๋์ผ๋ก ์ ๊ณต
- ๋ฐํ์ ์ธ์์ฑ:
- ํจํค์ง ๊ฐ๋ฐ์๊ฐ ๋จ์ผ ๋ฒ์ ์ ํผ๋ธ๋ฆฌ์ฑ ํ๋๋ผ๋, ๋์ ๋ฐํ์์ ๋ง๋ ๋ฒ์ ์ ์ ๊ณต
- ์๋ ๋ฌธ์ ์์ฑ: ํผ๋ธ๋ฆฌ์ฑ ๋ ์ฝ๋๋ฅผ ํตํด ์๋ฒฝํ๊ฒ ๋ฌธ์ํ๋ฅผ ์๋์ผ๋ก ์ ๊ณต
[์ฐธ๊ณ ]
Introducing SafeTest: A Novel Approach to Front End Testing
๋ทํ๋ฆญ์ค๋ E2E ํ ์คํธ ์๋ฃจ์ ์ ์ํด Playwright, Jest/Vitest ๋ฐ React๋ฅผ ๊ฒฐํฉํ ์๋ก์ด UI ํ ์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ SafeTest๋ฅผ ๊ณต๊ฐํ๋ค. ์ฌ๋ฌ UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ํ ์คํธ ์คํ๊ธฐ์ ํจ๊ป ์๋ํ๋ฉฐ ๊ฐ๋ ฅํ ๋ณด๊ณ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค๊ณ ํ๋ค. ์ด SafeTest๋ ๋ทํ๋ฆญ์ค์์ ์ด๋ฏธ ์ฌ์ฉ ์ค์ด๋ฉฐ ๋จ์ ํ ์คํธ์ E2E ํ ์คํธ์ ์ฅ์ ์ ๊ฒฐํฉํ์ฌ ํ ์คํธ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ํํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๊ณ ์๋ค๊ณ ํ๋ค.
Designing better target sizes
ํ๊ฒ ํฌ๊ธฐ(UI ์์ ๋ด์์ ํด๋ฆญ, ํฐ์น, ํญ ๋ฒ์)๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ง์ ์ ์ผ๋ก ์ํฅ์ ์ฃผ๊ธฐ ๋๋ฌธ์ UI/UX ๋์์ธ์์๋ ์ค์ํ ์์ ์ค ํ๋์ด๋ค. ์ด ๊ธ์์๋ ํ๊ฒ์ Fitts์ ๋ฒ์น์ ์ ์ฉํ๊ณ , ์ ์ ํ ์ฃผ์ ๊ณต๊ฐ์ ํ๋ณดํ๊ณ , ์๊ฐ์ ์ธ ํผ๋๋ฐฑ์ ์ ๊ณตํ๋ฉด์ ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ฃผ๋ ๋ฐฉ๋ฒ์ ๋ํด ์๊ฐํ๊ณ ์๋ค.
100 Unique Website Footer Design Inspirations
Footer ๋์์ธ์ ์๊ฐ์ ์ฃผ๋ 100๊ฐ์ง ์ฌ์ดํธ๋ฅผ ์๊ฐํ๋ค.
Chromium. Web page rendering using Blink, CC and scheduler
Chromium ์์ง ์ ์๋ง์ ๋ด๋ถ ๋ฉ์ปค๋์ฆ, ์๋ธ์์คํ ๋ฐ ๊ธฐํ ์์ง๋ค๋ก ๊ตฌ์ฑ๋๋ค.
์ด ๊ธ์์๋ ์น ํ์ด์ง๋ฅผ ํ๋ฉด์ ์ง์ ๊ตฌ์ฑํ๊ณ ๋ ๋๋ง ํ๋ ๊ณผ์ ์ ์ดํด๋ณด๋ฉฐ, Blink ์์ง, Chorme Composer(CC, ๋๋ ์ฝํ ์ธ ์กฐํฉ์), ์์ ์ค์ผ์ค๋ฌ์ ๋์์ ๋ค๋ฃฌ๋ค.
React Will Be Compiled
React๋ฅผ ์ฌ์ฉํด ๋ณธ ์ฌ๋์ด๋ผ๋ฉด useMemo
, useCallback
๋ฑ์ memoization hooks์ ์ค์์ฑ์ ๋ํด ์ ์ ๊ฒ์ด๋ค. ์ด๋ฅผ ์ ์ ํ ์ฌ์ฉํด์ผ ์์น ์๋ rendering์ ํผํด ์ฑ๋ฅ ๋์๋ฅผ ๋ง์ ์ ์๋ค.
ํ์ง๋ง React ์
๋ฌธ์๋ค์ ์ด๋ ๊ฒฝ์ฐ์ useMemo
, useCallback
์ ์ ์ฉํด์ผ ํ๋์ง ํท๊ฐ๋ ค ํ๊ธฐ๋ ํ๋ค.
React ํ์์ Compiler๋ฅผ ๋ง๋ค๊ณ ์๋ค๊ณ ํ๋ค. useMemo
, useCallback
๋ฑ์ ์ฑ๋ฅ ์ต์ ํ ์์
์ React Compiler๊ฐ ์ปดํ์ผ ๋จ๊ณ์์ ์๋์ผ๋ก ์ฒ๋ฆฌํ ์์ ์ด๋ผ๊ณ ํ๋ค.
Frontend Application Security: Tips and Tricks
ํ๋ฐํธ์๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ํ ๋ณด์์ด ์ค์ํ๋ค.
ํ๋ฐํธ์๋ ๋ณด์๊ณผ ๊ด๋ จ๋ ์๋ง์ ๋ฌธ์ ๊ฐ ์์ง๋ง, ์ด ๊ธ์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ 6๊ฐ์ ๋ฌธ์ ๋ฅผ ์ ์ํ๊ณ ์ด๋ค ์์ผ๋ก ๋ณด์ ์ทจ์ฝ์ ์ด ๋ฐ์ํ๋์ง ์ค๋ช ํ๋ค.
๋ณด์ ์ทจ์ฝ์ ์ด ์ ๋ฐ์ํ๋์ง ์์ธ์ ์ดํดํ๊ณ ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํ ํ๊ณผ ์๋ น์ ๋ํด ์ดํด๋ณด์.
8 repos used by the top 1% of React devs

React ๊ฐ๋ฐ์ ์ค ์์ 1%๊ฐ GitHub star๋ฅผ ๋๋ฅธ ์ ์ฅ์๋ ๋ฌด์์ผ๊น? ์คํ์์ค ๊ธฐ์ฌ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ 1%์ ๊ฐ๋ฐ์๊ฐ ์ ์ฅ์์ star๋ฅผ ํ์ํ ๊ฐ๋ฅ์ฑ๊ณผ ํ์ 50%์ ๊ฐ๋ฐ์๊ฐ star๋ฅผ ํ์ํ์ง ์์ ๊ฐ๋ฅ์ฑ์ ๋น๊ตํด์ ์ถ๋ ธ๋ค๊ณ ํ๋ค. JSX์์ ์คํ์ผ์ ๊ฐํธํ๊ฒ ํด์ฃผ๋ jsxstyle/jsxstyle, ์ฝ๋ ํ์ด๋ผ์ดํ ์ ๋์์ฃผ๋ wooorm/refractor, Jest์์ snapshot diff๋ฅผ ์ฃผ๋ jest-community/snapshot-diff ๋ฑ์ ์ดํด๋ณผ ์ ์๋ค.
๐น ํํ ๋ฆฌ์ผ
Syntax Highlighting code snippets with Prism and the Custom Highlight API
์ผ๋ฐ์ ์ผ๋ก ๋ฌธ๋ฒ ๊ฐ์กฐ(Syntax Highliter)๋ฅผ ์ ์ฉํ๋ ค๋ฉด, ๊ฐ ํ ํฐ๋ค์ <span>
์์๋ก ๊ฐ์ผ ํ ํ ํฐ ์ ํ์ ๋ฐ๋ผ
์ ์ ํ ์คํ์ผ(ํด๋์ค๋ ์์ ๋ฑ)์ ์ ์ฉํ๊ฒ ๋๋ค.
CSS Custom Highlight API์ ํ ํฐํ๋ฅผ
์ํ Prism.js๋ฅผ ์ฌ์ฉํ๋ฉด ์คํ์ผ๋ง์ ์ํด DOM ํธ๋ฆฌ๋ฅผ ์ฌ๋ฌ ๊ฐ์ <span>
์ผ๋ก ๋ค์๋ ๋จ๊ณ๋ฅผ ๊ฑด๋๋ธ ์ ์๋ค.
The New CSS Math: pow(), sqrt(), and exponential friends
CSS๋ calc()๊ณผ ๊ฐ์ ๊ธฐ์กด ํจ์๋ค์ ๋ณด์ํ๊ธฐ ์ํด ๋ง์ ์๋ก์ด Math ํจ์๋ค์ด ์ถ๊ฐ๋์๋ค. ์ด ํจ์๋ค์ ๋ชจ๋ ๊ถ๊ทน์ ์ผ๋ก ์ซ์ ๊ฐ์ ๋ํ๋ด์ง๋ง, ์๋ ๋ฐฉ์์ ๋์์ค๋ ๋ช ํํ์ง ์๋ค.
์ด ๊ธ์์๋ ๊ฐ๋จํ๊ฒ ๋ค์์ Math ํจ์๋ค์ ์๊ฐํ๊ณ ์์ ๋ฅผ ์ ๊ณตํ๋ค. ํ์์ ์์ ๋ชจ๋ ๋ชจ๋ ๋ธ๋ผ์ฐ์ ๋ค์์ ๋ฐ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
- pow(): baseย ์ย exponent๋ฅผ ์ ๊ณฑํ ๊ฐ์ ๋ฐํ
- sqrt(): ์ซ์์ ์ ๊ณฑ๊ทผ์ ๋ฐํ
- exp(): x๋ฅผ ์ธ์๋ก ํ๋ย e^xย ๊ฐ์ ๋ฐํ
- log(): ์์ฐ ๋ก๊ฐ๋ฆฌ์ฆ์ (eย ๋ฅผ ๊ธฐ์ด) ์ ์๋ฅผ ๊ณ์ฐ
- hypot(): ์ ๊ณฑํฉ์ ์ ๊ณฑ๊ทผ์ ๋ฐํ
line-height: pow(3, 2); /* 3 * 3 = 9 */
line-height: sqrt(9); /* 3 */
width: calc(100px * exp(1)); /* 100px * 2.718281828459045 = 217px */
width: calc(100px * log(7.389)); /* 200px */
width: hypot(30px, 40px); /* 50px */
๐ฆ ์ฝ๋์ ๋๊ตฌ
htmz
htmz๋ ๋ฏธ๋๋ฉ HTML ๋ง์ดํฌ๋ก ํ๋ ์์ํฌ๋ก ์ด๋ ํ ์์กด์ฑ ์์ด ํ๋ ์ธ HTML๋ง์ ์ฌ์ฉํด ํ์ด์ง ๋ด ์์์ ๋ค๋ฅธ HTML์ ๋ก๋ฉํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
- ์ด๋ป๊ฒ ๋์ํ๋?
htmz๋ ์ฌ์ค, htmz ์ด๋ฆ์ ๊ฐ๋
<iframe>
์ผ๋ก,<iframe>
์ ํตํด ๋ฆฌ์์ค๋ฅผ ์์ฒญํ๊ณ ๋ก๋ฉ์ด ์๋ฃ๋๋ฉด onload ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ํตํด ๊ฒฐ๊ด๊ฐ์ ์ง์ ํ ์์์ ์ฝ์ ํ๋ค.
<!-- 1. htmz ๊ตฌ์ฑ -->
<iframe
hidden
name="htmz"
onload="setTimeout(()=>document.querySelector(contentWindow.location.hash||null)?.replaceWith(...contentDocument.body.childNodes))"></iframe>
<!-- 2. GET /flower.html ๋ฅผ #my-element ์ ์ฝ์
--->
<a href="/flower.html#my-element" target="htmz">Flower</a>
openv0
openv0์ ์์ฑํ UI ์ปดํฌ๋ํธ ํ๋ ์์ํฌ๋ก, ํ๋กฌํํธ(๋ฐ๋ณต์ ์ธ)๋ฅผ ํตํด UI ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๋ฉฐ, ๋ผ์ด๋ธ ํ๋ฆฌ๋ทฐ๋ ์ ๊ณต๋๋ค.
{JSON} Placeholder
ํ๋กํ ํ์ ๋๋ ๊ฐ๋ฐ ํ ์คํธ๋ฅผ ์ํ ํ์ดํฌ JSON API๋ฅผ ์ ๊ณตํ๋ค. 6๊ฐ ์ ํ์ ๋ฆฌ์์ค๋ฅผ ์ ๊ณตํ๋ฉฐ, CRUD ํ ์คํธ๋ฅผ ์ํ ๋ชจ๋ HTTP ๋ฉ์๋๋ฅผ ์ง์ํ๋ค.
// ์ฌ์ฉ ์
fetch('https://jsonplaceholder.typicode.com/todos/1')
.then((response) => response.json())
.then((json) => console.log(json));
PGLite
import { PGlite } from '@electric-sql/pglite';
const db = new PGlite();
await db.query("select 'Hello world' as message;");
๋ธ๋ผ์ฐ์ , Node.js ๋ฐ Bun์์ Postgres๋ฅผ ์คํํ ์ ์๊ฒ ํด์ฃผ๋ TypeScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
๊ธฐ์กด์ ๋ธ๋ผ์ฐ์ ์์ ์คํ๋๋ Postgres ํ๋ก์ ํธ๋ค๊ณผ ๋ค๋ฅด๊ฒ, ๊ฐ์ ๋ฆฌ๋ ์ค ๋จธ์ ์ ์ฌ์ฉํ์ง ์๋ "Postgres in WASM"์ด๋ค.
๊ธฐํ ์ข ์์ฑ์ด ์์ผ๋ฉฐ, ์ฉ๋์ 3.7Mb(gzipped)๋ก ๋ถ๋ด์ค๋ฌ์ธ ์ ์๋ ํฌ๊ธฐ์ด๋ค.
jQuery 4.0.0 beta
์ค๋ซ๋์ ์์ ํ jQuery 4.0.0์ ๋ฒ ํ๋ฒ์ ์ด ๊ณต๊ฐ๋์๋ค.
์ฃผ์ ๋ณ๊ฒฝ์ฌํญ์ผ๋ก๋
- IE 10 ์ดํ ๋ธ๋ผ์ฐ์ ์ ๋ํ ์ง์์ด ์ค๋จ
- ๊ตฌํ ๋ธ๋ผ์ฐ์ ์ง์ ์ค๋จ์ ๋ฐ๋ฅธ ๋ฒ๋ค ์ฌ์ด์ฆ ๊ฐ์
- Deprecated API๋ค์ ์ ๊ฑฐ
- array push/sort ๋ฑ Javascript์ ๊ธฐ๋ณธ์ ์ผ๋ก ํฌํจ๋ ๊ธฐ๋ฅ ์ ๊ฑฐ
- jQuery ์์ค์ฝ๋์ ESM ์ ํ
๋ฑ์ด ์๋ค.