Metro와 ESBuild (+WebPack)은 무엇인가
javascript코드 작성(단일 파일) → JavaScript 엔진(Hermes, V8)실행 → Native코드 호출(UI View, android.view 렌더링)
번들링이란 쪼개진 모듈을 단일 파일로 합쳐서 만들어줌. 그역할을 해주는 친구가 번들러.
과거 EcmaScript 표준 Module 시스템이 없었을 때는 WebPack과 같은 번들러가 작업해줌. (옛날엔 browserify라는 번들러가 있었음)
import { App } from './App';
...
그래서 ./App.js?, ./App.ts?, ./App.tsx?, ./App/index.js?, ./App/index.ts?, ./App/index .ios.js? 인지 모르니, 확장자를 포함한 정확한 경로를 풀어냄(resolve)
import { Component1 } from 'components/Compnent1';
import { Component2 } from 'components/Compnent2';
...
compoents 라는 npm 패키지인가???
src/components 인가?
lib/components 인가?
graph TD
TypeScript/Flow --> Babel/SWC --> 표준JavaScript
특히, RN 라이브러리는 Flow나 TypeScript등 JavaScript가 아닌 형태를 사용하는 경우가 많음.
metro.config.js
module.exports = {
transformerPath: /* Transformer JS 파일 경로 */
}
transformer.js
class Transformer {
async transformFile(
/*Load할 파일(e.g, TS, Flow, ...)*/
filePath: string,
/* Babel 등 관련된 옵션 */
transformerOptions: TransformerOptions,
){
return { result: {data: {code: /* Load된 결과 */}}}
}
}
Resolution + Load 결과: 완전한 1개의 JavaScript 파일 완성
undefined -> void 0 2 + 3 -> 5 !a && !b -> !(a || b) Infinity -> 1/0
function add(num1, num2){ return num1 + num2; }
function add(n, r){ return n + r; } import { add } from '@toss/utils';
add함수 말고 나머지 코드는 제거해도 될 것 같음
import '@scope/some-library/initialize';
어떤 코드도 제거해서는 안될 것 같음 ```tsx
{
"name" : '@toss/utils',
// ...
"sideEffects" : false
}
모든 안 쓰는 파일을 제거할 수 있음
```
```tsx
{
"name" : 'react-native-reanimated',
// ...
"sideEffects" : [/* 제거 금지 파일 목록 */]
}
sideEffects 파일은 제거할 수 없음.
```Minification(Compression, Mangling)은 대부분의 번들러에서 기본 지원