2024-02 
๐ ๋งํฌ & ์ฝ์ ๊ฑฐ๋ฆฌ
The package that broke NPM (accidentally)
NPM ๋ ์ง์คํธ๋ฆฌ์ ๋ฑ๋ก๋ ๋ชจ๋ ํจํค์ง๋ค์ ํฌํจํ๋ ํจํค์ง๋ฅผ ๋ง๋ค๊ณ ๋ฐฐํฌํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
์ฝ 10๋ ์ , PatrckJS ๋๋ค์์ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์๋ โeverythingโ์ด๋ผ๋ ํจํค์ง๋ฅผ ๋ง๋ค๊ณ ๋ฐฐํฌํ์๋ค. ๊ทธ ๋น์ NPM ๋ ์ง์คํธ๋ฆฌ๋ ๋ฑ์ฅํ์ง 5๋ ์ ๋ ๋์๋ ์์ ์ด์๋ค.
์ด ๊ธ์ ํ์ฌ ์์ ์, ๋ชจ๋ ๋ ์ง์คํธ๋ฆฌ์ ๋ฑ๋ก๋ ๋ชจ๋ ํจํค์ง๋ค์ ๋ํ ์์กด์ฑ์ ๊ฐ๋ ๋จ์ผ ํจํค์ง๋ฅผ ๋ง๋ค๊ณ ๋ฐฐํฌํ๋ ๊ณผ์ ์ ๋ค๋ฃฌ๋ค.
๊ณผ์ ์ ํตํด ๋ช ๊ฐ์ง ๋ฐํ์ง ์ฌ์ค ์ค ํ๋๋, ๋จ์ผ NPM ํจํค์ง์์ ์์กด์ฑ์ ์ต๋ 800๊ฐ๊น์ง๋ผ๋ ์ ์ด๋ค. ์ฌ๋ฏธ์๋ ์๋์ ๊ทธ ๋ท์ด์ผ๊ธฐ๋ฅผ ์ฝ์ด๋ณผ ์ ์๋ค.
[์ฐธ๊ณ ] ๊ธ์์ ๋ฐฐํฌ๋ scoped ํจํค์ง๋ ๋ชจ๋ ์ญ์ ๋ ์ํ๋ค.
npm in Review: A 2023 Retrospective on Growth, Security, and Quirky Facts

ํจํค์ง ๊ด๋ฆฌ์์ธ npm์ 23๋ ์ ๋ณํ๋ค์ ๋๋์ ๋ณด๊ณ ์ ๋ฆฌํ ๊ธ๋ก, ์ํ๊ณ์ ์ฃผ์ ํธ๋ ๋ ๋ช ๊ฐ์ง์ ๋ฐ์ดํฐ์ ๊ธฐ๋ฐํด ์ด๋ป๊ฒ ์ฑ์ฅํ๋์ง ๋ค๋ฃฌ๋ค.
๋ํ ์ง๋ฉดํ๋ ๋ฉ์จ์ด์ ์คํธ ๋ฌธ์ , ๊ฐ์ฅ ๊ธด ์ด๋ฆ(ํจํค์ง ๋ช ์ผ๋ก๋ ์ต๋ 214์๊น์ง ํ์ฉ)์ ๊ฐ์ง ํจํค์ง๋ ๊ฐ์ฅ ํฐ ํฌ๊ธฐ(5.96GB)๋ฅผ ๊ฐ์ง ํจํค์ง์ ๊ฐ์ด ์๊ณ ์ถ์์ง๋ง ์์ง ๋ชปํ๋ ์ง๋ฌธ์ ๋ํ ๋ต์ ์ป์ ์ ์๋ค.
New client-side hooks coming to React 19
React 19 ๋ฒ์ ์ ํฌํจ๋ ์๋ก์ด hook๋ค์ ์๊ฐํ๋ค. React ๊ฐ๋ฐํ์ data fetching
๊ณผ form
๊ด๋ จํ ๊ธฐ์กด์ pain point๋ฅผ ๊ฐ์ ํ๋๋ฐ ์ง์คํ๋ค. ์๋ก์ด hook๋ค์ ๊ฐ๋ฐ์๋ค์ ์์ฐ์ฑ์ ํฅ์์์ผ์ค ๊ฒ์ด๋ค. React Canary์ Experimental Channels๋ฅผ ํตํด ๋ฏธ๋ฆฌ ๊ฒฝํํด ๋ณผ ์ ์๋ค.
19๋ฒ์ ์์ ์๋ก ํฌํจ๋ ํ ๋ค์ ์๋์ ๊ฐ๋ค.
- use(Promise)
- use(Context)
- useFormState()
- useFormStatus()
- useOptimistic()
2023 JavaScript Rising Stars
์๋ ํ ํด ๋์ ๊ฐ์ฅ ๋ง์ Github Star๋ฅผ ๋ฐ์ ํ๋ก์ ํธ๋ค์ด ์ ๋ฆฌ๋์ด ์๋ค. ํ ์คํ , ์คํ์ผ๋ง, ์ํ ๊ด๋ฆฌ ๋ฑ์ ๊ฐ ๋ถ๋ฌธ๋ณ ์์๋ ์ ๋ฆฌ๋์ด ์์ด์, 23๋ ์ ์ธ๊ธฐ ์คํ์์ค๋ฅผ ๋๋์๋ณด๊ธฐ ์ข์ ๊ธ์ด๋ค.
TL;DR
- ์ ์ฒด ํ๋ก์ ํธ ๋ถ๋ฌธ: shadcn/ui, bun, Excalidraw
- ํ ์คํ : Playwright, Storybook, puppeteer
- ์คํ์ผ๋ง: Stylex, unocss, tamagui
- ์ํ๊ด๋ฆฌ: Zustand, Jotai
์ซ์ 1์ ์ฌ๋ฐ๋ฅธ JSON ํ์์ธ๊ฐ?
// data.json
1
์ซ์ 1๋ง ๋ค์ด์๋ JSON ํ์ผ์ด ์๋ค๊ณ ์๊ฐํด ๋ณด์. ์ด JSON ํ์ผ์ ์ฌ๋ฐ๋ฅธ JSON ํ์์ผ๊น? ์ ๋ต์ "๊ทธ๋ ๋ค!"์ด๋ค.
ํด๋น ์คํ์ด ํ์ค JSON ์คํ์ด ๋๊ธฐ๊น์ง์ ๋ท์ด์ผ๊ธฐ๊ฐ ํฅ๋ฏธ๋กญ๋ค.
JSON's Numeric Boundaries: The Lesser-Known Reality of Inaccurate Figures
JSON์ ๋จ์์ฑ๊ณผ ๊ฐ๋ ์ฑ์ด๋ผ๋ ๋งค๋ ฅ ๋๋ถ์ ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค์ด ์ ํธํ๋ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ ๊ตํ, ํนํ ์น ์ ํ๋ฆฌ์ผ์ด์ ๋ถ์ผ์์ ์ด์์ด ๋์๋ค.
๊ทธ๋ฌ๋ ์ซ์๋ฅผ ๋ค๋ฃฐ ๋ JSON์ ์ ๊ทผ ๋ฐฉ์์ ์ฒ์์ ๋ณด์ด๋ ๊ฒ๋ณด๋ค ๋ค์ ๋ ๊ฐ๋จํ๋ค. ๋ค์ ์ฝ๋๋ ์ด๋ค ๊ฐ์ ์ถ๋ ฅํ ๊น?
const x = 9223372036854775807;
console.log(x);
์ด๋ชจ์ง์ ์ด๋ชจ์ ๋ชจ

์น์ ์ ์ํ๋ ๋งค์ผ, ์ด๋ชจ์ง(Emoji)๋ฅผ ๋ณด์ง ์๋ ๋ ์ด ์๋ค. ๊ทธ๋งํผ ์ด๋ชจ์ง๋ ์ํ์ ๊น์์ด ๋ค์ด์๋ค. ์ด๋ชจ์ง๋ ๋ค๋ฅธ ๋ฌธ์์ ๋ญ๊ฐ ๋ค๋ฅธ ๊ฑธ๊น? ์ด๋ป๊ฒ ํ์๋๋ ๊ฑธ๊น? ์ด๋ชจ์ง์ ๋ํ ๊ถ๊ธ์ฆ์ ํ์ด๋ณด์.
JS์ ์ฃผ์์ //๊ณผ /* */๋ฟ๋ง์ด ์๋๋ค

//์ /* */๋ก ๊ฐ๊ฐ ํ ์ค ์ฃผ์๊ณผ ์ฌ๋ฌ ์ค ์ฃผ์์ ๋ง๋ค ์ ์๋ค๋ ๊ฒ์ ๋ชจ๋ ์๊ณ ์์ ๊ฒ์ด๋ค.
ํ์ง๋ง ECMAScript ๋ช
์ธ์๋ #!
๋ก ์์ํ๋ Hashbang Comments์ HTML ์ฃผ์ ํ์์ธ <!--
์ -->
๋ก ๊ฐ์ธ๋ HTML-like Comments ๋ฑ ๋ค๋ฅธ ๊ฒ๋ ์ ์๋์ด ์๋ค๋ ์ฌ์ค๋ ์๊ณ ์๋๊ฐ?
์ด๋ค ์ด์ ์์ ์ด๋ฐ ๋ค์ํ ์ฃผ์ ํ์๋ค์ด ๋์ ๋์๋์ง, JavaScript๊ฐ ๊ฑธ์ด์จ ๊ธธ์ ๋ฐ๋ผ ๊ฑธ์ผ๋ฉฐ ํ์ธํด ๋ณด์.
์๋ฆ๋ค์ด ์ฝ๋์ ๋ํ์ฌ

๋์ฒด ์๋ฆ๋ค์ด ์ฝ๋๋ ๋์ฒด ๋ฌด์์ธ๊ฐ. ์ง์งํ๊ฒ ๊ฐ๋ฐ์๋ฅผ ์ ์ผ๋ก ์ผ๋ ์ฌ๋์ด๋ผ๋ฉด ํ ๋ฒ์ฏค ๊ณ ๋ฏผํด ๋ณธ ์ ์ด ์์ ๊ฒ์ด๋ค. ์ ๋ต์ด ์กด์ฌํ์ง ์๋ ๋ฌผ์์ ํ์๋ ์ฌํ์ฑ, ์ ๋ขฐ์ฑ, ์ ํ์ฑ, ์ ์ธ์ฑ์ ์ธก๋ฉด์์ ์๋ฆ๋ค์์ ๋ํ ์๊ฐ์ ํ์ด๋ธ๋ค.
์น ๊ฐ๋ฐ์ ๋ํด ์์ง๋์ด๋ค์ด ๋ฏฟ๋ ์ด์ํ ๊ฒ๋ค
Mozilla์์ ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ์ฐธ์ฌํ๋ ์ ์๊ฐ ์น ๊ฐ๋ฐ๋ก ๋์์จ ์ดํ ๋๋ผ๊ฒ ๋ ์ฌ๋ฌ ๊ฐ์ง ์น ๊ฐ๋ฐ์ ๋ํ ๋ช ๊ฐ์ง ๋๋ผ์ด ์ฃผ์ฅ๋ค
์ ๋ํด ์๊ฐํ๋ค. ์ ์ง ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์์ ์๊ฐ์ ํฅ๋ฏธ๋กญ๊ฒ ํ์ด ๋ด์ด ์ฌ๋ฏธ์๊ฒ ์ฝ์ ์ ์์ ๊ฒ์ด๋ค.
ํ๊ธ ๋ฒ์ญ: https://velog.io/@sehyunny/weired-things-engineers-believe
The Two Reacts
React ์ปค๋ฎค๋ํฐ์์ ํ๋ฐํ ํ๋์ ์ด์ด ๋๊ฐ๊ณ ์๋ Dan Abramov์ ๊ธ์ด๋ค.
Dan์ ํ์ฌ์ React๋ฅผ ์๋์ ๋ ๊ฐ์ง ๊ณต์์ผ๋ก ์๋ถํด์ ์ค๋ช ํ๋ค.
- UI = f(state), client component
- UI = f(data), server component
๋์ผ๋ก, UI = f(state, data)์ฒ๋ผ ํ๋์ ๊ณต์์ผ๋ก ํตํฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ๋ ์์๊ฒ ์ง๋ฌธ์ ๋์ง๋ฉฐ ๋ค์ ๊ธ์ ์๊ณ ํ๋ค.
React ์๋ฒ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ์ด์ ์ ๋ฐฉ๋ฒ
React ์๋ฒ ์ปดํฌ๋ํธ๊ฐ ์ ํ์ํ์ง, ์ด๋ค ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋์ง ์์๋ณธ๋ค.
Common mistakes with the Next.js App Router and how to fix them
Vercel์์ ์๋ฐฑ ๋ช ์ ๊ฐ๋ฐ์์ ์์ฒ ๊ฐ์ Next.js Repository ์ฌ๋ก๋ฅผ ์ข ํฉํ์ฌ Next.js App Router๋ฅผ ์ธ ๋ ํํ ์ ์ง๋ฅด๋ 10๊ฐ์ง ์ค์๋ฅผ ์ ๋ฆฌํ๋ค.
์ ์ด๋ฐ ์ค์๋ฅผ ํ๋์ง, ๋ชจ๋ฒ ์ฌ๋ก๋ ๋ฌด์์ธ์ง, ๊ทธ๋ฆฌ๊ณ App Router ํ ๋ช ๊ฐ์ง๋ฅผ ์๊ฐํ๋ค.
TL;DR
Using Route Handlers with Server Components
- ์๋ฒ ์ปดํฌ๋ํธ์์ ๋ผ์ฐํธ ํธ๋ค๋ฌ๋ฅผ ํธ์ถํ์ง ๋ง ๊ฒ
- ๋์ ๋ผ์ฐํธ ํธ๋ค๋ฌ ๋ด๋ถ์ ๋ฐฐ์นํ๋ ค๋ ๋ก์ง์ ์๋ฒ ์ปดํฌ๋ํธ์์ ์ง์ ํธ์ถํ๋ผ
Static or dynamic Route Handlers
- ๋ผ์ฐํธ ํธ๋ค๋ฌ๋ GET ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์บ์ ๋จ
- GET ๋ผ์ฐํธ ํธ๋ค๋ฌ์์ ๋ฆฌํดํ JSON ๋ฐ์ดํฐ๋ ๋ค๋ฅธ ๋น๋๊ฐ ์ผ์ด๋ ๋๊น์ง ๋ณ๊ฒฝ๋์ง ์์
Route Handlers and Client Components
- Form์ ๋ง๋ค ๋ ๋ผ์ฐํฐ ํธ๋ค๋ฌ ๋์ Server Action์ ํ์ฉํ ์ ์์
Using Suspense with Server Components
- Suspense์ ์์น๋ ๋ฐ์ดํฐ ํจ์นญ์ ์ํํ๋ ๋น๋๊ธฐ ์ปดํฌ๋ํธ๋ณด๋ค ๋์ ๊ณณ์ ์์นํด์ผ ํจ
- Suspense๊ฐ ๋น๋๊ธฐ ์ปดํฌ๋ํธ ๋ด๋ถ์ ์์ผ๋ฉด ์๋ํ์ง ์์
Using the incoming request
- ์๋ฒ ์ปดํฌ๋ํธ๋ ๋ค์ด์ค๋ ์์ฒญ(Incoming Request)์ ๊ฐ์ฒด์ ์ ๊ทผํ ์ ์์
- ๋์ , ์๋ฒ ์ปดํฌ๋ํธ๋ ๋ค์ด์ค๋ ์์ฒญ์ ์ ๊ทผํ ์ ์๋ function๊ณผ props๋ฅผ ์ ๊ณตํจ
cookies()
,headers()
,params
,searchParams
์ ๊ฐ์ ์ต์ ์ ์ฌ์ฉ
Using Context providers with App Router
- ๋ ๊ฐ์ง ์ผ๋ฐ์ ์ธ ์ค์๋ ์๋ฒ ์ปดํฌ๋ํธ์ Context๋ฅผ ํจ๊ป ์ฐ๋ ค๊ณ ํ๋ ๊ฒ๊ณผ App Router์ Provider๋ฅผ ๋ฐฐ์นํ๋ ๊ฒ
- ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ ํธ๋ฆฌ์ Provider๋ฅผ ๋ฐฐ์นํ๊ณ , ์๋ฒ ์ปดํฌ๋ํธ ํธ๋ฆฌ์ ํด๋น ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ฅผ ํฌํจํ๋ผ
Using Server and Client Components together
- ์๋ฒ ์ปดํฌ๋ํธ๋ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ฅผ ์์์ผ๋ก ๋ ์ ์์
- ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ ์๋ฒ ์ปดํฌ๋ํธ๋ฅผ ์์์ผ๋ก ๋ ์ ์์
Adding โuse clientโ unnecessarily
- ๋ชจ๋ ํ์ผ์
use client
๋ฅผ ์ถ๊ฐํ ํ์๋ ์์ - ํด๋ผ์ด์ธํธ ๋ฐ์ด๋๋ฆฌ์ ์์ผ๋ฉด, ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์ ํ์ ์๋งค๋ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๊ฐ ๋จ
Not revalidating data after mutations
- ๊ฐ๋ฐ์๋ค์ ์ผ๋ฐ์ ์ธ ์ค์ ์ค ํ๋๋ data๋ฅผ ๋ณ๊ฒฝ(mutate) ํ๊ณ ๋์ revalidate ํ๋ ์์ ์ ๊น๋จน๋ ๊ฒ
- ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ดํ,
next/cache
์revalidatePath()
์ ์คํํ๋ผ. ๊ทธ๋์ผ ํ๋ฉด์ ๋ณด์ด๋ ๋ฐ์ดํฐ๊ฐ ์ ๋ฐ์ดํธ๋จ
Redirects inside of try/catch blocks
return redirect()
๋์redirect()
๋ฅผ ์ฌ์ฉํ ๊ฒredirect()
ํจ์๋ TypeScript์never
ํ์ ์ ์ฌ์ฉํ๋ฏ๋ก return์ ๋ถ์ผ ํ์๊ฐ ์์
Vercel Youtube ์์์ผ๋ก ์์ฒญํ ์๋ ์๋ค.
[์ฐธ๊ณ ] App router์ ๋ํ ๊ธฐ๋์น์๋ ๋ค๋ฅด๊ฒ ์ค์ production ๊ตฌํ๊ณผ ์ ์ฉ์ ์ข ๋ ์ ์คํด์ผ ํ ์ ์๋ค. page router์์ app router๋ก ๋ณ๊ฒฝ์ ๊ณ ๋ คํ๊ณ ์๋ค๋ฉด, ๋ค์์ ๊ฒฝํ์ ๊ธ์ ์ฐธ๊ณ ํด ๋ณด๊ธฐ ๋ฐ๋๋ค.
React Libraries for 2024
React๋ฅผ ์ฌ์ฉํ ๋ ์ฐธ๊ณ ํ๋ฉด ์ข์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด์ ์ถ์ฒํด ์ค๋ค.
React Project, Package Manager, State Management, Data Fetching, Router, CSS Styling๋ฅผ ํฌํจํ์ฌ 30๊ฐ์ง ์ฃผ์ ์ ๋ํด ๋ค์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์๊ฐํ๋ค.
๋ค๋ง, ๋ชจ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ค ์๋ ๊ฒ์ ์๋์ด์, ๊ฐ๋ณ๊ฒ ์ฐธ๊ณ ํด ๋ณด๋ฉด ์ข๋ค.
๐น ํํ ๋ฆฌ์ผ
Compiling a standalone executable using modern JavaScript/TypeScript runtimes
๋์ผํ ์์ค ์ฝ๋๋ฅผ ์ฌ์ฉํด ๋ชจ๋ JS/TS ๋ฐํ์๋ค(bun, deno, node)์ ์ฌ์ฉํด ๋จ์ผ ์คํ ํ์ผ๋ก ์ปดํ์ผ ํ๊ณ , ์์ฑ๋ ํ์ผ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๋์ํ๋์ง์ ๊ณผ์ ์ ๊ธฐ์ ํ ๋ด์ฉ์ด๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก bun๊ณผ deno๋ ๋จ์ผ ์คํ ํ์ผ์ ์์ฑํ์ง๋ง, node์ ๊ฒฝ์ฐ๋. CJS๋ง ๊ฐ๋ฅํ๊ณ , ESM์ ๊ฒฝ์ฐ๋ ์คํจํ๋ค.
What are the parts of a URL?
์ฐ๋ฆฌ๊ฐ ๋๋ฌด๋๋ ๋น์ฐํ๊ฒ ์ฌ์ฉํ๋ URL์ ์ฌ๋ฌ ๊ฐ์ง ์์๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
TLD
, Fragment
, pathname
๊ฐ์ ์ฉ์ด๊ฐ ์์ํ๊ฑฐ๋ Search
์ Search params
๋ฅผ ๋ช
ํํ ๊ตฌ๋ถํ์ง ๋ชปํ๋ค๋ฉด ์ด ๊ธ์ ํตํด ํ์ธํด ๋ณด์.
Letโs learn how modern JavaScript frameworks work by building one

์ฒ์๋ถํฐ ํ๋ ์์ํฌ๋ฅผ ๋ง๋ค์ด๋ณด๋ ๊ฒฝํ์ ํตํด ํ๋ JavaScript ํ๋ ์์ํฌ์ ํต์ฌ ๊ฐ๋ ๊ณผ ๊ตฌํ ๋ฐฉ๋ฒ์ ํ์ตํ ์ ์๋ค.
์คํ ๋ฆฌ๋ถ์ผ๋ก ์ธํฐ๋์ ํ ์คํธํ๊ธฐ
์คํ ๋ฆฌ๋ถ์ผ๋ก ์๋ํ ํ ์คํธ๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ, Interactive Stories ๊ธฐ๋ฅ ๋ฑ์ ํ์ฉํ์ฌ ์ปดํฌ๋ํธ์ ์ธํฐ๋์ ์ ์๋์ผ๋ก ์ฌ์ํ๋ ๋ฐฉ๋ฒ, ๊ทธ๋ฆฌ๊ณ E2E ๋๊ตฌ๋ฅผ ๊ฒฐํฉํ์ฌ ํ ์คํธํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํ๋ค.
Build a Next.js app in Storybook with React Server Components and Mock Service Worker

MSW(Mock Service Worker)๋ฅผ ์ด์ฉํด์ React Server Component Storybook์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์์๋ณธ๋ค.
๐ฆ ์ฝ๋์ ๋๊ตฌ
nuqs
'use client'; // app router: only works in client components
import { useQueryState } from 'nuqs';
export default () => {
const [name, setName] = useQueryState('name');
return (
<>
<h1>Hello, {name || 'anonymous visitor'}!</h1>
<input value={name || ''} onChange={(e) => setName(e.target.value)} />
<button onClick={() => setName(null)}>Clear</button>
</>
);
};
React.useState()์ฒ๋ผ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ค. url Query String์ ์ํ๋ฅผ ์ ์ฅํ๋ฉฐ type-safe๋ฅผ ๋ณด์ฅํด ์ฃผ๋ ํน์ง์ด ์๋ค.
Bun Shell
import { $ } from 'bun';
const buffer = Buffer.alloc(1024);
await $`ls *.js > ${buffer}`;
console.log(buffer.toString('utf8'));
macOS์ zsh, Linux์ bash, Windows์ cmd๋ ์๋ก ๋ค๋ฅธ ๋ฌธ๋ฒ๊ณผ ๋ช ๋ น์ด๋ฅผ ๊ฐ์ง๊ณ ์์ด ํธํ์ฑ ๋ฌธ์ ๊ฐ ์์๋ค.
Bun Shell์ Bun์ ๋ด์ฅ๋ ์๋ก์ด ์คํ์ ์ธ์ด ๋ฐ ์ธํฐํ๋ฆฌํฐ๋ก, JavaScript ๋ฐ TypeScript์์ ํฌ๋ก์ค ํ๋ซํผ ์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ์ ์๊ฒ ํ๋ค.
Bun Shell์ ์ผ๋ฐ JavaScript์ฒ๋ผ ๋๊ปด์ง๋ฉด์๋, pipe๋ฅผ ์ฌ์ฉํ ์ ์์ด์ ์์ฒ๋ผ ๋๊ปด์ง๊ธฐ๋ ํ๋ค.
Ollama JavaScript Library
Llama 2, Mistral ๋ฑ LLM์ ๋ก์ปฌ์์ ์ฌ์ฉํ ์ ์๋ Ollama์ JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ๋จ ๋ช ์ค์ ์ฝ๋๋ง์ผ๋ก ์์ฑํ AI๋ฅผ ํ์ฉํ ์ ์๋ค.
$ npm install ollama
import ollama from 'ollama';
const response = await ollama.chat({
model: 'llama2',
messages: [{ role: 'user', content: 'Why is the sky blue?' }],
});
console.log(response.message.content);
Sit in Shade
๋ฒ์ค๋ฅผ ํ๊ณ ์ด๋ํ ๊ฒฝ๋ก์ ํจ๊ป ์์ ํ์น ์๊ฐ์ ์ ๋ ฅํ๋ฉด, ํ๋น ๋ ธ์ถ์ ์ต์ํํ๊ธฐ ์ํด ์ด๋ค ์์น์ ์ข์์ ์๋ ๊ฒ์ด ์ข์์ง๋ฅผ ํ์ธํ ์ ์๋ค.
Shoelace
ํ์ค ๊ธฐ์ ์ธ Web Components๋ก ๊ฐ๋ฐ๋ UI ์ปดํฌ๋ํธ๋ฅผ ์ ๊ณตํ๋ฉฐ, ํน์ ํ๋ ์์ํฌ์ ๊ธฐ๋ฐํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ํ๋ ์์ํฌ ํ๊ฒฝ ๋๋ ์ฌ์ฉํ์ง ์๋ ํ๊ฒฝ์์ ์ฌ์ฉํ ์ ์๋ค.
์ปดํฌ๋ํธ๋ LitElement๋ฅผ ์ฌ์ฉํด ๊ฐ๋ฐ๋์๋ค.
Awesome Figma Tips
๋ค์ํ ์ํฉ์์ ํ์ํ ์์ ์ ๋น ๋ฅด๊ฒ ์ํํ ์ ์๋ Figma ํ ๋ชจ์์ ์ ๊ณตํ๋ค.
Automatic Class Sorting with Prettier
TailwindCSS์ ๋ค์ํ ์ ํธ๋ฆฌํฐ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ค ๋ณด๋ฉด, ์ ์ฉ๋ ํด๋์ค๊ฐ ๋ง์์ง๊ฒ ๋๋ฉด์ ์ ๋ ฌ๋์ง ์์ ํด๋์ค๋ช ์ผ๋ก ์ธํด ๊ฐ๋ ์ฑ์ด ๋ฎ์์ง๋ ๊ฒฝ์ฐ๊ฐ ์ข ์ข ๋ฐ์ํ๊ฒ ๋๋ค.
์ด Prettier ํ๋ฌ๊ทธ์ธ์ ์๋์ผ๋ก ๊ถ์ฅ ํด๋์ค ์์์ ๋ฐ๋ผ ์ ๋ ฌํด ์ค๋ค.
<!-- Before -->
<button
class="text-white px-4 sm:px-8 py-2 sm:py-3 bg-sky-700 hover:bg-sky-800"
></button>
<!-- After -->
<button
class="bg-sky-700 px-4 py-2 text-white hover:bg-sky-800 sm:px-8 sm:py-3"
></button>