React Native, Metro๋ฅผ ๋์ด์ (1,2)
React Native, Metro๋ฅผ ๋์ด์ (1,2) ๊ด๋ จ
[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๋ฅผ ์ด์ฉํด์ ๊ฐ๋ฐํ๋ค ๋ณด๋ฉด ์์ฐ์ค๋ฝ๊ฒ Metro๋ผ๊ณ ํ๋ ๊ฒ์ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค. ์น์ ์นํฉ์ด ์๋ค๋ฉด React Native์๋ Metro๊ฐ ์์ต๋๋ค. ๊ทธ์ผ๋ง๋ก ๊ฐ๋ฐ ์๋ฒ๋ฅผ ๋์ธ ๋๋ถํฐ ํ๋ก๋์ ์ ๋ฐฐํฌํ ๋๊น์ง ์ ๋ง ๋ง์ ๊ณณ์์ ๋ง๋๊ฒ ๋๋ ๋๊ตฌ์ ๋๋ค.
๊ทธ๋ฐ๋ฐ Metro๋ฅผ ์ฐ๋ค ๋ณด๋ฉด ๋๊ฒ ๋ค์ํ ๋ฌธ์ ์ ์ ๋ง๋๊ฒ ๋ฉ๋๋ค.
์ฒซ์งธ, '--reset-cache
'๋ผ๊ณ ํ๋ ๊ต์ฅํ ์ ๋ช
ํ ์ต์
์ด ์์ต๋๋ค. ์ผ๋ฐ์ ์ธ ์น ๊ฐ๋ฐ์ ํ๋ ๊ฒ๊ณผ ๋ค๋ฅด๊ฒ ์๋์ผ๋ก ๋งค๋ฒ ์บ์๋ฅผ ๋ ๋ ค์ค์ผ ํ๋ค ๋ณด๋ ์ข ๋ถํธํ ์ ์ด ์์ต๋๋ค. ๋์งธ, ๋ณ๊ฑฐ ์๋ ์๋น์ค์์๋ ๋ถ๊ตฌํ๊ณ ๋ฐ๋ธ ์๋ฒ๋ถํฐ ํ๋ก๋์
๋น๋๊น์ง ์๋นํ๊ฒ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ ธ์ต๋๋ค. Metro์ ๋ก๋ฉ ์ธ๋์ผ์ดํฐ๊ฐ ์๋๋ฐ, ๊ทธ ์ธ๋์ผ์ดํฐ๋ฅผ ๋ณด๋ค ๋ณด๋ฉด ๋ง์ด ๋ต๋ตํ๊ณ ๋ ํ์ต๋๋ค. ์
์งธ, ํ๋์ ์ธ ์ด๋ค ๊ทธ๋ฐ ๋ฒ๋ค๋ฌ์ ๋ค๋ฅด๊ฒ Tree Shaking๊ณผ ๊ฐ์ ์ต์ ํ ๋๊ตฌ๋ฅผ ์ง์ํ์ง ์์์, ๋น๋๋ ๊ฒฐ๊ณผ๋ฌผ์ด ํ์ ์ด์์ผ๋ก ํฌ๊ธฐ๋ ํ์ต๋๋ค.
ํ ์ค์์๋ ์ด๋ฐ ๋ฌธ์ ๋ค์ ESBuild๋ผ๊ณ ํ๋ ๋ฒ๋ค๋ฌ๋ฅผ ๋์
ํจ์ผ๋ก์จ ํด๊ฒฐํ์ต๋๋ค. ๋จ์ํ ๋ฒ๋ค๋ฌ๋ฅผ ๊ต์ฒดํ ๊ฒ๋ง์ผ๋ก๋ reset-cache
๋ผ๊ณ ํ๋ ๊ฒ์ ๋ ์ด์ ๊ธฐ์ตํ์ง ์์๋ ๋๊ณ , ๋น๋ ์๋๋ ๋๋ถ์๊ฒ ๋นจ๋ผ์ก์ผ๋ฉฐ, Tree Shaking์ ํตํด์ ์ฌ์ฉ์๋ค์ด ๋ด๋ ค๋ฐ์์ผ ํ๋ JavaScript์ ํ์ผ ํฌ๊ธฐ๋ ๋ง์ด ์ค์ผ ์๊ฐ ์์์ต๋๋ค.
๊ทธ์ผ๋ง๋ก ๋ง๋ฒ๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ผ๊ณ ๋ ํ ์ ์์ต๋๋ค. ๊ทธ๋์ ์์ ์๊ฐํด ๋๋ ธ๋ ๋ฐ์ ๊ฐ์ด Metro์ ESBuild์ ๊ฐ์ ๊ทธ๋ฐ ๋ฒ๋ค๋ฌ๊ฐ ๊ตฌ์ฒด์ ์ผ๋ก ์ด๋ค ์ญํ ์ ํ๋์ง์ ๋ํด์ ์์๋ณด๋ฉด์, ํ ์ค๊ฐ ์ด๋ป๊ฒ Metro์์ ESBuild๋ก ์ ํํ ์ ์์๋์ง๋ฅผ ์๊ฐํด ๋๋ฆฌ๋ ค๊ณ ํฉ๋๋ค.
๋ฒ๋ค๋ฌ: Metro์ ESBuild (+Webpack)๋ ๋ฌด์์ธ๊ฐ?
๋ฒ๋ค๋ฌ๊ฐ ๋ฌด์์ธ์ง์ ๋ํด์ ์๊ธฐ ์ํด์๋, ๋จผ์ ๋ฒ๋ค๋ฌ๊ฐ ์ ํ์ํ์ง๋ฅผ ๋จผ์ ์์์ผ ํฉ๋๋ค. React Native ์ํคํ ์ฒ๋ ์ธ๋ป ๋ณด๋ฉด ๊ต์ฅํ ๋ณต์กํด ๋ณด์ผ ์๋ ์์ต๋๋ค๋ง, ์ฌ์ค์ ๊ต์ฅํ ๊ฐ๋จํฉ๋๋ค.
๋จผ์ ํ ์ค๋ JavaScript๋ก ์ฝ๋๋ฅผ ์๋๋ค. ์๋ฅผ ๋ค์ด์ ์ด๋ค ๋ทฐ๋ฅผ ๋ ๋๋งํ๋ ์ฝ๋๋ฅผ ์ฐ๊ฒ ์ฃ . ๊ทธ๋ฌ๋ฉด ๊ทธ JavaScript ์ฝ๋๋ฅผ hermes๋ ์๋๋ฉด v8๊ณผ ๊ฐ์ JavaScript ์์ง์ด ์คํ๋๋ฉด์ ๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ ๋์ ํธ์ถํด ์ค๋๋ค.
์๋ฅผ ๋ค์ด์, ๋ทฐ๋ฅผ ๋ ๋๋งํ๋ ๊ฑฐ๋๊น iOS์์๋ UIView
๋ฅผ ์์ฑํ๊ณ ์๋๋ก์ด๋์์๋ android.view
๋ฅผ ๋ง๋๋ ๊ฒ๋๋ค. ๋ง์น ๋ํ๋จผํธ์ createElement
div
๋ฅผ ํฌ๋กฌ์์ JavaScript ์์ง์ด ์คํํ๋ฉด div๊ฐ ์๋ก ์๊ธฐ๋ ๊ฒ๊ณผ ์ ์ฌํฉ๋๋ค.
๊ทธ๋ฐ๋ฐ 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
์ด๋ผ๊ณ ํ๋ ๊ฒ ์ ํํ๊ฒ ์ด๋ค ๊ฒฝ๋ก๋ฅผ ์ง์ ํ๋์ง๋ฅผ ์์์ผ ํฉ๋๋ค.
๊ทธ๋ฐ๋ฐ ๋ง์ ๊ฒฝ์ฐ์๋ ์ด๊ฒ ๋ชจํธํ๋ค๊ณ ํ ์๊ฐ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ์๋ ./App.js
, ./App.ts
, ./App.tsx
๊ทธ๋ฆฌ๊ณ ./App/
index.js
๊ทธ๋ ๊ฒ ํด์ ./App/
index.ios.js
๊น์ง ๊ต์ฅํ ๋ง์ ์ ํ์ง๋ค์ด ์๋ค๋ ๊ฒ์ ์ ์๊ฐ ์์ต๋๋ค. ๊ทธ๋์ Resolution์ด๋ ์ด๋ ๊ฒ ๋ชจํธํ ./App.js
์ด๋ผ๊ณ ํ๋ ์์ฒญ์ ์ ํํ ํ์ผ ๊ฒฝ๋ก๋ก ํ์ด๋ด๋ ๊ฒ์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค.
์ด์ ์ ์ฌํ๊ฒ ๊ต์ฅํ ๋ชจํธํ ์ํฉ์ด ๋ง์ต๋๋ค. ์๋ฅผ ๋ค์ด, components
์์ component1
๊ณผ component2
๋ฅผ import
ํ๋ ์ํฉ์ ์๊ฐํด ๋ด
์๋ค.
์ฌ๊ธฐ์์ components
๋ผ๊ณ ํ๋ ๊ฒ์ด npm์์ ์ค์นํ 'components'๋ผ๊ณ ํ๋ ํจํค์ง์ธ์ง, ์๋๋ฉด src ํด๋ ์์ components
๋ผ๊ณ ํ๋ ํด๋์ธ์ง, ์๋๋ฉด lib
ํด๋ ์์ ์๋ components
ํด๋์ธ์ง ์ผ๋ฐ์ ์ผ๋ก๋ ์ ํํ๊ฒ ์ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๊ทธ๋์ ์์ฒญ์ ๋ง์ถฐ ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ ํํ๊ฒ ์ฐพ์์ฃผ๋ ๋ฐฉ๋ฒ์ด ์ ์ ์๋์ด ์์ด์ผ ํฉ๋๋ค.
์ด๋ ๊ฒ ๋ฒ๋ค๋ฌ์์ Resolution์ด๋ผ๊ณ ํ๋ ๊ฒ์ import
๋ require
๋๋ ํ์ผ ์์น๋ฅผ ์ ํํ๊ฒ ์ฐพ์์ฃผ๋ ์ผ์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ฒ๋ค๋ฌ์์๋ ์ด๊ฒ์ ๋ํ ๊ต์ฅํ ์ข์ ๊ธฐ๋ณธ ์ค์ ์ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋์ ํฌ๊ฒ ์ ๊ฒฝ ์ฐ์ง ์๊ณ ๊ฐ๋ฐํ ์ ์์ต๋๋ค.
ํน์๋ผ๋ ์ด๊ฒ์ ์ปค์คํฐ๋ง์ด์ฆํ๊ณ ์ถ์ ๊ฒฝ์ฐ๊ฐ ์์ ์๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ์ ๋ค๋ฅด๊ฒ React Native์์๋ ios.js
, native.js
๋ผ๊ณ ํ๋ ํน์ํ ํ์ฅ์๋ฅผ ์ฌ์ฉํ๊ธฐ๋ ํฉ๋๋ค.
๊ทธ๋ฐ ํน์ํ ๊ฒฝ์ฐ๋ฅผ ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด์๋ ๋ฒ๋ค๋ฌ์ ์ฌ๋ฌ ๊ฐ์ง ์ค์ ์ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, Metro์์๋ resolveRequest
๋ผ๊ณ ํ๋ ๊ต์ฅํ ์ง๊ด์ ์ธ ์ด๋ฆ์ ํจ์๋ฅผ ์ ์ํ ์ ์์ต๋๋ค. ๋ง ๊ทธ๋๋ก ์์ฒญ์ ์ ํํ ํ์ผ ๊ฒฝ๋ก๋ก ํ์ด๋ด๋ ๊ฒ์
๋๋ค. ๊ทธ๋์ ์ด resolveRequest
๋ผ๊ณ ํ๋ ํจ์๋ moduleName
์ด๋ผ๊ณ ํ๋ ์ธ์๋ก ์์ฒญ๋ ๊ฒ์ ๋ํด์ ์ ํํ ํ์ผ์ ๊ฒฝ๋ก ๋ฌธ์์ด์ ๋ฐํํ๋ ํจ์์
๋๋ค. ์ด ๋ถ๋ถ์ ๋ํด์ ์์ธํ ์ค๋ช
์ด๋ ์คํ์ ๋ฉํธ๋ก ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์๋ฉด ์ดํดํ์ค ์ ์์ต๋๋ค.
์ด์ ๋น์ทํ๊ฒ ESBuild์ ๋ํด์๋ Resolution์ ๋ํ ๊ท์น์ ์ ์ํ ์ ์์ต๋๋ค. ํ๋ฌ๊ทธ์ธ์ ํตํด์ ์ ์ํ ์ ์๋๋ฐ, onResolve
๋ผ๊ณ ํ๋ Metro๋ ๋น์ทํ ์ด๋ฆ์ API๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋์ resolution ๊ท์น์ ์ค์ ํ๊ณ ์ถ์ ํํฐ๋ฅผ ์ ๊ฑธ๊ณ , ํํฐ์ ํด๋นํ๋ ์์ฒญ์ ๋ํด์ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ๋ฐฉ๋ฒ์ ํจ์๋ก์จ ์ ์ํ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ESBuild์์๋ ๊ผญ ์ด๋ ๊ฒ ๋ณต์กํ๊ฒ ์ ์๋ฅผ ํ์ง ์๋๋ผ๋ ๊ฐ๋จํ๊ฒ ํ์ฅ์ ์ ๋๋ง ์ถ๊ฐํ๊ณ ์ถ๋ค๋ฉด, resolveExtensions
๋ผ๊ณ ํ๋ ์ต์
๋ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋์ ๊ตณ์ด ๋ณต์กํ๊ฒ ํ๋ฌ๊ทธ์ธ ํํ๋ก ๋ง๋ค์ง ์๊ณ ๋ ๊ฐ๋จํ๊ฒ resolving
ํ ํ์ผ ํ์ฅ์ ๋ชฉ๋ก์ ์ ์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์๋ ์์ ๊ฐ์ ๊ฒฝ์ฐ์๋ ./test
๋ฅผ .ios.js
, .native.js
, .js
์์ผ๋ก ์ฐพ๋๋ก ํ๋ ๊ฒ์
๋๋ค.
์ด๋ ๊ฒ Resolution์ ๋ํด์ ์์๋ณด์์ต๋๋ค. Resolution์ ๋ค ๋๋ง์น ๋ค์๋ ์ด๋ค ์ผ์ด ๋ฒ์ด์ง๋ค๊ณ ์๊ฐํ์๋์? ๊ต์ฅํ ๋ชจํธํ๊ฒ ์์ฑ๋์ด ์์๋ import
๋ฌธ๋ค์ด ์ ํํ๊ฒ ์ด๋ค ํ์ผ๋ค์ ๊ฐ๋ฆฌํค๋์ง ๋ช
ํํ๊ฒ ๋ํ๋๊ธฐ ๋๋ฌธ์, ์ด์ ๊ทธ ํ์ผ๋ค์ ํฉ์น๊ธฐ๋ง ํ๋ฉด ์ต์ข
์ ์ธ ๊ฒฐ๊ณผ๋ฌผ์ ๋ง๋ค์ด๋ผ ์ ์์ ๊ฒ์
๋๋ค.
Load
๊ทธ๋ฐ๋ฐ ๋ฒ๋ค๋ฌ๊ฐ ์ถ๊ฐ๋ก ํด์ฃผ๋ ์์ ์ด ํ๋๊ฐ ๋ ์์ต๋๋ค. ๋ฐ๋ก Load์ ๋๋ค. ํ์ค JavaScript๋ง ์ด์ฉํด์ ๊ฐ๋ฐํ๊ณ ์๋ค๋ฉด ์ ๋ง ์ข๊ฒ ์ง๋ง, ์ฌ์ค ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์๋ ๊ผญ ๊ทธ๋ ์ง๋ง์ ์์ต๋๋ค. TypeScript๋ JavaScript๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ์์ฝ๊ฒ๋ ๋ธ๋ผ์ฐ์ ๋ React Native ํ๊ฒฝ์์ ๋ฐ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ฒ๋ค๋ฌ๋ ํฉ์น๊ธฐ๋งํด์๋ ์ ๋๋ค๋ ๊ฒ์ด์ฃ . TypeScript๋ฅผ JavaScript๋ก ๋ฐ๊ฟ์ฃผ๊ธฐ๋ ํด์ผ ํฉ๋๋ค.
๋น์ทํ๊ฒ, React Native์์๋ TypeScript๋ ์๋์ง๋ง Flow๋ฅผ ์ด์ฉํ๊ณ ์๋๋ฐ์. ํน์ดํ๊ฒ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณตํ ๋ ํ์ค JavaScript๋ก ๋ฐ๊พธ์ง ์๊ณ Flow ์ฝ๋๋ฅผ ๊ทธ๋๋ก npm์ ์ฌ๋ฆฌ๊ณ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ์๋ Flow๋ ํ์ค JavaScript๊ฐ ์๋๊ธฐ ๋๋ฌธ์, ๋จ์ํ ํฉ์น๊ธฐ๋ง ํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด ๊ฒฝ์ฐ์๋ Flow ์ฝ๋๋ฅผ JavaScript๋ก ๋ณํ์์ผ์ค์ผ ํ๋ค๋ ๋ป์ ๋๋ค.
์ด์ฒ๋ผ ๋ฒ๋ค๋ฌ๋ ๋จ์ํ ํ์ผ์ ์ฐพ๋ ๊ฒ์๋ง ๊ทธ์น๋ ๊ฒ์ด ์๋๋ผ 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๋ก ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ์ ์ ์ ์ํด ์ค์ผ ํฉ๋๋ค.
์ด๊ฒ์ Metro์์ ์ด๋ป๊ฒ ์ค์ ํ ์ ์๋์ง๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. Metro์์๋ transformerPath
๋ผ๊ณ ํ๋ ๋ช
๋ น์ด๋ฅผ ํตํด์ ํ์ผ์ transform
, ๋ค์ ๋งํด, Loadํ๋ ๋ฐฉ๋ฒ์ ์ง์ ํ ์๊ฐ ์์ต๋๋ค. ์ฝ๋์์์ ๊ฐ์ด transformFile
์ด๋ผ๊ณ ํ๋ ํจ์๋ ์ฒซ ๋ฒ์งธ ์ธ์๋ก filePath
๋ฅผ ๋ฐ์์ ํด๋น filePath
์ ์๋ ๋ด์ฉ์ ์ฝ์ ๋ค์ ๊ฒฐ๊ณผ๋ฌผ์ ์ฝ๋๋ก ๋ฐํํฉ๋๋ค. ์๋ฅผ ๋ค์ด์ TypeScript ํ์ผ์ ์ฝ์ ๋ค์์ 'Babel'์ด๋ 'SWC'๋ก ์ปดํ์ผ ํ ๋ค์์ JavaScript ํ์ผ์ ๋ฐํํ๋ ๊ฒ์
๋๋ค. ์์ธํ Load์ ๊ดํ ์ค์ ์ Metro ๊ณต์๋ฌธ์์์ ๋ณผ ์ ์์ต๋๋ค.
์ด๊ฒ๊ณผ ๋น์ทํ๊ฒ ESBuild์ ๋ํด์๋ Load ์ค์ ์ ๋ณ๊ฒฝํ ์๊ฐ ์์ต๋๋ค. ์ด์ ์ Metro ์ค์ ๊ณผ ๋งค์ฐ ์ ์ฌํฉ๋๋ค. ์ฒซ ๋ฒ์งธ ์ธ์์ args.path
๋ฅผ ํตํด์ Load ํ์ผ์ ์ง์ ํ๋ฉด ์ด๊ฒ์ ์ฝ์ด์ ๋ณํ๋ ๊ฒฐ๊ณผ๋ฅผ JavaScript๋ก ๋ฐํํ๋ ๋ชจ์ต์ ๋ณผ ์๊ฐ ์์ต๋๋ค.
์ง๊ธ๊น์ง Resolution๊ณผ Load ๊ณผ์ ์ ๋ํด์ ์ดํด๋ณด์์ต๋๋ค. ๋ฒ๋ค๋ฌ๋ ์ด์ฒ๋ผ Resolution ๊ณผ์ ์ ๊ฑฐ์น๋ฉด import
๋๋ ํ์ผ์ ๋ชจ๋ ์ฐพ์๋ณผ ์๊ฐ ์๊ณ , ๋ก๋ ๊ณผ์ ์ ๊ฑฐ์น๋ฉด import
๋๋ ํ์ผ์ด TypeScript๋ Flow๋ผ๊ณ ํ๋๋ผ๋ ํ์ค์ ์ธ JavaScript๋ก ๋ชจ๋ ๋ฐ๊ฟ ์ ์์ต๋๋ค. ๊ทธ๋์ import
๋๋ JavaScript ํ์ผ๋ค์ ๋ชจ๋ ๋ค ์ค๋นํ ์ํ์ด๋ฏ๋ก ๋ฒ๋ค๋ฌ๋ ์ด ํ์ผ๋ค์ ๋ชจ๋ ํฉ์น๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ์์ ํ 1๊ฐ์ JavaScript ํ์ผ์ด ์์ฑ๋ฉ๋๋ค.
Optimization
๊ทธ๋ฐ๋ฐ ๋ฒ๋ค๋ฌ๊ฐ ํ๋์ ํ์ผ๋ก ํฉ์ณ์ก๋ค๊ณ ํ๋๋ผ๋ ์ด ์ํ๋ก๋ ํ๋ก๋์ ์ ๋ฐฐํฌํ ์๊ฐ ์์ต๋๋ค. ์๋ํ๋ฉด ๋ฒ๋ค๋ง์ ํ๋ ๊ฒ๋ง์ผ๋ก๋ ํ์ผ์ด ๋๋ฌด ์ปค์ ์ฑ๋ฅ์ด ๋จ์ด์ง๊ธฐ ๋๋ฌธ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ์ผ๋ฐ์ ์ธ React Native๋ ์น ํ๋ก์ ํธ์์๋ ์๋นํ ์์ ์์กด์ฑ์ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค. ํ ์ค๋ง ํ๋๋ผ๋ ๋น์ฐํ๊ฒ ์ฌ์ฉํ๋ ๋ฆฌ์กํธ ์ธ์๋ ๋์์ธ ์์คํ , ์คํ์ผ๋ง, ์ ๋๋ฉ์ด์ , ๋ ์ง ๊ณ์ฐ ์ด๋ฐ ๊ฒ๋ค์ ์ํด์ ๊ต์ฅํ ๋ค์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์ฌ์ฉํ๊ณ ์๋๋ฐ, ํน๋ณํ ์ต์ ํ ์์ด ์ด ํ์ผ๋ค์ ๋จ์ํ ํฉ์น๋ ๊ฒ๋ง์ผ๋ก๋ ํ์ผ์ด ๋๋ฌด ์ปค์ ธ ์ฑ๋ฅ์ด ๋จ์ด์ง๊ฒ ๋ฉ๋๋ค.
๊ทธ๋์ ๋ฒ๋ค๋ฌ๋ Resolution๊ณผ Load ์ธ์ Optimization, ๋ค์ ๋งํด์ ์ต์ ํ ์์ ์ ์ํํฉ๋๋ค. ํ์ผ ํฌ๊ธฐ๋ฅผ ์๊ฒ ํ๊ธฐ ์ํด์ ๋ค์ํ ์์ ์ ์ํํ๋ค๊ณ ํ ์๊ฐ ์์ต๋๋ค.
ํ์ผ ํฌ๊ธฐ๋ฅผ ์ค์ด๋ ํ ํฌ๋์๋ ํฌ๊ฒ Minification๊ณผ Tree Shaking์ด ์์ต๋๋ค. Metro์ ESBuild์ ์ฐจ์ด๋ฅผ ์กฐ๊ธ ๋ ๋ช ํํ๊ฒ ์๊ธฐ ์ํด์, ์ด ๊ฐ๊ฐ์ ํ ํฌ๋์ด ๊ตฌ์ฒด์ ์ผ๋ก ์ด๋ค ์ญํ ์ ํ๋์ง, 2ํ์์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
Optimization
Mnification
๋จผ์ Minification์ Compression์
๋๋ค. Compression์ ๋ง ๊ทธ๋๋ก ์์ค ์ฝ๋์์ ์์ถํ ์ ์๋ ํ
์คํธ๋ฅผ ์ต๋ํ ์์ถํ๋ ๊ฑธ ๋งํฉ๋๋ค. ์๋ฅผ ๋ค์ด์ undefined
๋ผ๊ณ ํ๋ ๊ฐ์ void 0
์ด๋ผ๊ณ ํํํ์ ๋ ์ธ ๊ธ์๊ฐ ์ค๊ฒ ๋ฉ๋๋ค. ๋น์ทํ๊ฒ '2 + 3'์ '5'๋ก ์ค์ธ๋ค๋ฉด ํ์ผ ํฌ๊ธฐ๋ฅผ ์ข ๋ ์ค์ผ ์ ์์ต๋๋ค. ๊ทธ ์ธ์ ์กฐ๊ฑด๋ฌธ์ด๋ ์๋๋ฉด 'Infinity' ๊ฐ์ ์ฝ๋๋ ํน์ํ ์ฒ๋ฆฌ๋ฅผ ํ๋ฉด ์งง๊ฒ ์ค์ผ ์ ์์ต๋๋ค. ์ด ์ธ์๋, ์ด๊ฒ๋ณด๋ค ์ฌ์ค ํจ์ฌ ๋ณต์กํ, ๊ทธ๋ ์ง๋ง ๋์ผํ ์ฝ๋ ๊ฒฐ๊ณผ๋ฌผ์ ๋ด๋ ๋ค์ํ ์์ถ ๋ฐฉ๋ฒ๋ก ์ด ์์ต๋๋ค. ๊ถ๊ธํ์ ๋ถ๋ค์ 'Terser'๋ผ๊ณ ํ๋ ์ ๋ช
ํ ์คํ์์ค ํ๋ก์ ํธ๋ฅผ ์ฐธ๊ณ ํ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋ ๋์๊ฐ์, Minification์ ๋ ๋ฒ์งธ๋ก Mangling์ด๋ผ๊ณ ํ๋ ํ ํฌ๋์ด ์์ต๋๋ค. ์ด๊ฒ์ ๋ณ์๋ ํด๋์ค ์๋๋ฉด ํจ์์ ์ด๋ฆ์ ๋ฐ๊ฟ์ผ๋ก์จ ํ์ผ ํฌ๊ธฐ๋ฅผ ์ค์ด๋ ํ ํฌ๋์ ๋๋ค. ๊ฐ๋ฐ์๋ค์ ์์ค ์ฝ๋๋ฅผ ์์ฑํ ๋ ์ฝ๋ ์ฌ๋์ด ์ดํดํ๊ธฐ ์ฝ๋๋ก ๋ค์ ๊ธธ๋๋ผ๋ ์ข ๋ ์ค๋ช ์ ์ธ ์ด๋ฆ์ ๋ถ์ด๊ณ ๋ ํฉ๋๋ค.
ํ์ง๋ง, ์ด๋ ๊ฒ ๋ถ์ฌ์ง ์ด๋ฆ์ ๊ฒฐ๊ณผ๋ฌผ์ ํ์ผ ํฌ๊ธฐ๊ฐ ๊ต์ฅํ ์ปค์ง๋๋ก ๋ง๋ญ๋๋ค. ๊ทธ๋์ ๋ฒ๋ค๋ฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ ๊ฒ ์ด๋ฆ์ ์งง๊ฒ ๋ฐ๊ฟ์ค์ผ๋ก์จ ํ์ผ ํฌ๊ธฐ๋ฅผ ์ค์ฌ์ค๋๋ค. ์๋ ์์์์๋ num 1
๊ณผ num 2
๋ฅผ ๊ฐ๊ฐ 'n'๊ณผ 'r'๋ก ๋ฐ๊ฟ์ผ๋ก์จ ์๋นํ ์ค์ด๋ ๊ฒ์ ๋ณผ ์๊ฐ ์์ต๋๋ค.
๋ฒ๋ค๋ฌ๊ฐ ๋ง๋ ๋ฐฐํฌ ๊ฒฐ๊ณผ๋ฌผ์ ๋ณด๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ ๊ฒ ๊ฐ์๋ฐ, ํ์ผ์ ์ด์ด๋ณด๋ฉด ์ด๋ ๊ฒ ์ด๋ฆ์ด ์ฝ๊ธฐ ์ด๋ ค์ด ํํ๋ก ๋ง์ด ๋ฐ๋์ด ์๋ ๊ฒ์ ๋ณด์ค ์๊ฐ ์์ต๋๋ค. ํ์ผ ํฌ๊ธฐ๋ฅผ ์ค์ด๊ธฐ ์ํด์์ ๋๋ค.
Tree Shaking
Tree Shaking์ ๊ธฐ์กด์ Minification๊ณผ๋ ์ฝ๊ฐ ์ ๊ทผ์ด ๋ค๋ฆ
๋๋ค. ๊ธฐ์กด์ Minification์ ์ฝ๋ ๋์์ ์ต๋ํ ์ ์งํ ์ํ๋ก ์ฝ๋๋ฅผ ์์ถํ๋ ๋ฐ์๋ง ๋จธ๋ฌผ๋ ๋ค๋ฉด Tree Shaking์ import
๋ ์ฝ๋ ๊ฐ์ด๋ฐ ์ ์ฐ๋ ์ฝ๋๋ฅผ ์ ์ ์ ์ผ๋ก ์ญ์ ํ๋ ํ
ํฌ๋์
๋๋ค. ์ ์ฐ๋ ์ฝ๋๋ฅผ ์ญ์ ํ๋ค๋๊น ์ ๋ง ์ข์ ๊ฒ ๊ฐ์๋ฐ, ์ค์ ๋ก๋ Tree Shaking์ ๊ต์ฅํ ์ด๋ ค์ด ์์
์
๋๋ค.
์ ์ด๋ ค์ด์ง ๋ ๊ฐ์ง ์์๋ฅผ ํตํด์ ์ด๊ฑฐ ํ๋ฒ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์๋ ์์๋ฅผ ๋ณด์๋ฉด, ๋จผ์ , ์ฒซ ๋ฒ์งธ ์ฝ๋๋ toss/utils
ํจ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ add
๋ผ๊ณ ํ๋ ํจ์๋ฅผ ๊ฐ์ ธ์์ ์ฐ๋ ์ฝ๋์
๋๋ค. ์ด ์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด add
ํจ์ ๋ง๊ณ ๋ ๋ค๋ฅธ ํจ์๋ค์ ์์ ํ๊ฒ ์ญ์ ํ ์ ์์ ๊ฒ ๊ฐ์ด ์๊ฒผ์ต๋๋ค.
๋ ๋ฒ์งธ ์ฝ๋๋ ์ฝ๊ฐ ๋ค๋ฆ
๋๋ค. ์ด ์ฝ๋๋ ์ด๋ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด๊ธฐํํ๋ ์ฝ๋๋ฅผ import
๋ฅผ ํ๊ณ ์์ง๋ง, ๊ทธ๋ฐ๋ฐ ๊ทธ import
๋ฌธ์์ ์๋ฌด๊ฒ๋ ๊ฐ์ ธ์ค๊ณ ์์ง ์์ต๋๋ค. ์ฌ๊ธฐ์ ๋ ๋ฒ์งธ ์ฝ๋์์๋ ์๋ฌด๊ฒ๋ ๊ฐ์ ธ์ค๊ณ ์์ง๋ ์์ผ๋, ๊ทธ๋ฅ import
๋ฌธ์ ์ญ์ ํด ๋ฒ๋ ค๋ ๋๋์ง ์๋ฌธ์ด ์๊น๋๋ค. ์ ์ง ์ ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ ๋ฒ์งธ ์์๋ฅผ ๋ณด๋ฉด ์ฝ๊ฐ์ฉ ๋ถ์ํด์ง๊ธฐ ์์ํฉ๋๋ค. toss/utils
์์ add
๋ฅผ ๊ฐ์ ธ์ค๋ ์ฒซ ๋ฒ์งธ ์์์์๋ ํจ๋ถ๋ก ๋ญ๊ฐ ์ ์ธ ๊ฒ ๊ฐ์ด ๋ณด์ด๋ ์ฝ๋๋ฅผ ์ง์ ๋ค๊ฐ ์๊ธฐ์น ๋ชปํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ์ด๋ป๊ฒ ํ ์ง ๊ต์ฅํ ๋ถ์ํด์ง๋๋ค. ๊ทธ๋์ Tree Shaking์ ๋ฒ๋ค๋ฌ๊ฐ ๊ตฌํํ๋ ๋ฐ ์์ด์ ๊ต์ฅํ ์ด๋ ค์ด ์ ๋ค์ด ๋ง์ ๊ธฐ๋ฅ์ผ ๊ฒ์ด๋ผ๊ณ ์ถ์ธกํ ์ ์์ต๋๋ค.
๊ทธ๋์ ์ผ๋ฐ์ ์ผ๋ก๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค ๋ ๋ฒ๋ค๋ฌ๊ฐ ์์ ํ๊ฒ ์ฝ๋๋ฅผ ์ญ์ ์์ผ ์ค ์ ์๋๋ก sideEffects
๋ผ๊ณ ํ๋ ํ๋๋ฅผ ์ฌ์ฉํ๋๋ฐ, sideEffects
๋ ๋ฒ๋ค๋ฌ๊ฐ ํจ๋ถ๋ก ์ง์์๋ ์ ๋๋ ๊ทธ๋ฐ ํ์ผ ๋ชฉ๋ก์ ์ง์ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด์, ๋ฒ๋ค๋ฌ๋ sideEffects
๊ฐ false
์ด๋ฉด, ๊ทธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์์ ์ด๋ค ํ์ผ์ด ์ ์ฐ์๋ค๊ณ ํ๋ฉด ๋ฌด์กฐ๊ฑด ์์ ํ๊ฒ ์ง์ธ ์๊ฐ ์์ต๋๋ค. ๊ทธ๋ ์ง ์๊ณ sideEffects
์ ์ง์ฐ๋ฉด ์ ๋๋ ๊ทธ๋ฐ ํ์ผ ๋ชฉ๋ก์ด ์ง์ ๋์ด ์๋ค๊ณ ํ๋ค๋ฉด, ๊ทธ ํ์ผ๋ค์ import
๋๋๋ฐ, ์ ์ฐ๊ณ ์๋ค๊ณ ํ๋๋ผ๋ ์ง์์ง์ง๋ ์์ต๋๋ค.
๊ฒ๋ค๊ฐ ์ด ์์๋ 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๋ฅผ ์ฌ์ฉํ ์ ์์ง ์์๊น?โ
์ด๋ฐ ์๊ฐ์์ ์ถ๋ฐํด์ ์ค์ ๋ก ๋ ํผ๋ฐ์ค๋ฅผ ์ฐพ์๋ณด์์ต๋๋ค. 'oblador/react-native-esbuild
'๋ผ๊ณ ํ๋ ๋ ํฌ์งํ ๋ฆฌ๊ฐ ์์์ต๋๋ค. ์ค์ ๋ก Metro์์ ์ฌ์ฉํ๋ ๊ต์ฅํ ๋ค์ํ ์ค์ ๋ค์ 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
๊ทธ๋ฆฌ๊ณ ๊ทธ๋ ๊ฒ ํด์ ์๋ ๊ฒ๊น์ง ์์๋๋ก ์ฐพ๋ ์์ด์์ต๋๋ค.
Load
๋ค์์ผ๋ก ์ ๊ฒฝ ์จ์ผ ํ๋ ๊ฒ์ Load์
๋๋ค. React Native์์๋ ํน์ดํ ๋ฌธ๋ฒ๋ค์ ๋ง์ด ์ฌ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด์ React Native์ ์ฝ์ด๋ Flow๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ์ ๋๋ฉ์ด์
์ ์ฌ์ฉํ๋ React Native์ reanimated
๋ผ๊ณ ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์๋ 'worklet'์ด๋ผ๊ณ ํ๋ ํน์ํ ํจ์๋ฅผ ์ ์ํฉ๋๋ค.
์ด๋ฐ ๋ฌธ๋ฒ์ ๋์ํ๊ธฐ ์ํด์๋ ํน๋ณํ๊ฒ Load๋ฅผ ํ๋ ๋ฐฉ๋ฒ์ ์ ์๋ฅผ ํด์ผ ํ์ต๋๋ค. ์๋ ์์ค ์ฝ๋๋ฅผ ํ๋ฒ ์ดํด๋ณด์๋ฉด, ๋ชจ๋ ํ๋ก์ ํธ ํ์ผ์ ๋์์ผ๋ก Flow ๋ฌธ๋ฒ์ ํฌํจํ ๊ฒฝ์ฐ์๋ Babel๋ก ์ปดํ์ผ์ ๋ฃ์ด์ Flow ๋ฌธ๋ฒ์ ์คํํ ์ ์๋ JavaScript ์ฝ๋๋ก ๋ฐ๊ฟ์ฃผ์์ต๋๋ค. ๋ reanimated
์ worklet
ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ํน์ํ ํ๋ฌ๊ทธ์ธ์ ์ด์ฉํด์ ํจ์๋ฅผ ์ปดํ์ผํ์ต๋๋ค. ์ด๋ ๊ฒ Flow์ TypeScript ๊ทธ๋ฆฌ๊ณ worklet
ํจ์์ ๋์ํ๋๋ก ํ๋๊น ํน์ํ ๋ฌธ๋ฒ์๋ ์์ ํ๊ฒ ๋์ํ ์ ์์์ต๋๋ค.
Optimization
ํน๋ณํ๊ฒ ์ค์ ํ์ง ์์๋ ์์ฐ์ค๋ฝ๊ฒ ์ด๋์ ๋ณผ ์ ์๋ ๊ฒฝ์ฐ๋ ์์์ต๋๋ค. ๋ฐ๋ก Optimization์
๋๋ค. Metro๋ ์ด์ ESbuild๋ Metro์ ๋ค๋ฅด๊ฒ Tree Shaking์ ์ง์ํ๊ธฐ ๋๋ฌธ์ ์ ์ฐ๋ import
๋ค์ ์ง์์ผ๋ก์จ ํ์ผ ํฌ๊ธฐ๋ฅผ ํฌ๊ฒ ๊ฐ์์ํฌ ์ ์์์ต๋๋ค.
Minification, ๋ค์ ๋งํด์ ํ์ผ ํฌ๊ธฐ ์์ถ์ ๊ฒฝ์ฐ์๋ ์์ชฝ ๋ฒ๋ค๋ฌ์์ ๋ชจ๋ ๋ค ์ง์ํ์ต๋๋ค. ๊ทธ๋์ ํ ์ค์์๋ ESBuild๋ฅผ ๋์ ํ๋ ๊ฒ๋ง์ผ๋ก๋ JavaScript์ ํ์ผ ํฌ๊ธฐ๋ฅผ ํฌ๊ฒ ์ค์ผ ๊ฐ ์์์ต๋๋ค.
๊ทธ ์ธ๋ก 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 ์ ๋๋ก ํฌ๊ธฐ๋ฅผ ํฌ๊ฒ ์ค์ผ ์ ์์์ต๋๋ค.
์ง๊ธ๊น์ง ์ด๋ป๊ฒ ํ ์ค๊ฐ Metro์์ ESBuild๋ก ์ฎ๊ธฐ์๋ ๊ฒฐ์ ํ๊ฒ ๋์ผ๋ฉฐ, ๋๋ต์ ์ผ๋ก๋๋ง ์ด๋ป๊ฒ ์ฝ๋๋ฅผ ์ฎ๊ธธ ์ ์์๋์ง์ ๋ํด์ ์๊ฐํด ๋๋ ธ์ต๋๋ค.
๋ง์น๋ฉฐ
๊ธ์ ๋ง์น๊ธฐ ์ ์, ์ง๊ธ๊น์ง ์์๋ณธ ๋ด์ฉ์ ์ ๋ฆฌํด๋ณด๊ฒ ์ต๋๋ค.
๋จผ์ , ๋ฒ๋ค๋ฌ์ ๋ํด์ ๋ง์ด ์์๋ณด์์ต๋๋ค. ๋ฒ๋ค๋ฌ๋ ์ชผ๊ฐ์ง ํ์ผ์ ํ๋๋ก ํฉ์น๊ณ ์ต์ ํํ๋ ๋๊ตฌ์ ๋๋ค. ๊ทธ๊ฒ์ ์ํด์๋ ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ ํํ๊ฒ ์ฐพ๋ Resolution, ๊ทธ๋ฆฌ๊ณ TypeScript๋ Flow์ฒ๋ผ ๋นํ์ค ์ฝ๋๋ฅผ ๋ฐ๋ก ์คํํ ์ ์๋ JavaScript๋ก ๋ฐ๊ฟ์ฃผ๋ Load ๋ฐฉ๋ฒ์ ์ค์ ํด ์ค์ผ ํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ Optimization ์์ ์ผ๋ก ๊ฒฐ๊ณผ๋ฌผ์ ์ต์ ํ์์ผ ์ค์ผ ํ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ Metro์ ESBuild๋ ๋ชจ๋ ๋ฒ๋ค๋ฌ๋ผ๊ณ ํ๋ ์ ์์ ์์ ์ธ๊ธํ ์ธ ๊ฐ์ง ๋ถ๋ถ์ ๋ํ ์ค์ ์ ๊ทธ๋๋ก ์ฎ๊ธฐ๋ฉด ๋๊ฐ์ด ๋์ํ ๊ฑฐ๋ผ๊ณ ์๊ฐํ ์ ์์์ต๋๋ค. ๊ทธ๋์ ์์ 'react-native-esbuild'๋ผ๊ณ ํ๋ ํ๋ก์ ํธ๋ฅผ ์๊ฐํด ๋๋ฆฌ๋ฉด์ Resolution๊ณผ Load ๊ด์ ์์ ํต์ฌ์ ์ธ ์ค์ ๋ค์ ์ค๋ช ํด ๋๋ ธ์ต๋๋ค.
๊ทธ ๊ฒฐ๊ณผ๋ก ํ ์คํ์์๋ ์ผ๊ด์ ์ธ ๋น๋ ๊ทธ๋ฆฌ๊ณ ํฐ ์๋ ๊ฐ์ , ๋ง์ง๋ง์ผ๋ก Tree Shaking์ ํตํ ํ์ผ ํฌ๊ธฐ ์ต์ ํ๋ฅผ ์ป์ ์ ์์์ต๋๋ค.
FEConf2023์์ ๋ฐํ๋ 'React Native, Metro๋ฅผ ๋์ด์ / ๋ฐ์์ง ํ ์ค ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ โฉ๏ธ