Capstone#9. babel 의 κΈ°λ³Έ κ°œλ…μ— λŒ€ν•΄ μ•Œμ•„λ³΄μž.

2024. 11. 24. 20:11ㆍStudy_Develop/React Native

λ°˜μ‘ν˜•

 

 

 

 

ν”„λ‘œμ νŠΈλ₯Ό 맀번 μ§„ν–‰ν•˜λ©΄μ„œ

babelμ΄λ‚˜ config νŒŒμΌμ„ κ±΄λ“œλ €μ•Ό ν•  일이 생기면 

μ΄ν•΄ν•˜μ§€ λͺ»ν•œμ±„ λ¬΄μ§€μ„±μœΌλ‘œ λ”°λΌλ§Œ ν–ˆλ˜ κ²½ν—˜μ΄ μžˆμ–΄μš”.

κ·Έλž˜μ„œμΈμ§€ 이런 νŒŒμΌλ“€μ„ κ±΄λ“œλ €μ•Ό ν•  일이 생기면 μ—λŸ¬λ„ 많이 뜨고 λ­”κ°€ μˆœνƒ„ν•˜κ²Œ 잘 싀행이 λ˜μ§€λŠ” μ•Šμ•˜λ˜ κ±° κ°™μ•„μš”.

 

이번 κΈ°νšŒμ— 각 νŒŒμΌλ“€μ˜ μ—­ν•  μ“°μž„ λ™μž‘ 등등을 곡뢀해보렀 ν•©λ‹ˆλ‹€!

 

babelμ΄λž€ 뭐지?

 

 

μš°μ„  Babel의 μ£Όμš” 역할은 μ΅œμ‹  js(es6, es7 및 κ·Έ 이상)λ₯Ό μ‚¬μš©ν•˜λŠ” μ½”λ“œκ°€ λΈŒλΌμš°μ € 버전과 상관없이 

λ‹€μ–‘ν•œ js μ—”μ§„μ—μ„œ μž‘λ™ν•  수 있게 ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

μ΄λŠ” 특히 μ΅œμ‹  κΈ°λŠ₯을 μ§€μ›ν•˜μ§€ μ•ŠλŠ” 였래된 λΈŒλΌμš°μ €μ—μ„œλ„ μ½”λ“œκ°€ μž‘λ™ν•  수 있게 ν•΄ μ€λ‹ˆλ‹€!

 

바벨이 λ“±μž₯ν•¨μœΌλ‘œ λΈŒλΌμš°μ € κ°„ ν˜Έν™˜μ„±μ„ μ§€μΌœμ•Ό ν•˜λŠ” 크둜슀 λΈŒλΌμš°μ§• 이슈λ₯Ό μ–΄λŠ 정도 ν•΄κ²°ν–ˆλ‹€κ³  λ³΄λŠ”λ°μš”

 

μ‹œκ°„μ΄ μ§€λ‚˜λ©° λ‹¨μˆœμ΄ es6 to es5 λ³€ν™˜λΏλ§Œ μ•„λ‹ˆλΌ λ¦¬μ•‘νŠΈμ˜ jsx문법, νƒ€μž…μŠ€ν¬λ¦½νŠΈμ™€ 같은 정적 νƒ€μž… μ–Έμ–΄, μ΅œμ‹  문법 등에 λŒ€ν•œ λ³€ν™˜μ„ μ œκ³΅ν•˜λ©° ν”„λ‘ νŠΈ κ°œλ°œμ— μžˆμ–΄ ν•„μˆ˜μ μΈ μš”μ†Œλ‘œ 자리 μž‘μ•˜μŠ΅λ‹ˆλ‹€!!

 

μ΄λ•Œ! λ°”λ²¨μ—μ„œ λ³€ν™˜ν•˜λŠ” ν–‰μœ„λ₯Ό 트랜슀파일링 ν•œλ‹€κ³  μΉ­ν•˜κ³ ,

κ³ μˆ˜μ€€ μ–Έμ–΄ -> μ €μˆ˜μ€€ μ–Έμ–΄μ˜ 컴파일링과 차이λ₯Ό 두기 μœ„ν•΄ 트랜슀파일링이라고 ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. 

 

 

바벨 μ‹œλ„ν•΄ 보기

 

바벨 κ³΅μ‹μ‚¬μ΄νŠΈμ—μ„œ μ΄λ ‡κ²Œ λ³€ν™˜μ„ ν•œλˆˆμ— λ³΄μ—¬μ£ΌλŠ” κΈ°λŠ₯도 μ œκ³΅ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

 

 

μ™Όμͺ½μ— View, Text, Buttonνƒœκ·Έλ₯Ό μ‚¬μš©ν•œ 방식은 일반적으둜 μž‘μ„±ν•˜λŠ” μ½”λ“œ μŠ€νƒ€μΌμž…λ‹ˆλ‹€.

 

이 μ½”λ“œλŠ” Babelμ΄λ‚˜ μœ μ‚¬ν•œ js 컴파일러λ₯Ό 톡해 처리될 λ•Œ,

jsx ꡬ문이 React ν•¨μˆ˜ 호좜 ν˜•νƒœλ‘œ λ³€ν™˜λ˜λ©°, 두 번째 예제처럼 λ°”λ€Œκ²Œ λ©λ‹ˆλ‹€.

 

Babel은 _jsx와 _jsxs 같은 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μš”μ†Œλ₯Ό μƒμ„±ν•˜λŠ”λ°

μ΄λŠ” React κ°€ μ»΄ν¬λ„ŒνŠΈλ₯Ό μ‹€ν–‰ μ‹œμ μ— μ΅œμ ν™”λœ λ°©μ‹μœΌλ‘œ μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ κ²ƒμž…λ‹ˆλ‹€.

 

μ΄λŸ¬ν•œ λ³€ν™˜μ€ μ½”λ“œμ˜ μ„±λŠ₯을 λ†’μ—¬μ£Όλ©°, λΈŒλΌμš°μ €κ°€ μš”μ†Œμ™€ 속성을 μ²˜λ¦¬ν•˜κΈ°μ— 더 효율적인 ꡬ쑰둜 λ§Œλ“€μ–΄μ€λ‹ˆλ‹€.

 

 

μ‚¬μš© 방법

 

 

1. νŒ¨ν‚€μ§€ μ„€μΉ˜

npm install --save-dev @babel/core @babel/cli @babel/preset-env

 

 

2. ν”„λ‘œμ νŠΈ λ£¨νŠΈμ— babel.config.jsonμ΄λΌλŠ” μ΄λ¦„μ˜ κ΅¬μ„±νŒŒμΌμ„ λ§Œλ“ λ‹€.

 

{
  "presets": [
    [
      "@babel/preset-env",
      {
        "targets": {
          "edge": "17",
          "firefox": "60",
          "chrome": "67",
          "safari": "11.1"
        },
        "useBuiltIns": "usage",
        "corejs": "3.6.5"
      }
    ]
  ]
}

 

 

κ³΅μ‹λ¬Έμ„œμ— λ‚˜μ™€μžˆλŠ” μ˜ˆμ‹œ!!

μ§€μ›ν•˜λ €λŠ” λΈŒλΌμš°μ €μ— 맞게 ν•΄λ‹Ή 뢀뢄을 μ‘°μ •ν•΄μ£Όμ–΄μ•Ό ν•©λ‹ˆλ‹€.

 

λ”μš± μžμ„Έν•œ λ‚΄μš©μ€ 바벨 곡식 λ¬Έμ„œλ₯Ό μ°Έκ³ ν•΄ λ³΄μ‹œκ³ !

 

바벨을 μ‚¬μš©ν•˜λ©΄ μ΅œμ‹  문법을 λͺ¨λ‘ μ‚¬μš©ν•  수 μžˆλ‹€κ³  μ°©κ°ν•˜μ‹œ μ‰¬μš΄λ°μš”,

 

바벨을 μ‚¬μš©ν•˜λ”λΌλ„ ν”Œλ¦¬ν•„κ³Ό ν”ŒλŸ¬κ·ΈμΈμ— λŒ€ν•œ μ μ ˆν•œ 섀정이 ν•„μš”ν•©λ‹ˆλ‹€!

 

ν”ŒλŸ¬κ·ΈμΈμ΄λž€?

 

바벨이 μ–΄λ–»κ²Œ μ½”λ“œλ₯Ό λ³€ν™˜ν•  지에 λŒ€ν•œ 룰을 μ •μ˜ν•΄ μ£ΌλŠ” μš”μ†Œ

ν•„μš”/λͺ©μ μ— μ˜ν•΄ λͺ¨μ•„놓은 ν”ŒλŸ¬κ·ΈμΈμ˜ 집합을 프리셋(preset)이라고 ν•©λ‹ˆλ‹€.

 

@babel/preset-react : λ¦¬μ•‘νŠΈ κ°œλ°œν™˜κ²½μ—μ„œ ν•„μš”ν•œ ν”ŒλŸ¬κ·ΈμΈλ“€μ„ λͺ¨μ•„놓은 프리셋
@babel/preset-env : λŒ€μƒ ν™˜κ²½μ— ν•„μš”ν•œ ꡬ문 λ³€ν™˜μ„ μ„Έμ„Έν•˜κ²Œ 관리할 ν•„μš” 없이 μ΅œμ‹  jsλ₯Ό μ‚¬μš©ν•  수 있게
@babel/preset-typescript
@babel/preset-flow
@babel/preset-jest

 

λ“± λ‹€μ–‘ν•œ 프리셋이 μ‘΄μž¬ν•©λ‹ˆλ‹€!

 

λ‚˜μ˜ ν”„λ‘œμ νŠΈ λ‚΄μ˜ babel.config.js

 

module.exports = {
  presets: ['module:@react-native/babel-preset'],
};

 

 

λ‚˜μ˜ babel.config.js νŒŒμΌμ„ μ‚΄νŽ΄λ³΄λ©΄

λ‚΄κ°€ 선언해두진 μ•Šμ•˜μ§€λ§Œ react native ν”„λ‘œμ νŠΈλ₯Ό μƒμ„±ν–ˆμ„ λ•Œ μžλ™μœΌλ‘œ μƒμ„±λ˜μ—ˆμ–΄μš”

 

μ΄λŠ” React native ν”„λ‘œμ νŠΈμ— ν•„μš”ν•œ λŒ€λΆ€λΆ„μ˜ 일반적인 Babel섀정에 ν•„μš”ν•œ ꡬ성이 이미 ν¬ν•¨λ˜μ–΄ μžˆμ–΄μš”.

μ΄λŠ” @babel/preset-react@babel/preset-env와 같은 μΆ”κ°€ 사전 섀정을 μˆ˜λ™μœΌλ‘œ 포함할 ν•„μš”κ°€ μ—†μŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€!

 

μ΄λ ‡κ²Œ ν•˜λ©΄ React Native ν”„λ‘œμ νŠΈμ— λŒ€ν•œ Babel ꡬ성이 더 κ°„λ‹¨ν•˜κ³  효율적이겠죠~?

 

νŠΉμ • μ‚¬μš©μž μ •μ˜λ‚˜ μΆ”κ°€ Banelν”ŒλŸ¬κ·ΈμΈμ΄ ν•„μš”ν•œ 경우 Babelꡬ성을 ν™•μž₯ν•  수 μžˆμ§€λ§Œ 

λŒ€λΆ€λΆ„μ˜ React Native ν”„λ‘œμ νŠΈμ—μ„œλŠ” '@react-native/babel-preset'λ§ŒμœΌλ‘œλ„ μΆ©λΆ„ν•©λ‹ˆλ‹€!

 

 

ν΄λ¦¬ν•„μ΄λž€?

 

이전 ν™˜κ²½μ— λˆ„λ½λœ jsκΈ°λŠ₯을 μΆ”κ°€ν•˜λŠ” μ½”λ“œμž…λ‹ˆλ‹€.

μ΅œμ‹  jsλ₯Ό 이전 λ²„μ „μœΌλ‘œ λ³€ν™˜ν•˜λŠ” 방법을 babel에 μ•Œλ €μ£ΌλŠ” ν”„λ¦¬μ…‹κ³ΌλŠ” λ‹€λ₯Έ κ°œλ…μž…λ‹ˆλ‹€!

 

폴리필은 λŸ°νƒ€μž„μ— λ“±λ‘λ˜μ§€ μ•Šμ€ λ©”μ„œλ“œλ‚˜ κΈ°λŠ₯을 μ£Όμž…ν•΄ μ£ΌλŠ” μ—­ν• !!

 

폴리필은 'Promise', 'fetch', 'Array.prototype.includes' 및 이전 λ²„μ „μ˜ λΈŒλΌμš°μ €μ—μ„œ μ§€μ›λ˜μ§€ μ•Šμ„ 수 μžˆλŠ” 기타 κΈ°λŠ₯κ³Ό 같은 νŠΉμ • js api λ˜λŠ” κΈ°λŠ₯을 μΆ”κ°€ν•˜λŠ” 데 자주 μ‚¬μš©μ΄ λ©λ‹ˆλ‹€!

 

 

폴리필 μ‚¬μš© 방법!

 

 

그럼 ν•΄λ‹Ή κΈ°λŠ₯을 μ–΄λ–»κ²Œ μ‚¬μš©ν•˜λŠλƒ?

폴리필을 μ‚¬μš©ν•˜λŠ” 방법은 크게 3κ°€μ§€κ°€ μžˆμ–΄μš”.

 

1. @babel/polyfillλ₯Ό import ν•΄μ„œ μ‚¬μš©ν•œλ‹€.

 

import '@babel/polyfill';

 

λͺ¨λ“  폴리필이 λΆˆλŸ¬μ™€μ Έ νŽΈλ¦¬ν•˜λ‹€λŠ” μž₯점이 μžˆκ² μ§€λ§Œ

λ‚΄κ°€ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” ν΄λ¦¬ν•„κΉŒμ§€ λΆˆλŸ¬μ™€μ Έ λ²ˆλ“€μ˜ 크기가 컀질 수 μžˆλ‹€λŠ” 단점이 있겠죠?

 

2. core-jsμ—μ„œ ν•„μš”ν•œ ν΄λ¦¬ν•„λ§Œ import ν•΄μ„œ μ‚¬μš©ν•œλ‹€.

 

μ„ νƒμ μœΌλ‘œ ν•„μš”ν•œ ν΄λ¦¬ν•„λ§Œ import ν•˜λŠ” λ°©μ‹μ΄μ—μš”!

μ΄λ ‡κ²Œ ν•˜λ©΄ λ²ˆλ“€μ˜ 크기λ₯Ό 쀄일 수 있겠죠?

ν•˜μ§€λ§Œ μ΄λŠ” 맀번 import ν•˜κΈ°κ°€ 번거둭고, λˆ„λ½ν•˜λŠ” μ‹€μˆ˜λ„ λ°œμƒν•  수 μžˆλ‹€λŠ” 단점이 μžˆμ–΄μš”

 

3. @babel/preset-env 프리셋을 μ‚¬μš©ν•œλ‹€.

 

μžλ™μœΌλ‘œ 폴리필이 ν¬ν•¨λ©λ‹ˆλ‹€!

ν•˜μ§€λ§Œ λ³΅μž‘ν•œ μ„€μ •μ΄λ‚˜ λ²ˆλ“€ 크기가 μ¦κ°€λœλ‹€λŠ” 단점이 μ‘΄μž¬ν•΄μš”!

 

 

 

 

 

 

μ—¬κΈ°κΉŒμ§€ babel에 λŒ€ν•œ μ•„μ£Ό 기본적인 κ°œλ…λ§Œ λ„£μ—ˆμ–΄μš”!

 

https://babeljs.io/

 

더 μžμ„Έν•œ λ‚΄μš©μ€ ν•΄λ‹Ή 곡식 λ¬Έμ„œλ₯Ό μ°Έκ³ ν•΄ μ£Όμ‹œλ©΄ 쒋을 κ±° κ°™μŠ΅λ‹ˆλ‹€!!πŸ’