Skip to main content

React Native, Metro๋ฅผ ๋„˜์–ด์„œ (1,2)

2024๋…„ 4์›” 4์ผAbout 4 minNode.jsReact.jsReact NativeNext.jsArticle(s)blogyozm.wishket.comnodenodejsnodej-sreactreactjsreact-jsreact-native

React Native, Metro๋ฅผ ๋„˜์–ด์„œ (1,2) ๊ด€๋ จ

React.js > Article(s)

Article(s)

React Native, Metro๋ฅผ ๋„˜์–ด์„œ (1) | ์š”์ฆ˜IT
React Native, Metro๋ฅผ ๋„˜์–ด์„œ (1)

[FEConf2023์—์„œ ๋ฐœํ‘œํ•œ <FEConf 2023 [B4] React Native, Metro๋ฅผ ๋„˜์–ด์„œ>][1]๋ฅผ ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค. ๋ฐœํ‘œ ๋‚ด์šฉ์„ 2ํšŒ๋กœ ๋‚˜๋ˆ„์–ด ๋ฐœํ–‰ํ•ฉ๋‹ˆ๋‹ค. 1ํšŒ์—์„œ๋Š” Metro์—์„œ ESBuild๋กœ ๋ฒˆ๋“ค๋Ÿฌ๋ฅผ ์ „ํ™˜ํ•˜๊ฒŒ ๋œ ๋ฐฐ๊ฒฝ์„ ์†Œ๊ฐœํ•˜๊ณ  ๋‚˜์•„๊ฐ€ ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ๋ฌด์—‡์ธ์ง€์™€ ๋ฒˆ๋“ค๋Ÿฌ์˜ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ์ธ Resolution๊ณผ Load, Optimization์„ ์•Œ์•„๋ด…๋‹ˆ๋‹ค. 2ํšŒ์—์„œ๋Š” Optimization์˜ Minification๊ณผ Tree Shaking๋ฅผ ์†Œ๊ฐœํ•˜๊ณ , ํ† ์Šค์—์„œ Metro๋ฅผ ESBuild๋กœ ๋ฐ”๊ฟจ๋˜ ์—ฌ์ •์„ ์ด์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค. ๋ณธ๋ฌธ์— ์‚ฝ์ž…๋œ ์ด๋ฏธ์ง€์˜ ์ถœ์ฒ˜๋Š” ๋ชจ๋‘ ์ด ์ฝ˜ํ…์ธ ์™€ ๊ฐ™์€ ์ œ๋ชฉ์˜ ๋ฐœํ‘œ ์ž๋ฃŒ๋กœ, ๋”ฐ๋กœ ์ถœ์ฒ˜๋ฅผ ํ‘œ๊ธฐํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ฐœํ‘œ ์ž๋ฃŒ๋Š” FEConf2023 ํ™ˆํŽ˜์ด์ง€์—์„œ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ† ์Šค์—์„œ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ ์ผํ•˜๊ณ  ์žˆ๋Š” ๋ฐ•์„œ์ง„์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” ์ €ํฌ๊ฐ€ ๋งค์ผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” Metro, webpack ์•„๋‹ˆ๋ฉด ESBuild์™€ ๊ฐ™์ด ๊ทธ๋Ÿฐ ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•ด์„œ ์ž์„ธํ•˜๊ฒŒ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ๋ฌด์—‡์ธ์ง€๋ฅผ ์•Œ๋ฉด Metro๋„ ESBuild๋„ ์ƒ๊ธด ๊ฒƒ๋งŒ ๋‹ค๋ฅธ ๋˜‘๊ฐ™์€ ๋ฒˆ๋“ค๋Ÿฌ๋ผ๋Š” ๊ฑธ ์•Œ๊ฒŒ ๋˜๊ณ , ๋‘ ๋ฒˆ๋“ค๋Ÿฌ๋ฅผ (์‰ฝ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค๋งŒ) ๊ฐˆ์•„๋ผ์šธ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ๋„ ์•Œ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.


๋ฒˆ๋“ค๋Ÿฌ ์ „ํ™˜ ๋ฐฐ๊ฒฝ: Metro์—์„œ ESBuild๋กœ

ํ† ์Šค์—์„œ๋Š” ๋‹ค์–‘ํ•œ ์„œ๋น„์Šค๋ฅผ React Native๋กœ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜œํƒ, ํ”ผ๋“œ ๊ด‘๊ณ , ๋ณ‘์›๋น„ ๋Œ๋ ค๋ฐ›๊ธฐ์™€ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ๋„๋ฉ”์ธ์˜ ์ œํ’ˆ์ด React Native๋กœ ๊ฐœ๋ฐœ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํ† ์Šค์™€ React Native
ํ† ์Šค์™€ React Native

React Native๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐœ๋ฐœํ•˜๋‹ค ๋ณด๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ Metro๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์›น์— ์›นํŒฉ์ด ์žˆ๋‹ค๋ฉด React Native์—๋Š” Metro๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ์•ผ๋ง๋กœ ๊ฐœ๋ฐœ ์„œ๋ฒ„๋ฅผ ๋„์šธ ๋•Œ๋ถ€ํ„ฐ ํ”„๋กœ๋•์…˜์— ๋ฐฐํฌํ•  ๋•Œ๊นŒ์ง€ ์ •๋ง ๋งŽ์€ ๊ณณ์—์„œ ๋งŒ๋‚˜๊ฒŒ ๋˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ Metro๋ฅผ ์“ฐ๋‹ค ๋ณด๋ฉด ๋˜๊ฒŒ ๋‹ค์–‘ํ•œ ๋ฌธ์ œ์ ์„ ๋งŒ๋‚˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Metro
Metro

์ฒซ์งธ, '--reset-cache'๋ผ๊ณ  ํ•˜๋Š” ๊ต‰์žฅํžˆ ์œ ๋ช…ํ•œ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์›น ๊ฐœ๋ฐœ์„ ํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ค๋ฅด๊ฒŒ ์ˆ˜๋™์œผ๋กœ ๋งค๋ฒˆ ์บ์‹œ๋ฅผ ๋‚ ๋ ค์ค˜์•ผ ํ•˜๋‹ค ๋ณด๋‹ˆ ์ข€ ๋ถˆํŽธํ•œ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘˜์งธ, ๋ณ„๊ฑฐ ์•„๋‹Œ ์„œ๋น„์Šค์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋ฐ๋ธŒ ์„œ๋ฒ„๋ถ€ํ„ฐ ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ๊นŒ์ง€ ์ƒ๋‹นํ•˜๊ฒŒ ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค. Metro์˜ ๋กœ๋”ฉ ์ธ๋””์ผ€์ดํ„ฐ๊ฐ€ ์žˆ๋Š”๋ฐ, ๊ทธ ์ธ๋””์ผ€์ดํ„ฐ๋ฅผ ๋ณด๋‹ค ๋ณด๋ฉด ๋งŽ์ด ๋‹ต๋‹ตํ•˜๊ณ ๋Š” ํ–ˆ์Šต๋‹ˆ๋‹ค. ์…‹์งธ, ํ˜„๋Œ€์ ์ธ ์–ด๋–ค ๊ทธ๋Ÿฐ ๋ฒˆ๋“ค๋Ÿฌ์™€ ๋‹ค๋ฅด๊ฒŒ Tree Shaking๊ณผ ๊ฐ™์€ ์ตœ์ ํ™” ๋„๊ตฌ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์•„์„œ, ๋นŒ๋“œ๋œ ๊ฒฐ๊ณผ๋ฌผ์ด ํ•„์š” ์ด์ƒ์œผ๋กœ ํฌ๊ธฐ๋„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ† ์Šค์—์„œ๋Š” ์ด๋Ÿฐ ๋ฌธ์ œ๋“ค์„ ESBuild๋ผ๊ณ  ํ•˜๋Š” ๋ฒˆ๋“ค๋Ÿฌ๋ฅผ ๋„์ž…ํ•จ์œผ๋กœ์จ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ๋ฒˆ๋“ค๋Ÿฌ๋ฅผ ๊ต์ฒดํ•œ ๊ฒƒ๋งŒ์œผ๋กœ๋„ reset-cache๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ์„ ๋” ์ด์ƒ ๊ธฐ์–ตํ•˜์ง€ ์•Š์•„๋„ ๋๊ณ , ๋นŒ๋“œ ์†๋„๋„ ๋ˆˆ๋ถ€์‹œ๊ฒŒ ๋นจ๋ผ์กŒ์œผ๋ฉฐ, Tree Shaking์„ ํ†ตํ•ด์„œ ์‚ฌ์šฉ์ž๋“ค์ด ๋‚ด๋ ค๋ฐ›์•„์•ผ ํ•˜๋Š” JavaScript์˜ ํŒŒ์ผ ํฌ๊ธฐ๋„ ๋งŽ์ด ์ค„์ผ ์ˆ˜๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

esbuild
esbuild

๊ทธ์•ผ๋ง๋กœ ๋งˆ๋ฒ•๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ผ๊ณ ๋„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์•ž์„œ ์†Œ๊ฐœํ•ด ๋“œ๋ ธ๋˜ ๋ฐ”์™€ ๊ฐ™์ด Metro์™€ ESBuild์™€ ๊ฐ™์€ ๊ทธ๋Ÿฐ ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋ฉด์„œ, ํ† ์Šค๊ฐ€ ์–ด๋–ป๊ฒŒ Metro์—์„œ ESBuild๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์—ˆ๋Š”์ง€๋ฅผ ์†Œ๊ฐœํ•ด ๋“œ๋ฆฌ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.


๋ฒˆ๋“ค๋Ÿฌ: Metro์™€ ESBuild (+Webpack)๋Š” ๋ฌด์—‡์ธ๊ฐ€?

๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•ด์„œ ์•Œ๊ธฐ ์œ„ํ•ด์„œ๋Š”, ๋จผ์ € ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ์™œ ํ•„์š”ํ•œ์ง€๋ฅผ ๋จผ์ € ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. React Native ์•„ํ‚คํ…์ฒ˜๋Š” ์–ธ๋œป ๋ณด๋ฉด ๊ต‰์žฅํžˆ ๋ณต์žกํ•ด ๋ณด์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค๋งŒ, ์‚ฌ์‹ค์€ ๊ต‰์žฅํžˆ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

๋จผ์ € ํ† ์Šค๋Š” JavaScript๋กœ ์ฝ”๋“œ๋ฅผ ์”๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ์–ด๋–ค ๋ทฐ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์“ฐ๊ฒ ์ฃ . ๊ทธ๋Ÿฌ๋ฉด ๊ทธ JavaScript ์ฝ”๋“œ๋ฅผ hermes๋‚˜ ์•„๋‹ˆ๋ฉด v8๊ณผ ๊ฐ™์€ JavaScript ์—”์ง„์ด ์‹คํ–‰๋˜๋ฉด์„œ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋ฅผ ๋Œ€์‹  ํ˜ธ์ถœํ•ด ์ค๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด์„œ, ๋ทฐ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๊ฑฐ๋‹ˆ๊นŒ iOS์—์„œ๋Š” UIView๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ๋Š” android.view๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒ๋‹ˆ๋‹ค. ๋งˆ์น˜ ๋„ํ๋จผํŠธ์˜ createElement div๋ฅผ ํฌ๋กฌ์—์„œ JavaScript ์—”์ง„์ด ์‹คํ–‰ํ•˜๋ฉด div๊ฐ€ ์ƒˆ๋กœ ์ƒ๊ธฐ๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

React Native ์•„ํ‚คํƒ์ฒ˜
React Native ์•„ํ‚คํƒ์ฒ˜

๊ทธ๋Ÿฐ๋ฐ React Native ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” ํŠน๋ณ„ํ•œ ์กฐ์น˜ ์—†์ด๋Š” JavaScript ํŒŒ์ผ์ด ๋‹จ์ผ ํŒŒ์ผ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŒŒ์ผ์„ ์ž…๋ ฅ์œผ๋กœ ๋„ฃ์„ ์ˆ˜๊ฐ€ ์—†๊ณ  ๋‹จ ํ•˜๋‚˜์˜ ํŒŒ์ผ๋งŒ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. JavaScript์—์„œ ๊ฐœ๋ฐœํ•  ๋•Œ ํŒŒ์ผ์„ ๋‚˜๋ˆ ์„œ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์€ ๋„ˆ๋ฌด ๋‹น์—ฐํ•œ๋ฐ์š”. ํŠนํžˆ ๋ฆฌ์•กํŠธ์ธ ๊ฒฝ์šฐ์—๋Š” ์ปดํฌ๋„ŒํŠธ ๋‹น ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ ๋งŒ๋“ค๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ผ๋ฐ˜์ ์œผ๋กœ ์•ฑ์ด ์žˆ๊ณ , ์•ฑ์—์„œ๋Š” ์ปดํฌ๋„ŒํŠธ 1๊ณผ 2๊ฐ€ ์žˆ์œผ๋ฉฐ, ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋‘ ๊ฐœ๋ฅผ ํ•ฉ์นœ ๊ฒƒ์„ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ฐœ๋ฐœํ•˜๊ณ  ์‹ถ์–ด ํ•ฉ๋‹ˆ๋‹ค.

๋ฒˆ๋“ค๋ง (์ „)
๋ฒˆ๋“ค๋ง (์ „)

๊ทธ๋Ÿฐ๋ฐ React Native๋Š” ์•ž์„œ ๋ง์”€๋“œ๋ฆฐ ๊ฒƒ๊ณผ ๊ฐ™์ด ํ•œ ๊ฐœ์˜ ํŒŒ์ผ๋งŒ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ชผ๊ฐœ์ง„ ํŒŒ์ผ์„ ์ž…๋ ฅ์œผ๋กœ ๋„ฃ์„ ์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‹ค ๋ณด๋‹ˆ ๋”œ๋ ˆ๋งˆ๊ฐ€ ์ƒ๊ธฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 1๊ฐœ ํŒŒ์ผ์— ์ฝ”๋“œ๋ฅผ ๋‹ค ๊ฐœ๋ฐœํ•ด์„œ 10๋งŒ ์ค„ ๋˜๋Š” ๊ทธ๋Ÿฐ ํŒŒ์ผ์„ ๋งŒ๋“ค ์ˆ˜๋„ ์—†๊ณ , ๊ทธ๋ ‡๋‹ค๊ณ  ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŒŒ์ผ๋กœ ์ชผ๊ฐœ์„œ ๊ฐœ๋ฐœํ•˜์ž๋‹ˆ React Native๊ฐ€ ์ดํ•ดํ•˜์ง€๋„ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์ด๋•Œ ๋ฒˆ๋“ค๋Ÿฌ๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ์ด ๋“ฑ์žฅํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ํ•˜๋Š” ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์—ญํ• ์€ ์ €ํฌ๊ฐ€ ์ด๋ ‡๊ฒŒ ์ชผ๊ฐœ์„œ ๊ฐœ๋ฐœํ•œ ํŒŒ์ผ์„ ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์ฃผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ์•ž์„œ ์–ธ๊ธ‰ํ•œ ์•ฑ ์ปดํฌ๋„ŒํŠธ 1๊ณผ 2๋กœ ๋‚˜๋ˆ„์–ด์„œ ๊ฐœ๋ฐœ๋œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ด๋ ‡๊ฒŒ ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์„œ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฒˆ๋“ค๋ง (ํ›„)
๋ฒˆ๋“ค๋ง (ํ›„)

๊ทธ๋ž˜์„œ ๊ฒฐ๊ณผ๋ฌผ์ด ํ•˜๋‚˜์˜ ๋ฒˆ๋“ค๋กœ ๋งŒ๋“ค์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์—, ๋ฒˆ๋“ค๋Ÿฌ๋ผ๊ณ  ๋ถ€๋ฅด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ JavaScript ์ฝ”๋“œ๋ฅผ ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ ๋งŒ๋“ค๋ฉด ์ด์ œ React Native์—์„œ๋Š” ์ด ํŒŒ์ผ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๊ธฐ๋Œ€ํ–ˆ๋˜ ๋Œ€๋กœ ์ฝ”๋“œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด React Native์—์„œ Metro์˜ ์ฃผ๋œ ์—ญํ• ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๊ฒ ์Šต๋‹ˆ๋‹ค.

์š”์•ฝํ•˜๊ณ  ๋„˜์–ด๊ฐ€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ์„  ๋ธŒ๋ผ์šฐ์ €๋‚˜ React Native์™€ ๊ฐ™์€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ํŒŒ์ผ์„ ํ•ฉ์ณ์•ผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐœ๋ฐœ์ž๋“ค์€ ์ชผ๊ฐœ์„œ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์ด ๋”œ๋ ˆ๋งˆ๋ฅผ ํ•ด๊ฒฐํ•ด ์ฃผ๋Š” ๊ฒƒ์ด ๋ฒˆ๋“ค๋Ÿฌ์ด๊ณ , ์ด ๋ฒˆ๋“ค๋Ÿฌ๋Š” ์—ฌ๋Ÿฌ ์ชผ๊ฐœ์ง„ JavaScript ํŒŒ์ผ์„ ํ•ฉ์ณ์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.


๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ํ•˜๋Š” ์ผ - Resolution, Load, Optimization

์ด์ œ ์กฐ๊ธˆ ๋” ๊นŠ์€ ๋‚ด์šฉ์œผ๋กœ ๋„˜์–ด๊ฐ€ ๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋ฒˆ๋“ค๋Ÿฌ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ชผ๊ฐœ์ง„ ํŒŒ์ผ์„ ํ•˜๋‚˜๋กœ ํ•ฉ์น˜๋Š” ์—ญํ• ์„ ํ•˜์ง€๋งŒ, ์ด๋Ÿฐ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ผญ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. Resolution ๊ทธ๋ฆฌ๊ณ  Load๊ฐ€ ๊ทธ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์ œ ๊ฐ๊ฐ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ํ•˜๋Š” ์ผ
๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ํ•˜๋Š” ์ผ

Resolution

๋จผ์ € Resolution์ž…๋‹ˆ๋‹ค. ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ํŒŒ์ผ์„ ํ•ฉ์น˜๋Š” ๊ณผ์ •์—์„œ๋Š” import ๋ฌธ์ด๋‚˜ require ๋ฌธ์˜ ๊ฒฝ๋กœ๋ฅผ ์ •ํ™•ํžˆ ์•„๋Š” ๊ฒŒ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ์•„๋ž˜ ์˜ˆ์‹œ์—์„œ ์ฒซ ๋ฒˆ์งธ ๋ผ์ธ์„ ๋ณด๋ฉด ./App์—์„œ ์•ฑ์„ ๊ฐ€์ ธ์˜จ๋‹ค๊ณ  ๋˜์–ด ์žˆ๋Š”๋ฐ, ์ด ./App์ด๋ผ๊ณ  ํ•˜๋Š” ๊ฒŒ ์ •ํ™•ํ•˜๊ฒŒ ์–ด๋–ค ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜๋Š”์ง€๋ฅผ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Resolution
Resolution

๊ทธ๋Ÿฐ๋ฐ ๋งŽ์€ ๊ฒฝ์šฐ์—๋Š” ์ด๊ฒŒ ๋ชจํ˜ธํ•˜๋‹ค๊ณ  ํ•  ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋„ ./App.js, ./App.ts, ./App.tsx ๊ทธ๋ฆฌ๊ณ  ./App/index.js ๊ทธ๋ ‡๊ฒŒ ํ•ด์„œ ./App/index.ios.js๊นŒ์ง€ ๊ต‰์žฅํžˆ ๋งŽ์€ ์„ ํƒ์ง€๋“ค์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ Resolution์ด๋ž€ ์ด๋ ‡๊ฒŒ ๋ชจํ˜ธํ•œ ./App.js์ด๋ผ๊ณ  ํ•˜๋Š” ์š”์ฒญ์„ ์ •ํ™•ํ•œ ํŒŒ์ผ ๊ฒฝ๋กœ๋กœ ํ’€์–ด๋‚ด๋Š” ๊ฒƒ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์™€ ์œ ์‚ฌํ•˜๊ฒŒ ๊ต‰์žฅํžˆ ๋ชจํ˜ธํ•œ ์ƒํ™ฉ์ด ๋งŽ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, components์—์„œ component1๊ณผ component2๋ฅผ importํ•˜๋Š” ์ƒํ™ฉ์„ ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค.

Resolution
Resolution

์—ฌ๊ธฐ์—์„œ components๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ์ด npm์—์„œ ์„ค์น˜ํ•œ 'components'๋ผ๊ณ  ํ•˜๋Š” ํŒจํ‚ค์ง€์ธ์ง€, ์•„๋‹ˆ๋ฉด src ํด๋” ์•ˆ์˜ components๋ผ๊ณ  ํ•˜๋Š” ํด๋”์ธ์ง€, ์•„๋‹ˆ๋ฉด lib ํด๋” ์•ˆ์— ์žˆ๋Š” components ํด๋”์ธ์ง€ ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ์ •ํ™•ํ•˜๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์š”์ฒญ์— ๋งž์ถฐ ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์ฐพ์•„์ฃผ๋Š” ๋ฐฉ๋ฒ•์ด ์ž˜ ์ •์˜๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋ฒˆ๋“ค๋Ÿฌ์—์„œ Resolution์ด๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ์€ import๋‚˜ require๋˜๋Š” ํŒŒ์ผ ์œ„์น˜๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์ฐพ์•„์ฃผ๋Š” ์ผ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฒˆ๋“ค๋Ÿฌ์—์„œ๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•œ ๊ต‰์žฅํžˆ ์ข‹์€ ๊ธฐ๋ณธ ์„ค์ •์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํฌ๊ฒŒ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๊ณ  ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Resolution - / ๋˜๋Š” ํŒŒ์ผ ์œ„์น˜๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์ฐพ์•„์ฃผ๋Š” ์ผ
Resolution - import/require ๋˜๋Š” ํŒŒ์ผ ์œ„์น˜๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์ฐพ์•„์ฃผ๋Š” ์ผ

ํ˜น์‹œ๋ผ๋„ ์ด๊ฒƒ์„ ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ์™€ ๋‹ค๋ฅด๊ฒŒ React Native์—์„œ๋Š” ios.js, native.js๋ผ๊ณ  ํ•˜๋Š” ํŠน์ˆ˜ํ•œ ํ™•์žฅ์ž๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ๋ฅผ ์ž˜ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฒˆ๋“ค๋Ÿฌ์— ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์„ค์ •์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Metro์—์„œ๋Š” resolveRequest๋ผ๊ณ  ํ•˜๋Š” ๊ต‰์žฅํžˆ ์ง๊ด€์ ์ธ ์ด๋ฆ„์˜ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ง ๊ทธ๋Œ€๋กœ ์š”์ฒญ์„ ์ •ํ™•ํ•œ ํŒŒ์ผ ๊ฒฝ๋กœ๋กœ ํ’€์–ด๋‚ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด resolveRequest๋ผ๊ณ  ํ•˜๋Š” ํ•จ์ˆ˜๋Š” moduleName์ด๋ผ๊ณ  ํ•˜๋Š” ์ธ์ž๋กœ ์š”์ฒญ๋œ ๊ฒƒ์— ๋Œ€ํ•ด์„œ ์ •ํ™•ํ•œ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ ์ž์„ธํ•œ ์„ค๋ช…์ด๋‚˜ ์ŠคํŽ™์€ ๋ฉ”ํŠธ๋กœ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์‹œ๋ฉด ์ดํ•ดํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Resolution - Metro์—์„œ ์„ค์ •ํ•˜๊ธฐ
Resolution - Metro์—์„œ ์„ค์ •ํ•˜๊ธฐ

์ด์™€ ๋น„์Šทํ•˜๊ฒŒ ESBuild์— ๋Œ€ํ•ด์„œ๋„ Resolution์— ๋Œ€ํ•œ ๊ทœ์น™์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ†ตํ•ด์„œ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, onResolve๋ผ๊ณ  ํ•˜๋Š” Metro๋ž‘ ๋น„์Šทํ•œ ์ด๋ฆ„์˜ API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ resolution ๊ทœ์น™์„ ์„ค์ •ํ•˜๊ณ  ์‹ถ์€ ํ•„ํ„ฐ๋ฅผ ์ž˜ ๊ฑธ๊ณ , ํ•„ํ„ฐ์— ํ•ด๋‹นํ•˜๋Š” ์š”์ฒญ์— ๋Œ€ํ•ด์„œ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์„ ํ•จ์ˆ˜๋กœ์จ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Resolution - ESBuild์—์„œ ์„ค์ •ํ•˜๊ธฐ
Resolution - ESBuild์—์„œ ์„ค์ •ํ•˜๊ธฐ

๊ทธ๋ฆฌ๊ณ  ESBuild์—์„œ๋Š” ๊ผญ ์ด๋ ‡๊ฒŒ ๋ณต์žกํ•˜๊ฒŒ ์ •์˜๋ฅผ ํ•˜์ง€ ์•Š๋”๋ผ๋„ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ™•์žฅ์ž ์ •๋„๋งŒ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, resolveExtensions๋ผ๊ณ  ํ•˜๋Š” ์˜ต์…˜๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ตณ์ด ๋ณต์žกํ•˜๊ฒŒ ํ”Œ๋Ÿฌ๊ทธ์ธ ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์ง€ ์•Š๊ณ ๋„ ๊ฐ„๋‹จํ•˜๊ฒŒ resolvingํ•  ํŒŒ์ผ ํ™•์žฅ์ž ๋ชฉ๋ก์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜ ์˜ˆ์‹œ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ./test๋ฅผ .ios.js, .native.js, .js ์ˆœ์œผ๋กœ ์ฐพ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Resolution - ESBuild
Resolution - ESBuild resolveExtensions

์ด๋ ‡๊ฒŒ Resolution์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค. Resolution์„ ๋‹ค ๋๋งˆ์นœ ๋’ค์—๋Š” ์–ด๋–ค ์ผ์ด ๋ฒŒ์–ด์ง„๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹œ๋‚˜์š”? ๊ต‰์žฅํžˆ ๋ชจํ˜ธํ•˜๊ฒŒ ์ž‘์„ฑ๋˜์–ด ์žˆ์—ˆ๋˜ import ๋ฌธ๋“ค์ด ์ •ํ™•ํ•˜๊ฒŒ ์–ด๋–ค ํŒŒ์ผ๋“ค์„ ๊ฐ€๋ฆฌํ‚ค๋Š”์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚˜๊ธฐ ๋•Œ๋ฌธ์—, ์ด์ œ ๊ทธ ํŒŒ์ผ๋“ค์„ ํ•ฉ์น˜๊ธฐ๋งŒ ํ•˜๋ฉด ์ตœ์ข…์ ์ธ ๊ฒฐ๊ณผ๋ฌผ์„ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Load

๊ทธ๋Ÿฐ๋ฐ ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ์ถ”๊ฐ€๋กœ ํ•ด์ฃผ๋Š” ์ž‘์—…์ด ํ•˜๋‚˜๊ฐ€ ๋” ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ Load์ž…๋‹ˆ๋‹ค. ํ‘œ์ค€ JavaScript๋งŒ ์ด์šฉํ•ด์„œ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์ •๋ง ์ข‹๊ฒ ์ง€๋งŒ, ์‚ฌ์‹ค ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์—๋Š” ๊ผญ ๊ทธ๋ ‡์ง€๋งŒ์€ ์•Š์Šต๋‹ˆ๋‹ค. TypeScript๋Š” JavaScript๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์•„์‰ฝ๊ฒŒ๋„ ๋ธŒ๋ผ์šฐ์ €๋‚˜ React Native ํ™˜๊ฒฝ์—์„œ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฒˆ๋“ค๋Ÿฌ๋Š” ํ•ฉ์น˜๊ธฐ๋งŒํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๋Š” ๊ฒƒ์ด์ฃ . TypeScript๋ฅผ JavaScript๋กœ ๋ฐ”๊ฟ”์ฃผ๊ธฐ๋„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋น„์Šทํ•˜๊ฒŒ, React Native์—์„œ๋Š” TypeScript๋Š” ์•„๋‹ˆ์ง€๋งŒ Flow๋ฅผ ์ด์šฉํ•˜๊ณ  ์žˆ๋Š”๋ฐ์š”. ํŠน์ดํ•˜๊ฒŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ณตํ•  ๋•Œ ํ‘œ์ค€ JavaScript๋กœ ๋ฐ”๊พธ์ง€ ์•Š๊ณ  Flow ์ฝ”๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ npm์— ์˜ฌ๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋„ Flow๋Š” ํ‘œ์ค€ JavaScript๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋‹จ์ˆœํžˆ ํ•ฉ์น˜๊ธฐ๋งŒ ํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋„ Flow ์ฝ”๋“œ๋ฅผ JavaScript๋กœ ๋ณ€ํ™˜์‹œ์ผœ์ค˜์•ผ ํ•œ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.

Load
Load

์ด์ฒ˜๋Ÿผ ๋ฒˆ๋“ค๋Ÿฌ๋Š” ๋‹จ์ˆœํžˆ ํŒŒ์ผ์„ ์ฐพ๋Š” ๊ฒƒ์—๋งŒ ๊ทธ์น˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ JavaScript๊ฐ€ ์•„๋‹Œ ๊ฒƒ์„ JavaScript๋กœ ๋ฐ”๊ฟ”์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ž‘์—…์„ ํ•ด์ฃผ๋Š” ๊ฒŒ ๋ฐ”๋กœ Load์ž…๋‹ˆ๋‹ค. ์ •ํ™•ํ•˜๊ฒŒ ๋งํ•˜์ž๋ฉด ์ €ํฌ์˜ ํ”„๋กœ์ ํŠธ ์•ˆ์—์„œ import๋˜๋Š” ๊ฒƒ๋“ค์„ ์‹ค์ œ๋กœ ํ‘œ์ค€ JavaScript๋กœ ์˜ฎ๊ธฐ๋Š” ์ž‘์—…์„ Load๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋ฒˆ๋“ค๋Ÿฌ๋ฅผ ์“ธ ๋•Œ ์ด ์„ค์ •๋„ ์ •ํ™•ํ•˜๊ฒŒ ์ž˜ ์„ค์ •์„ ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์„ธ์ƒ์—๋Š” ๊ต‰์žฅํžˆ ๋‹ค์–‘ํ•œ Loader๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค๋งŒ, ์ผ๋ฐ˜์ ์œผ๋กœ TypeScript๋‚˜ Flow, ์•„๋‹ˆ๋ฉด ์ตœ์‹  JavaScript, ์˜›๋‚ ์—๋Š” optional chaining์ด๋‚˜ async await ๊ฐ™์€ ๋ฌธ๋ฒ•๋„ ์™„๋ฒฝํ•˜๊ฒŒ ํ‘œ์ค€ํ™”๊ฐ€ ๋˜์–ด ์žˆ์ง€ ์•Š์€ ๋•Œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋Ÿฐ ๋น„ํ‘œ์ค€ JavaScript๋ฅผ Babel์ด๋‚˜ SWC์™€ ๊ฐ™์€ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์ด์šฉํ•ด์„œ ํ‘œ์ค€ JavaScript๋กœ ๋ฐ”๊พธ๋Š” Loader๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ React Native์—์„œ๋Š” Flow๋‚˜ TypeScript์™€ ๊ฐ™์ด ๋น„ํ‘œ์ค€ JavaScript๋ฅผ ์“ฐ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„์„œ ์ด๊ฒƒ์„ JavaScript๋กœ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•์„ ์ž˜ ์ •์˜ํ•ด ์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ Loader
์ผ๋ฐ˜์ ์ธ Loader

์ด๊ฒƒ์„ Metro์—์„œ ์–ด๋–ป๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Metro์—์„œ๋Š” transformerPath๋ผ๊ณ  ํ•˜๋Š” ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด์„œ ํŒŒ์ผ์„ transform, ๋‹ค์‹œ ๋งํ•ด, Loadํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ง€์ •ํ•  ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ์—์„œ์™€ ๊ฐ™์ด transformFile์ด๋ผ๊ณ  ํ•˜๋Š” ํ•จ์ˆ˜๋Š” ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ filePath๋ฅผ ๋ฐ›์•„์„œ ํ•ด๋‹น filePath์— ์žˆ๋Š” ๋‚ด์šฉ์„ ์ฝ์€ ๋’ค์— ๊ฒฐ๊ณผ๋ฌผ์„ ์ฝ”๋“œ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ TypeScript ํŒŒ์ผ์„ ์ฝ์€ ๋‹ค์Œ์— 'Babel'์ด๋‚˜ 'SWC'๋กœ ์ปดํŒŒ์ผ ํ•œ ๋‹ค์Œ์— JavaScript ํŒŒ์ผ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž์„ธํ•œ Load์— ๊ด€ํ•œ ์„ค์ •์€ Metro ๊ณต์‹๋ฌธ์„œ์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Load - Metro์—์„œ ์„ค์ •ํ•˜๊ธฐ
Load - Metro์—์„œ ์„ค์ •ํ•˜๊ธฐ

์ด๊ฒƒ๊ณผ ๋น„์Šทํ•˜๊ฒŒ ESBuild์— ๋Œ€ํ•ด์„œ๋„ Load ์„ค์ •์„ ๋ณ€๊ฒฝํ•  ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ „์˜ Metro ์„ค์ •๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ธ์ž์˜ args.path๋ฅผ ํ†ตํ•ด์„œ Load ํŒŒ์ผ์„ ์ง€์ •ํ•˜๋ฉด ์ด๊ฒƒ์„ ์ฝ์–ด์„œ ๋ณ€ํ™˜๋œ ๊ฒฐ๊ณผ๋ฅผ JavaScript๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ชจ์Šต์„ ๋ณผ ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Load - ESBuild์—์„œ ์„ค์ •ํ•˜๊ธฐ
Load - ESBuild์—์„œ ์„ค์ •ํ•˜๊ธฐ

์ง€๊ธˆ๊นŒ์ง€ Resolution๊ณผ Load ๊ณผ์ •์— ๋Œ€ํ•ด์„œ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๋ฒˆ๋“ค๋Ÿฌ๋Š” ์ด์ฒ˜๋Ÿผ Resolution ๊ณผ์ •์„ ๊ฑฐ์น˜๋ฉด import ๋˜๋Š” ํŒŒ์ผ์„ ๋ชจ๋‘ ์ฐพ์•„๋ณผ ์ˆ˜๊ฐ€ ์žˆ๊ณ , ๋กœ๋“œ ๊ณผ์ •์„ ๊ฑฐ์น˜๋ฉด import๋˜๋Š” ํŒŒ์ผ์ด TypeScript๋‚˜ Flow๋ผ๊ณ  ํ•˜๋”๋ผ๋„ ํ‘œ์ค€์ ์ธ JavaScript๋กœ ๋ชจ๋‘ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ import๋˜๋Š” JavaScript ํŒŒ์ผ๋“ค์„ ๋ชจ๋‘ ๋‹ค ์ค€๋น„ํ•œ ์ƒํƒœ์ด๋ฏ€๋กœ ๋ฒˆ๋“ค๋Ÿฌ๋Š” ์ด ํŒŒ์ผ๋“ค์„ ๋ชจ๋‘ ํ•ฉ์น˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์™„์ „ํ•œ 1๊ฐœ์˜ JavaScript ํŒŒ์ผ์ด ์™„์„ฑ๋ฉ๋‹ˆ๋‹ค.

Resolution + Load ๊ฒฐ๊ณผ
Resolution + Load ๊ฒฐ๊ณผ

Optimization

๊ทธ๋Ÿฐ๋ฐ ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ ํ•ฉ์ณ์กŒ๋‹ค๊ณ  ํ•˜๋”๋ผ๋„ ์ด ์ƒํƒœ๋กœ๋Š” ํ”„๋กœ๋•์…˜์— ๋ฐฐํฌํ•  ์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋ฒˆ๋“ค๋ง์„ ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ํŒŒ์ผ์ด ๋„ˆ๋ฌด ์ปค์„œ ์„ฑ๋Šฅ์ด ๋–จ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ผ๋ฐ˜์ ์ธ React Native๋‚˜ ์›น ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ƒ๋‹นํ•œ ์–‘์˜ ์˜์กด์„ฑ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํ† ์Šค๋งŒ ํ•˜๋”๋ผ๋„ ๋‹น์—ฐํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฆฌ์•กํŠธ ์™ธ์—๋„ ๋””์ž์ธ ์‹œ์Šคํ…œ, ์Šคํƒ€์ผ๋ง, ์• ๋‹ˆ๋ฉ”์ด์…˜, ๋‚ ์งœ ๊ณ„์‚ฐ ์ด๋Ÿฐ ๊ฒƒ๋“ค์„ ์œ„ํ•ด์„œ ๊ต‰์žฅํžˆ ๋‹ค์–‘ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ํŠน๋ณ„ํ•œ ์ตœ์ ํ™” ์—†์ด ์ด ํŒŒ์ผ๋“ค์„ ๋‹จ์ˆœํžˆ ํ•ฉ์น˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ํŒŒ์ผ์ด ๋„ˆ๋ฌด ์ปค์ ธ ์„ฑ๋Šฅ์ด ๋–จ์–ด์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Optimization - ๋ฒˆ๋“ค๋Ÿฌ์˜ ๋˜ ํ•˜๋‚˜์˜ ์—ญํ• 
Optimization - ๋ฒˆ๋“ค๋Ÿฌ์˜ ๋˜ ํ•˜๋‚˜์˜ ์—ญํ• 

๊ทธ๋ž˜์„œ ๋ฒˆ๋“ค๋Ÿฌ๋Š” Resolution๊ณผ Load ์™ธ์— Optimization, ๋‹ค์‹œ ๋งํ•ด์„œ ์ตœ์ ํ™” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ํฌ๊ธฐ๋ฅผ ์ž‘๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๊ณ  ํ•  ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ผ ํฌ๊ธฐ๋ฅผ ์ค„์ด๋Š” ํ…Œํฌ๋‹‰์—๋Š” ํฌ๊ฒŒ Minification๊ณผ Tree Shaking์ด ์žˆ์Šต๋‹ˆ๋‹ค. Metro์™€ ESBuild์˜ ์ฐจ์ด๋ฅผ ์กฐ๊ธˆ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ๊ธฐ ์œ„ํ•ด์„œ, ์ด ๊ฐ๊ฐ์˜ ํ…Œํฌ๋‹‰์ด ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”์ง€, 2ํšŒ์—์„œ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


React Native, Metro๋ฅผ ๋„˜์–ด์„œ (2) | ์š”์ฆ˜IT

React Native, Metro๋ฅผ ๋„˜์–ด์„œ (2)

Optimization

Mnification

๋จผ์ € Minification์˜ Compression์ž…๋‹ˆ๋‹ค. Compression์€ ๋ง ๊ทธ๋Œ€๋กœ ์†Œ์Šค ์ฝ”๋“œ์—์„œ ์••์ถ•ํ•  ์ˆ˜ ์žˆ๋Š” ํ…์ŠคํŠธ๋ฅผ ์ตœ๋Œ€ํ•œ ์••์ถ•ํ•˜๋Š” ๊ฑธ ๋งํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ undefined๋ผ๊ณ  ํ•˜๋Š” ๊ฐ’์€ void 0์ด๋ผ๊ณ  ํ‘œํ˜„ํ–ˆ์„ ๋•Œ ์„ธ ๊ธ€์ž๊ฐ€ ์ค„๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋น„์Šทํ•˜๊ฒŒ '2 + 3'์„ '5'๋กœ ์ค„์ธ๋‹ค๋ฉด ํŒŒ์ผ ํฌ๊ธฐ๋ฅผ ์ข€ ๋” ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์™ธ์— ์กฐ๊ฑด๋ฌธ์ด๋‚˜ ์•„๋‹ˆ๋ฉด 'Infinity' ๊ฐ™์€ ์ฝ”๋“œ๋„ ํŠน์ˆ˜ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋ฉด ์งง๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์™ธ์—๋„, ์ด๊ฒƒ๋ณด๋‹ค ์‚ฌ์‹ค ํ›จ์”ฌ ๋ณต์žกํ•œ, ๊ทธ๋ ‡์ง€๋งŒ ๋™์ผํ•œ ์ฝ”๋“œ ๊ฒฐ๊ณผ๋ฌผ์„ ๋‚ด๋Š” ๋‹ค์–‘ํ•œ ์••์ถ• ๋ฐฉ๋ฒ•๋ก ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ถ๊ธˆํ•˜์‹  ๋ถ„๋“ค์€ 'Terser'๋ผ๊ณ  ํ•˜๋Š” ์œ ๋ช…ํ•œ ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ๋ฅผ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

Mnification 1 - Compression (์••์ถ•ํ•˜๊ธฐ)
Mnification 1 - Compression (์••์ถ•ํ•˜๊ธฐ)

๋” ๋‚˜์•„๊ฐ€์„œ, Minification์€ ๋‘ ๋ฒˆ์งธ๋กœ Mangling์ด๋ผ๊ณ  ํ•˜๋Š” ํ…Œํฌ๋‹‰์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ณ€์ˆ˜๋‚˜ ํด๋ž˜์Šค ์•„๋‹ˆ๋ฉด ํ•จ์ˆ˜์˜ ์ด๋ฆ„์„ ๋ฐ”๊ฟˆ์œผ๋กœ์จ ํŒŒ์ผ ํฌ๊ธฐ๋ฅผ ์ค„์ด๋Š” ํ…Œํฌ๋‹‰์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋“ค์€ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์ฝ๋Š” ์‚ฌ๋žŒ์ด ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋„๋ก ๋‹ค์†Œ ๊ธธ๋”๋ผ๋„ ์ข€ ๋” ์„ค๋ช…์ ์ธ ์ด๋ฆ„์„ ๋ถ™์ด๊ณ ๋Š” ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ, ์ด๋ ‡๊ฒŒ ๋ถ™์—ฌ์ง„ ์ด๋ฆ„์€ ๊ฒฐ๊ณผ๋ฌผ์˜ ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ ๊ต‰์žฅํžˆ ์ปค์ง€๋„๋ก ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฒˆ๋“ค๋Ÿฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๋ ‡๊ฒŒ ์ด๋ฆ„์„ ์งง๊ฒŒ ๋ฐ”๊ฟ”์คŒ์œผ๋กœ์จ ํŒŒ์ผ ํฌ๊ธฐ๋ฅผ ์ค„์—ฌ์ค๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์‹œ์—์„œ๋„ num 1๊ณผ num 2๋ฅผ ๊ฐ๊ฐ 'n'๊ณผ 'r'๋กœ ๋ฐ”๊ฟˆ์œผ๋กœ์จ ์ƒ๋‹นํžˆ ์ค„์–ด๋“  ๊ฒƒ์„ ๋ณผ ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Mnification 2 - Mangling (์ด๋ฆ„ ๋ฐ”๊ฟ”์ฃผ๊ธฐ)
Mnification 2 - Mangling (์ด๋ฆ„ ๋ฐ”๊ฟ”์ฃผ๊ธฐ)

๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ๋งŒ๋“  ๋ฐฐํฌ ๊ฒฐ๊ณผ๋ฌผ์„ ๋ณด๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์„ ๊ฒƒ ๊ฐ™์€๋ฐ, ํŒŒ์ผ์„ ์—ด์–ด๋ณด๋ฉด ์ด๋ ‡๊ฒŒ ์ด๋ฆ„์ด ์ฝ๊ธฐ ์–ด๋ ค์šด ํ˜•ํƒœ๋กœ ๋งŽ์ด ๋ฐ”๋€Œ์–ด ์žˆ๋Š” ๊ฒƒ์„ ๋ณด์‹ค ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค.

Tree Shaking

Tree Shaking์€ ๊ธฐ์กด์˜ Minification๊ณผ๋Š” ์•ฝ๊ฐ„ ์ ‘๊ทผ์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๊ธฐ์กด์˜ Minification์€ ์ฝ”๋“œ ๋™์ž‘์„ ์ตœ๋Œ€ํ•œ ์œ ์ง€ํ•œ ์ƒํƒœ๋กœ ์ฝ”๋“œ๋ฅผ ์••์ถ•ํ•˜๋Š” ๋ฐ์—๋งŒ ๋จธ๋ฌผ๋ €๋‹ค๋ฉด Tree Shaking์€ import ๋œ ์ฝ”๋“œ ๊ฐ€์šด๋ฐ ์•ˆ ์“ฐ๋Š” ์ฝ”๋“œ๋ฅผ ์„ ์ œ์ ์œผ๋กœ ์‚ญ์ œํ•˜๋Š” ํ…Œํฌ๋‹‰์ž…๋‹ˆ๋‹ค. ์•ˆ ์“ฐ๋Š” ์ฝ”๋“œ๋ฅผ ์‚ญ์ œํ•œ๋‹ค๋‹ˆ๊นŒ ์ •๋ง ์ข‹์„ ๊ฒƒ ๊ฐ™์€๋ฐ, ์‹ค์ œ๋กœ๋Š” Tree Shaking์€ ๊ต‰์žฅํžˆ ์–ด๋ ค์šด ์ž‘์—…์ž…๋‹ˆ๋‹ค.

์™œ ์–ด๋ ค์šด์ง€ ๋‘ ๊ฐ€์ง€ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด์„œ ์ด๊ฑฐ ํ•œ๋ฒˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์‹œ๋ฅผ ๋ณด์‹œ๋ฉด, ๋จผ์ €, ์ฒซ ๋ฒˆ์งธ ์ฝ”๋“œ๋Š” toss/utils ํ•จ์ˆ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ add๋ผ๊ณ  ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ ธ์™€์„œ ์“ฐ๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด add ํ•จ์ˆ˜ ๋ง๊ณ ๋„ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋“ค์€ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์ด ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ์ฝ”๋“œ๋Š” ์•ฝ๊ฐ„ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ๋Š” ์–ด๋–ค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ import๋ฅผ ํ•˜๊ณ  ์žˆ์ง€๋งŒ, ๊ทธ๋Ÿฐ๋ฐ ๊ทธ import ๋ฌธ์—์„œ ์•„๋ฌด๊ฒƒ๋„ ๊ฐ€์ ธ์˜ค๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋‘ ๋ฒˆ์งธ ์ฝ”๋“œ์—์„œ๋Š” ์•„๋ฌด๊ฒƒ๋„ ๊ฐ€์ ธ์˜ค๊ณ  ์žˆ์ง€๋Š” ์•Š์œผ๋‹ˆ, ๊ทธ๋ƒฅ import ๋ฌธ์„ ์‚ญ์ œํ•ด ๋ฒ„๋ ค๋„ ๋˜๋Š”์ง€ ์˜๋ฌธ์ด ์ƒ๊น๋‹ˆ๋‹ค. ์™ ์ง€ ์•ˆ ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Tree Shaking
Tree Shaking

๋‘ ๋ฒˆ์งธ ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด ์•ฝ๊ฐ„์”ฉ ๋ถˆ์•ˆํ•ด์ง€๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. toss/utils์—์„œ add๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ฒซ ๋ฒˆ์งธ ์˜ˆ์‹œ์—์„œ๋„ ํ•จ๋ถ€๋กœ ๋ญ”๊ฐ€ ์•ˆ ์“ธ ๊ฒƒ ๊ฐ™์ด ๋ณด์ด๋Š” ์ฝ”๋“œ๋ฅผ ์ง€์› ๋‹ค๊ฐ€ ์˜ˆ๊ธฐ์น˜ ๋ชปํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ํ• ์ง€ ๊ต‰์žฅํžˆ ๋ถˆ์•ˆํ•ด์ง‘๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ Tree Shaking์€ ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์žˆ์–ด์„œ ๊ต‰์žฅํžˆ ์–ด๋ ค์šด ์ ๋“ค์ด ๋งŽ์€ ๊ธฐ๋Šฅ์ผ ๊ฒƒ์ด๋ผ๊ณ  ์ถ”์ธกํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค ๋•Œ ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ์•ˆ์ „ํ•˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ์‚ญ์ œ์‹œ์ผœ ์ค„ ์ˆ˜ ์žˆ๋„๋ก sideEffects๋ผ๊ณ  ํ•˜๋Š” ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, sideEffects๋Š” ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ํ•จ๋ถ€๋กœ ์ง€์›Œ์„œ๋Š” ์•ˆ ๋˜๋Š” ๊ทธ๋Ÿฐ ํŒŒ์ผ ๋ชฉ๋ก์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด์„œ, ๋ฒˆ๋“ค๋Ÿฌ๋Š” sideEffects๊ฐ€ false์ด๋ฉด, ๊ทธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์•ˆ์—์„œ ์–ด๋–ค ํŒŒ์ผ์ด ์•ˆ ์“ฐ์˜€๋‹ค๊ณ  ํ•˜๋ฉด ๋ฌด์กฐ๊ฑด ์•ˆ์ „ํ•˜๊ฒŒ ์ง€์šธ ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š๊ณ  sideEffects์— ์ง€์šฐ๋ฉด ์•ˆ ๋˜๋Š” ๊ทธ๋Ÿฐ ํŒŒ์ผ ๋ชฉ๋ก์ด ์ง€์ •๋˜์–ด ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค๋ฉด, ๊ทธ ํŒŒ์ผ๋“ค์€ import ๋๋Š”๋ฐ, ์•ˆ ์“ฐ๊ณ  ์žˆ๋‹ค๊ณ  ํ•˜๋”๋ผ๋„ ์ง€์›Œ์ง€์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

๊ฒŒ๋‹ค๊ฐ€ ์ด ์˜ˆ์‹œ๋Š” Tree Shaking์„ ๊ฐ€์žฅ ์‰ฝ๊ฒŒ ์“ธ ์ˆ˜ ์žˆ๋Š” ํžŒํŠธ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ ๋ฒˆ๋“ค๋Ÿฌ๋Š” ์ด๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋ณต์žกํ•œ ๊ณผ์ •์„ ๊ฑฐ์ณ์„œ Tree Shaking์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฒˆ๋“ค๋Ÿฌ ์ž…์žฅ์—์„œ๋Š” ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ์ƒ๋‹นํžˆ ๊นŒ๋‹ค๋กœ์šด ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Tree Shaking
Tree Shaking

๊ทธ๋ž˜์„œ ์•ž์„œ ๋ดค๋˜ ์ฝ”๋“œ๋“ค ๊ฐ€์šด๋ฐ, ์ฝ”๋“œ๋ฅผ ๊ทธ๋ƒฅ ๋‹จ์ˆœํžˆ ๋” ์งง๊ฒŒ ๋งŒ๋“œ๋Š” Minification์€ ๋Œ€๋ถ€๋ถ„์˜ ๋ฒˆ๋“ค๋Ÿฌ์—์„œ Terser์™€ ๊ฐ™์€ ์˜คํ”ˆ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด Tree Shaking์€ ์ƒ๋‹นํžˆ ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ๊นŒ๋‹ค๋กœ์šด ์–ด๋–ค ๊ทธ๋Ÿฐ ๊ธฐ๋Šฅ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ถ€ ๋ฒˆ๋“ค๋Ÿฌ์—์„œ๋Š” ์ง€์›ํ•˜์ง€ ๋ชปํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ Metro๋Š” ์•„์ง Tree Shaking์„ ์ง€์›ํ•˜๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฝ์šฐ์— ๋”ฐ๋ผ์„œ JavaScript ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ ์ปค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด์ œ ์ €ํฌ๊ฐ€ ์˜ฎ๊ธฐ๋ ค๊ณ  ํ•˜๋Š” ESBuild๋Š” ์ด ๊ธฐ๋Šฅ์„ ๊ธฐ๋ณธ์œผ๋กœ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.


์š”์•ฝ - ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ํ•˜๋Š” ์„ธ ๊ฐ€์ง€ ์—ญํ• 

์ง€๊ธˆ๊นŒ์ง€ ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ํ•˜๋Š” ์„ธ ๊ฐ€์ง€์˜ ์—ญํ• ์„ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์–ด๋ ค์šด ๋‚ด์šฉ๋“ค๋„ ๋‚˜์™”๊ธฐ ๋•Œ๋ฌธ์— ํ•œ ๋ฒˆ ์ •๋ฆฌํ•˜๊ณ  ๋„˜์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฒˆ๋“ค๋Ÿฌ๋Š” ํ•˜๋‚˜์˜ JavaScript ๋ฒˆ๋“ค์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ Resloution, Load, Optimization์˜ ์„ธ ๊ฐ€์ง€ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ํ•˜๋Š” ์ผ
๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ํ•˜๋Š” ์ผ

๋จผ์ € Resloution์€ import๋˜๋Š” ๊ทธ๋Ÿฐ ๋ชจํ˜ธํ•œ ํŒŒ์ผ ๊ฒฝ๋กœ๋“ค์„ ์ •ํ™•ํ•œ ํŒŒ์ผ ๊ฒฝ๋กœ๋กœ ๋ฐ”๊ฟ”์ค๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฒˆ๋“ค๋ง๋œ ๊ฒฐ๊ณผ๋ฌผ์— ์–ด๋–ค ํŒŒ์ผ๋“ค์ด ํฌํ•จ๋˜๋Š”์ง€๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ Load๋Š” ๊ทธ ํŒŒ์ผ๋“ค์ด TypeScript๋‚˜ Flow์ฒ˜๋Ÿผ JavaScript๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ํ•˜๋”๋ผ๋„ JavaScript๋กœ ๋ณ€ํ™˜ํ•ด ์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ Resloution์ด๋ž‘ Load๋ฅผ ํ•˜๋ฉด ๋ฒˆ๋“ค์— ์–ด๋–ค ํŒŒ์ผ๋“ค์ด ํฌํ•จ๋˜๋Š”์ง€๋ฅผ ์ „๋ถ€ ์•Œ ์ˆ˜ ์žˆ๊ณ  ๊ทธ๊ฒƒ์„ ๋ชจ๋‘ JavaScript๋กœ ๋ณ€ํ™˜์‹œํ‚ค๋Š” ๊ฒƒ์ด๋ฏ€๋กœ, ์™„๋ฒฝํ•œ ๋ฒˆ๋“ค์„ ๋งŒ๋“ค ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๊ทธ ๋ฒˆ๋“ค ์ž์ฒด๋งŒ์œผ๋กœ๋Š” ๋ฒˆ๋“ค์˜ ๊ฒฐ๊ณผ๊ฐ€ ์ƒ๋‹นํžˆ ํฌ๊ฒŒ ๋˜๋‹ˆ๊นŒ ์ด๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ์ž‘์—…์ด ํ•„์š”ํ•œ๋ฐ, Optimization์—์„œ Minification ๊ทธ๋ฆฌ๊ณ  Tree Shaking์„ ํ†ตํ•ด์„œ ๊ฒฐ๊ณผ๋ฌผ์˜ ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


Metro๋ฅผ ESBuild๋กœ ๋ฐ”๊พธ๋Š” ์—ฌ์ •

์ง€๊ธˆ๊นŒ์ง€ ์‚ดํŽด๋ดค๋˜ ๊ฒƒ๊ณผ ๊ฐ™์ด Metro์™€ ESBuild๋Š” ๋ชจ๋‘ ๋ฒˆ๋“ค๋Ÿฌ๋กœ์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ Resloution, Load, ๊ทธ๋ฆฌ๊ณ  Optimization ์„ธ ๊ฐ€์ง€ ์—ญํ• ์„ ํ•œ๋‹ค๊ณ  ํ•  ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฐ๊ฐ์˜ ์—ญํ• ๋“ค์— ๋Œ€ํ•œ ์„ค์ •๋“ค์„ ๋™์ผํ•˜๊ฒŒ ๋งž์ถ˜๋‹ค๊ณ  ํ•œ๋‹ค๋ฉด Metro๊ฐ€ ํ•˜๋Š” ์—ญํ• ์„ ๊ฑฐ์˜ ๊ทธ๋Œ€๋กœ ESBuild๋กœ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ง์ด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ† ์Šค ํ”„๋ก ํŠธ ํ”Œ๋žซํผ ํŒ€์—์„œ๋Š” ์ด๋ ‡๊ฒŒ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. โ€œ๊ธฐ๋ณธ์ ์œผ๋กœ Metro๋ž‘ ESBuild๋Š” ๋ชจ์–‘๋งŒ ๋‹ค๋ฅผ ๋ฟ ๋˜‘๊ฐ™์€ ์—ญํ• ์„ ํ•˜๋Š”๋ฐ ์„ค์ •์„ ๊ฑฐ์˜ ๊ทธ๋Œ€๋กœ ์˜ฎ๊ธด๋‹ค๋ฉด ์‹ค์ œ๋กœ React Native์—์„œ๋„ ESBuild๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ?โ€

Metro์™€ ESBuild
Metro์™€ ESBuild

์ด๋Ÿฐ ์ƒ๊ฐ์—์„œ ์ถœ๋ฐœํ•ด์„œ ์‹ค์ œ๋กœ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์ฐพ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค. 'oblador/react-native-esbuild'๋ผ๊ณ  ํ•˜๋Š” ๋ ˆํฌ์ง€ํ† ๋ฆฌ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ Metro์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ต‰์žฅํžˆ ๋‹ค์–‘ํ•œ ์„ค์ •๋“ค์„ ESBuild์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์˜ฎ๊ธด ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•ด์„œ ์„ค์ •์„ ์ ์šฉํ•œ๋‹ค๋ฉด ๋™์ผํ•˜๊ฒŒ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ์„ ๊ฑฐ๋ผ๋Š” ํ™•์‹ ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ† ์Šค ํŒ€์—์„œ๋Š” ์ด ๋ ˆํฌ์Šคํ† ๋ฆฌ์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด์„œ ์–ด๋–ค ์ฝ”๋“œ๋“ค์ด ์žˆ๋Š”์ง€ ๋ถ„์„ํ–ˆ์Šต๋‹ˆ๋‹ค.

GitHub - oblador/react-native-esbuild: Fast bundler and dev server for react-native using esbuild
Fast bundler and dev server for react-native using esbuild - oblador/react-native-esbuild

์ €ํฌ๊ฐ€ ๋ถ„์„ ๊ณผ์ •์—์„œ ์•Œ๊ฒŒ ๋œ ์ ์„ ์ด์•ผ๊ธฐํ•˜๋ ค๋Š”๋ฐ์š”.. ์ฝ”๋“œ์˜ 'line by line'๊นŒ์ง€๋Š” ์•„๋‹ˆ๊ณ  ๋ฒˆ๋“ค๋Ÿฌ์˜ ์„ธ ๊ฐ€์ง€ ์—ญํ• ์ธ Resloution, Load, ๊ทธ๋ฆฌ๊ณ  Optimization ๊ฐ๊ฐ์˜ ๊ด€์ ์—์„œ Metro์˜ ์„ค์ •์„ ์–ด๋–ป๊ฒŒ ESBuild๋กœ ์˜ฎ๊ฒผ๋Š”์ง€, ๊ทธ ํ•ต์‹ฌ์ ์ธ ์ฝ”๋“œ๋“ค์„ ์œ„์ฃผ๋กœ ์†Œ๊ฐœํ•ด ๋“œ๋ฆฌ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํ˜น์‹œ๋ผ๋„ ์„ค๋ช…์„ ๋“ค์–ด๋ณด์‹œ๊ณ  ๋” ๊ถ๊ธˆํ•˜์‹  ์ ์ด ์ƒ๊ธฐ์…จ๋‹ค๋ฉด, ๊นƒํ—ˆ๋ธŒ์˜ 'react-native-esbuild' ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

Resolution

๋จผ์ € Resolution์ž…๋‹ˆ๋‹ค. Resolution ๊ด€์ ์—์„œ Metro๋ž‘ ESBuild๊ฐ€ ๊ฐ€์žฅ ๋‹ฌ๋ž๋˜ ์ ์€ ํ™•์žฅ์ž์ž…๋‹ˆ๋‹ค. ์›น์—์„œ๋Š” .ts, .tsx, .js์ฒ˜๋Ÿผ ๊ต‰์žฅํžˆ ๋‹จ์ˆœํ•œ ํ™•์žฅ์ž๋งŒ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ˜๋ฉด, React Native์—์„œ๋Š” ์กฐ๊ธˆ ๋‹ค๋ฅด๊ฒŒ .ios.js, android.js, .native.js ๊ฐ™์€ ํ™•์žฅ์ž๋ฅผ ์‚ฌ์šฉํ•˜๊ณค ํ–ˆ์Šต๋‹ˆ๋‹ค. iOS์—์„œ๋งŒ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ๋Š” ios.js๋ผ๊ณ  ๋ช…์‹œํ•˜๋Š” ์‹์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ESBuild์—์„œ๋„ ์ด ํŠน๋ณ„ํ•œ ํ™•์žฅ์ž๋“ค์— ๋Œ€์‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„์€ ๋‹คํ–‰ํžˆ๋„ ์•ž์„œ ์†Œ๊ฐœํ•ด ๋“œ๋ ธ๋˜ resolveExtensionstensions ์„ค์ •์œผ๋กœ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ฒจ๋ถ€ํ•œ ์†Œ์Šค ์ฝ”๋“œ์—์„œ์™€ ๊ฐ™์ด resolveExtensionstensions๋ฅผ ์ž‘์„ฑํ•˜๋ฉด .ios์—์„œ .native ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋ ‡๊ฒŒ ํ•ด์„œ ์—†๋Š” ๊ฒƒ๊นŒ์ง€ ์ˆœ์„œ๋Œ€๋กœ ์ฐพ๋Š” ์‹์ด์—ˆ์Šต๋‹ˆ๋‹ค.

Resolution - resolveExtensionstensions
Resolution - resolveExtensionstensions

Load

๋‹ค์Œ์œผ๋กœ ์‹ ๊ฒฝ ์จ์•ผ ํ–ˆ๋˜ ๊ฒƒ์€ Load์ž…๋‹ˆ๋‹ค. React Native์—์„œ๋Š” ํŠน์ดํ•œ ๋ฌธ๋ฒ•๋“ค์„ ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ React Native์˜ ์ฝ”์–ด๋Š” Flow๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์‚ฌ์šฉํ•˜๋Š” React Native์˜ reanimated๋ผ๊ณ  ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ๋Š” 'worklet'์ด๋ผ๊ณ  ํ•˜๋Š” ํŠน์ˆ˜ํ•œ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฐ ๋ฌธ๋ฒ•์— ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํŠน๋ณ„ํ•˜๊ฒŒ Load๋ฅผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •์˜๋ฅผ ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ํ•œ๋ฒˆ ์‚ดํŽด๋ณด์‹œ๋ฉด, ๋ชจ๋“  ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์„ ๋Œ€์ƒ์œผ๋กœ Flow ๋ฌธ๋ฒ•์„ ํฌํ•จํ•œ ๊ฒฝ์šฐ์—๋Š” Babel๋กœ ์ปดํŒŒ์ผ์„ ๋„ฃ์–ด์„œ Flow ๋ฌธ๋ฒ•์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” JavaScript ์ฝ”๋“œ๋กœ ๋ฐ”๊ฟ”์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ reanimated์˜ worklet ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ํŠน์ˆ˜ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ด์šฉํ•ด์„œ ํ•จ์ˆ˜๋ฅผ ์ปดํŒŒ์ผํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ Flow์™€ TypeScript ๊ทธ๋ฆฌ๊ณ  worklet ํ•จ์ˆ˜์— ๋Œ€์‘ํ•˜๋„๋ก ํ•˜๋‹ˆ๊นŒ ํŠน์ˆ˜ํ•œ ๋ฌธ๋ฒ•์—๋„ ์•ˆ์ „ํ•˜๊ฒŒ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

Load - Flow/Typescript Loader
Load - Flow/Typescript Loader

Optimization

ํŠน๋ณ„ํ•˜๊ฒŒ ์„ค์ •ํ•˜์ง€ ์•Š์•„๋„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ด๋“์„ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ Optimization์ž…๋‹ˆ๋‹ค. Metro๋Š” ์ด์ œ ESbuild๋Š” Metro์™€ ๋‹ค๋ฅด๊ฒŒ Tree Shaking์„ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ ์“ฐ๋Š” import๋“ค์„ ์ง€์›€์œผ๋กœ์จ ํŒŒ์ผ ํฌ๊ธฐ๋ฅผ ํฌ๊ฒŒ ๊ฐ์†Œ์‹œํ‚ฌ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

Minification, ๋‹ค์‹œ ๋งํ•ด์„œ ํŒŒ์ผ ํฌ๊ธฐ ์••์ถ•์˜ ๊ฒฝ์šฐ์—๋Š” ์–‘์ชฝ ๋ฒˆ๋“ค๋Ÿฌ์—์„œ ๋ชจ๋‘ ๋‹ค ์ง€์›ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ† ์Šค์—์„œ๋Š” ESBuild๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ JavaScript์˜ ํŒŒ์ผ ํฌ๊ธฐ๋ฅผ ํฌ๊ฒŒ ์ค„์ผ ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ ์™ธ๋กœ Metro๊ฐ€ ํŠน๋ณ„ํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฒƒ๋“ค ๋ช‡ ๊ฐœ๋ฅผ ๋Œ€์‘์„ ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ ์™ธ, Metro๊ฐ€ ํŠน๋ณ„ํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฒƒ๋“ค
๊ทธ ์™ธ, Metro๊ฐ€ ํŠน๋ณ„ํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฒƒ๋“ค

๋Œ€ํ‘œ์ ์œผ๋กœ๋Š” InitializeCore.js๋ผ๋Š”, React Native์˜ ์ฝ”์–ด ์˜์—ญ์„ ์ดˆ๊ธฐํ™”์‹œ์ผœ ์ฃผ๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์–ด๋–ค ์ฝ”๋“œ๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰์‹œ์ผฐ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ , 'hermes' ์—”์ง„ ๊ฐ™์€, ์—”์ง„์—์„œ ์ง€์›๋˜์ง€ ์•Š๋Š” JavaScript์˜ ๋‚ด์žฅ ๊ฐ์ฒด ํ˜น์€ API๋ฅผ ์œ„ํ•ด์„œ 'Polyfill'๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.


๊ฒฐ๊ณผ

๊ฐ€์žฅ ๊ธฐ์–ต์— ๋‚จ๋Š” ๊ฒฐ๊ณผ๋Š” ๋นŒ๋“œ๊ฐ€ ๊ต‰์žฅํžˆ ์ผ๊ด€์ ์œผ๋กœ ๋ณ€ํ–ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Metro๋Š” ๋ฒˆ๋“ค๋Ÿฌ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ณผ์ •์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ๋งŽ์€ ์บ์‹ฑ ๋กœ์ง์„ ์“ฐ๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์บ์‹ฑ์ด ์ œ๋•Œ ํ’€๋ฆฌ์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„์„œ ์ˆ˜๋™์œผ๋กœ '--reset-cache'๋ผ๊ณ  ํ•˜๋Š” ์˜ต์…˜์„ ์ด์šฉํ•ด์„œ ๋นŒ๋“œ๋ฅผ ํ•ด์ค˜์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ESBuild๋Š” ์›๋ž˜๋ถ€ํ„ฐ ์›Œ๋‚™ ๋น ๋ฅด๊ธฐ๋„ ํ•˜๊ณ , ์บ์‹ฑ์ด ๋ฌธ์ œ๊ฐ€ ๋˜์ง€๋Š” ์•Š์•„์„œ ๋” ์ด์ƒ ๋นŒ๋“œํ•  ๋•Œ ํ•ด๋‹น ์˜ต์…˜์„ ๊ณ„์† ์—ผ๋‘์— ๋‘์ง€ ์•Š์•„๋„ ๋์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ๊ฒฝํ—˜์ด ๊ต‰์žฅํžˆ ์ข‹์•„์ง„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ๋Š” ๋นŒ๋“œ ์†๋„๊ฐ€ ๋ณ€ํ–ˆ์Šต๋‹ˆ๋‹ค. Metro๋Š” JavaScript๋กœ ๊ตฌํ˜„์ด ๋˜์–ด ์žˆ๊ณ  ESBuild๋งŒํผ ๋™์‹œ์„ฑ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋„ ์•Š์•„์„œ ๋นŒ๋“œ ์†๋„๊ฐ€ ๋งŽ์ด ๋А๋ ธ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ESBuild๋Š” Go ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ณ  Goroutine์„ ์ด์šฉํ•ด์„œ ๋™์‹œ์„ฑ์„ ๊ฐ•๋ ฅํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋นŒ๋“œ ์†๋„๋ฅผ ๊ฑฐ์˜ 10๋ถ„์˜ 1 ๊ฐ€๊นŒ์ด ์ค„์ผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ์‚ฌ์ดํด์ด ๋งŽ์ด ์งง์•„์ง€๊ฒŒ ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ - ๋นŒ๋“œ ์†๋„
๊ฒฐ๊ณผ - ๋นŒ๋“œ ์†๋„

๋งˆ์ง€๋ง‰์œผ๋กœ๋Š”, ESBuild์—์„œ๋Š” Metro์™€ ๋‹ค๋ฅด๊ฒŒ Tree Shaking์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์•ˆ ์“ฐ๋Š” ์ฝ”๋“œ๋ฅผ ํ›จ์”ฌ ๋” ์ ๊ทน์ ์œผ๋กœ ์‚ญ์ œํ•˜๋Š” ๊ฒŒ ๊ฐ€๋Šฅํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ๋•๋ถ„์— ํ† ์Šค์—์„œ๋Š” React Native์˜ JavaScript ํŒŒ์ผ ํฌ๊ธฐ๋ฅผ ํฌ๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋Œ€ํ‘œ์ ์œผ๋กœ ํ† ์Šค์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” '๋‚ด ํฌ์ธํŠธ ์„œ๋น„์Šค'์˜ React Native ๋ฒˆ๋“ค์˜ ๊ฒฝ์šฐ, hermes ๋ฐ”์ดํŠธ ์ฝ”๋“œ ๊ธฐ์ค€์œผ๋กœ ์›๋ž˜ Metro์—์„œ๋Š” 1.8MB ์ •๋„ ๋˜๋Š” ๊ฝค ํฐ ํฌ๊ธฐ์˜ ์‚ฌ์ด์ฆˆ์˜€๋Š”๋ฐ ESBuild์—์„œ๋Š” 0.6MB ์ •๋„๋กœ ํฌ๊ธฐ๋ฅผ ํฌ๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ - Tree-Shaking
๊ฒฐ๊ณผ - Tree-Shaking

์ง€๊ธˆ๊นŒ์ง€ ์–ด๋–ป๊ฒŒ ํ† ์Šค๊ฐ€ Metro์—์„œ ESBuild๋กœ ์˜ฎ๊ธฐ์ž๋Š” ๊ฒฐ์ •ํ•˜๊ฒŒ ๋์œผ๋ฉฐ, ๋Œ€๋žต์ ์œผ๋กœ๋‚˜๋งˆ ์–ด๋–ป๊ฒŒ ์ฝ”๋“œ๋ฅผ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ์—ˆ๋Š”์ง€์— ๋Œ€ํ•ด์„œ ์†Œ๊ฐœํ•ด ๋“œ๋ ธ์Šต๋‹ˆ๋‹ค.


๋งˆ์น˜๋ฉฐ

๊ธ€์„ ๋งˆ์น˜๊ธฐ ์ „์—, ์ง€๊ธˆ๊นŒ์ง€ ์•Œ์•„๋ณธ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฐœํ‘œ ๋‚ด์šฉ ๋˜์งš์–ด๋ณด๊ธฐ
๋ฐœํ‘œ ๋‚ด์šฉ ๋˜์งš์–ด๋ณด๊ธฐ

๋จผ์ €, ๋ฒˆ๋“ค๋Ÿฌ์— ๋Œ€ํ•ด์„œ ๋งŽ์ด ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๋ฒˆ๋“ค๋Ÿฌ๋Š” ์ชผ๊ฐœ์ง„ ํŒŒ์ผ์„ ํ•˜๋‚˜๋กœ ํ•ฉ์น˜๊ณ  ์ตœ์ ํ™”ํ•˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ ์œ„ํ•ด์„œ๋Š” ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์ฐพ๋Š” Resolution, ๊ทธ๋ฆฌ๊ณ  TypeScript๋‚˜ Flow์ฒ˜๋Ÿผ ๋น„ํ‘œ์ค€ ์ฝ”๋“œ๋ฅผ ๋ฐ”๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” JavaScript๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” Load ๋ฐฉ๋ฒ•์„ ์„ค์ •ํ•ด ์ค˜์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Optimization ์ž‘์—…์œผ๋กœ ๊ฒฐ๊ณผ๋ฌผ์„ ์ตœ์ ํ™”์‹œ์ผœ ์ค˜์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฐœํ‘œ ๋‚ด์šฉ ๋˜์งš์–ด๋ณด๊ธฐ
๋ฐœํ‘œ ๋‚ด์šฉ ๋˜์งš์–ด๋ณด๊ธฐ

๊ทธ๋ฆฌ๊ณ  Metro์™€ ESBuild๋Š” ๋ชจ๋‘ ๋ฒˆ๋“ค๋Ÿฌ๋ผ๊ณ  ํ•˜๋Š” ์ ์—์„œ ์•ž์„œ ์–ธ๊ธ‰ํ•œ ์„ธ ๊ฐ€์ง€ ๋ถ€๋ถ„์— ๋Œ€ํ•œ ์„ค์ •์„ ๊ทธ๋Œ€๋กœ ์˜ฎ๊ธฐ๋ฉด ๋˜‘๊ฐ™์ด ๋™์ž‘ํ•  ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์•ž์„œ 'react-native-esbuild'๋ผ๊ณ  ํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์†Œ๊ฐœํ•ด ๋“œ๋ฆฌ๋ฉด์„œ Resolution๊ณผ Load ๊ด€์ ์—์„œ ํ•ต์‹ฌ์ ์ธ ์„ค์ •๋“ค์„ ์„ค๋ช…ํ•ด ๋“œ๋ ธ์Šต๋‹ˆ๋‹ค.

๊ทธ ๊ฒฐ๊ณผ๋กœ ํ† ์ŠคํŒ€์—์„œ๋Š” ์ผ๊ด€์ ์ธ ๋นŒ๋“œ ๊ทธ๋ฆฌ๊ณ  ํฐ ์†๋„ ๊ฐœ์„ , ๋งˆ์ง€๋ง‰์œผ๋กœ Tree Shaking์„ ํ†ตํ•œ ํŒŒ์ผ ํฌ๊ธฐ ์ตœ์ ํ™”๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.


  1. FEConf2023์—์„œ ๋ฐœํ‘œ๋œ 'React Native, Metro๋ฅผ ๋„˜์–ด์„œ / ๋ฐ•์„œ์ง„ ํ† ์Šค ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž โ†ฉ๏ธŽ