First PR to Svelte repository

Published at 2024. 9. 26.

6 min read

#svelte#open source

Table of Contents

Why Svelte?

๋‚˜๋Š” React๋กœ ๋ฐฅ ๋ฒŒ์–ด ๋จน๊ณ  ์‚ฌ๋Š” ์‚ฌ๋žŒ์ด์ง€๋งŒ, ์‚ฌ์‹ค React์˜ ์ฒ ํ•™์„ ๊ทธ๋‹ค์ง€ ์ข‹์•„ํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค. ๊ทธ๋ƒฅ ํ•œ๊ตญ ์ฑ„์šฉ ์‹œ์žฅ์—์„œ๋Š” React๊ฐ€ ์ ˆ๋Œ€ ์šฐ์œ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ์— ๊ณต๋ถ€ํ•ด์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ผ ๋ฟ.

React๋ฅผ ์“ฐ๋ฉด์„œ ๊ฐ€์žฅ ๋ถˆํŽธํ•˜๊ณ  ์ฐœ์ฐœ(?)ํ•œ ์ ์€, React๋Š” Virtual DOM์ด๋ผ๋Š” tree data structure๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ตฌ์กฐ๋‹ค๋ณด๋‹ˆ ์–ด์ฉ” ์ˆ˜ ์—†์ด ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ Œ๋”๋ง ์ตœ์ ํ™”์— ํ•ญ์‹œ ์‹ ๊ฒฝ์„ ์“ธ ์ˆ˜ ๋ฐ–์— ์—†๋‹ค๋Š” ์ ์ด๋‹ค.
์ƒํƒœ ๋ณ€๊ฒฝ ์‹œ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ๊ธฐ๋ณธ์ ์œผ๋กœ re-rendering๋˜์–ด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฆฌ์†Œ์Šค๋ฅผ ๋‚ญ๋น„๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ๋ถ€๋ถ„์„ ์ง์ ‘ ์‹ ๊ฒฝ์จ์ค˜์•ผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ฅผ ์œ„ํ•œ memoisation API์กฐ์ฐจ ๋งˆ๊ตฌ์žก์ด๋กœ ์ผ๋‹ค๊ฐ€๋Š” ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์„ ์‹ฌํ•˜๊ฒŒ ํ•ด์น  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ œ๋Œ€๋กœ ์•Œ๊ณ  ์จ์•ผํ•œ๋‹ค(๋ฌผ๋ก  ์ œ๋Œ€๋กœ ์•„๋Š” ๊ฒƒ์ด ๋‚˜์œ๊ฑด ์•„๋‹ˆ์ง€๋งŒ๐Ÿ˜…).

๊ทธ๋Ÿฐ๋ฐ Svelte๋Š” React์™€๋Š” ๋‹ค๋ฅด๊ฒŒ runtime์— ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋‹จ์ง€ compiler์ด๊ธฐ์— React์™€ ๊ฐ™์€ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งค๋ฒˆ ๊ณ ๋ คํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. React์ฒ˜๋Ÿผ runtime์— Virtual DOM diffing์„ ํ•˜์—ฌ DOM์„ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ build time์— ๋”ฑ ํ•„์š”ํ•œ DOM ์—…๋ฐ์ดํŠธ(surgical update) ๋กœ์ง๋งŒ ์ƒ์„ฑํ•˜์—ฌ runtime์— ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
๊ทธ๋ž˜์„œ Svelte์˜ ์ฒ ํ•™์ด ๋‚˜์—๊ฒŒ๋Š” ํ›จ์”ฌ ์„ค๋“๋ ฅ์ด ์žˆ์—ˆ๊ณ  ๋” ๊นŠ๊ฒŒ ํŒŒ๋ณด๊ณ  ์‹ถ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค๊ฒŒ ๋˜์—ˆ๋‹ค.

Dive into Svelte world

์ด์ „์— Svelte๋ฅผ ๊ฐœ์ธ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ์—์„œ ํ•œ ๋ฒˆ ์‚ฌ์šฉํ•ด๋ณธ ๊ฒฝํ—˜์ด ์žˆ๋‹ค.
๊ทธ๋ž˜์„œ Svelte์— ์–ด๋Š์ •๋„ ์ต์ˆ™ํ•ด์ ธ ์žˆ๊ธฐ๋Š” ํ•œ ์ƒํƒœ์˜€๋‹ค(๋ฌผ๋ก , ์•„์ง๋„ ์•ˆ์จ๋ณธ ๊ธฐ๋Šฅ์ด ํ›จ์”ฌ ๋” ๋งŽ๊ธดํ•˜์ง€๋งŒ). ํ•˜์ง€๋งŒ ๋‚˜๋Š” ์ด์ œ ์ค‘๋‹ˆ์–ด๋กœ ์ ‘์–ด๋“ค์—ˆ๊ธฐ์—, ๋‹จ์ˆœํžˆ ์‚ฌ์šฉ๋ฒ•๋งŒ์„ ์ตํžˆ๋Š” ๊ฒƒ์€ ๋” ์ด์ƒ ๊ฐœ๋ฐœ์ž๋กœ์„œ์˜ ์„ฑ์žฅ์— ํฐ ์˜๋ฏธ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฐ”๋กœ Svelte repo๋ฅผ cloneํ•˜์—ฌ ๋ฌด์ž‘์ • ๋ถ„์„ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.

์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์ฒ˜์Œ ๋ดค์„ ๋•Œ์˜ ๋Š๋‚Œ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • directory structure์˜ ์œ„๊ณ„๊ฐ€ ์ž˜ ์žกํ˜€์žˆ๊ณ , ์—ญํ• ์ด ์ž˜ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค.
  • ๋ณ€์ˆ˜๋ช…, ํ•จ์ˆ˜๋ช… ๋“ฑ์˜ identifier์˜ ์ด๋ฆ„๋“ค์ด ๊ฝค๋‚˜ ์ง๊ด€์ ์œผ๋กœ ์ž˜ ์ง€์–ด์ ธ ์žˆ๋‹ค.
  • type ๊ด€๋ จ ํŒŒ์ผ์€ ์กด์žฌํ•˜์ง€๋งŒ, TypeScript๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. (JS Doc + *.d.ts ํŒŒ์ผ๋กœ ๊ด€๋ฆฌ๋˜๊ณ  ์žˆ์Œ)

๋ญ ๊ฐ„๋‹จํžˆ ์ด ์ •๋„์˜ ์ •๋ณด๋งŒ ํŒŒ์•…ํ•˜๊ณ  compiler ๊ด€๋ จ ์ฝ”๋“œ์˜ entry file ๊ฒฉ์ธ packages/svelte/src/compiler/index.js ํŒŒ์ผ๋กœ ๋Œ์ง„ํ–ˆ๋‹ค.

ํ™•์‹คํžˆ pure JavaScriptํŒŒ์ผ์ด ๋ณต์žกํ•œ type์ด ์ฝ”๋“œ์— ์„ž์—ฌ ๋“ค์–ด๊ฐ€ ์žˆ๋Š” TypeScript ํŒŒ์ผ๋ณด๋‹ค๋Š” ์ฝ๊ธฐ๊ฐ€ ํŽธํ–ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ฝ”๋“œ๋ฅผ ์ฝ๋˜ ์ค‘์— JS Doc์˜ syntax๊ฐ€ ์•ฝ๊ฐ„ ์ด์ƒํ•˜๊ฒŒ ๋ณด์ด๋Š” ๋ถ€๋ถ„์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค.

first PR to Svelte
JS Doc comment๊ฐ€ ์•ฝ๊ฐ„ ์ด์ƒํ•ด ๋ณด์ด๋Š” ๋ถ€๋ถ„

๋‹จ์ˆœํ•˜๊ฒŒ @typedef ์„ ์–ธ์˜ ๋์— newline character๋ฅผ ๋„ฃ์ง€ ์•Š์•„์„œ ์ƒ๊ธด ๋ฌธ์ œ์˜€๋‹ค. ์ด๋Ÿฐ ๋ถ€๋ถ„์€ ์†”์งํžˆ maintainer๋“ค์ด ์‹ ๊ฒฝ์“ฐ๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š์€ ์‚ฌ์†Œํ•œ ๋ถ€๋ถ„์ด๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋” ํฐ task๋“ค์ด ์‚ฐ์ ํ•ด ์žˆ์œผ๋‹ˆ๊นŒ.๊ทธ๋ž˜์„œ ๋‚ด๊ฐ€ ๋‹น์žฅ PR์„ ์˜ฌ๋ ค์„œ ์ˆ˜์ •ํ•˜๋Š”๊ฒŒ ๋‚ซ๊ฒ ๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค.

์ƒ๊ฐ์„ ํ•˜์ž๋งˆ์ž ๋ฐ”๋กœ Svelte repository๋ฅผ fork ํ•ด์„œ patch ์ž‘์—…์„ ํ•œ ๋’ค์—, remote PR์„ ์•„๋ž˜์ฒ˜๋Ÿผ ์˜ฌ๋ ค ๋‘์—ˆ๋”๋‹ˆ ํ•˜๋ฃจ ๋’ค์— Rich Harris๊ฐ€ ์ง์ ‘ merge๋ฅผ ํ•ด์ฃผ์—ˆ๋”๋ผ..!

first PR to Svelte
Rich Harris๊ฐ€ ์ง์ ‘ merge ํ•ด์ค„๊ฑฐ๋ž€ ์ƒ๊ฐ์€ ๋ชปํ–ˆ๋‹ค.

์‚ฌ์‹ค ๋ณ„ ๊ฒƒ๋„ ์•„๋‹ˆ์ง€๋งŒ, ์ด๋ ‡๊ฒŒ ์‚ฌ์†Œํ•œ ๋ถ€๋ถ„์ด๋ผ๋„ PR์„ ์˜ฌ๋ ค์„œ merge ์‹œ์ผœ๋ณธ ๊ฒฝํ—˜์„ ํ•ด๋ณธ ๊ฒƒ๊ณผ ์•ˆํ•ด๋ณธ ๊ฒƒ์€ ์ฐจ์ด๊ฐ€ ์ƒ๊ฐ๋ณด๋‹ค ํฌ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์•„๋ฌด๋ฆฌ ๊ฐ„๋‹จํ•œ PR์ด๋ผ๋„ ๊ทธ PR์„ ํ†ตํ•ด ๋‚ด๊ฐ€ ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์— ๊ธฐ์—ฌํ•˜๊ณ  ์žˆ๋‹ค๋Š” โ€˜๋Š๋‚Œโ€™์ด, ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์— ์ง€์†์ ์œผ๋กœ ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“œ๋Š” โ€˜๋™๊ธฐ๋ถ€์—ฌโ€™๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์•ž์œผ๋กœ์˜ ๊ณ„ํš

๋‚ด๋…„ ์ƒ๋ฐ˜๊ธฐ๊นŒ์ง€ Svelte์˜ ์ค‘์š”ํ•œ ๋กœ์ง๋“ค์„ ๊นŠ๊ฒŒ ๊ณต๋ถ€ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค. ๊ทธ ๊ณผ์ •์—์„œ ์•Œ๊ฒŒ ๋œ ๊ฒƒ๋“ค๋„ ๋ฌผ๋ก  ํฌ์ŠคํŒ… ํ•  ์˜ˆ์ •์ด๋‹ค. ๊ทธ ๊ณผ์ •์ด ๋…น๋ก์น˜๋Š” ์•Š๊ฒ ์ง€๋งŒ, ํ”„๋ก ํŠธ์—”๋“œ ์—”์ง€๋‹ˆ์–ด๋กœ์„œ์˜ ๋‹ค์Œ step์„ ์œ„ํ•ด ์กฐ๊ธˆ์”ฉ์ด๋ผ๋„ ๊พธ์ค€ํ•˜๊ฒŒ ํ•ด์•ผ์ง€.

Slow But Steady ยฉ 2024