이 글의 결론은 제 추측 임을 명심하세요!
$ npx create-react-app . --typescript // 당시 typescript CRA. 현재는 아래와 같이 해야 한다.
$ npx create-react-app . --template typescript // 현재 typescript CRA
const App: React.FC = () => {
return ...
}
function App(){
return ...
}
// 함수 선언문 function fn(){} ... // 함수 표현식 const fn = () => {}
이 글에서 알아볼 함수 선언문과 함수 표현식의 차이는 간단하게 다음과 같다.
이 두 가지 차이는 모두 '메인 로직과 그를 뒷받침하는 utils, helper를 구분하는' 과정에서 좀 더 깔끔한 코드를 지향할 때 문제가 될 수 있다.
함수 선언문의 경우 함수 호이스팅이 가능해 선언부를 모두 모듈 하단에 내려놓고, 메인 로직만 상단에 배치함으로써 가독성을 높일 수 있다.
표현식의 경우에도 실제 실행 로직은 없는 모듈의 경우에는 특별히 호이스팅 이슈에 걸리는 경우는 없다. 다만 TDZ(Temporal Dead Zone)은 표현식에서 항상 존재할 수 있는 이슈이다.
// 선언문은 함수 선언과 export default를 동시에 할 수 있다.
export default Fn(){}
// 표현식은 불가능하다
export default const Fn = () => {} // error
// named export는 가능하다
export const Fn = () => {}
export default와 함수 선언을 동시에 한다는건 무슨 의미일까? default로 내보내는 함수는 그 모듈의 메인 로직 일테고, 이는 코드를 보는 사람으로 하여금 가장 중요한 로직이 무엇인지 인지시킬 수 있다. (그리고 편리하다)
표현식을 지지하는 사람의 경우 "가장 중요한 메인 로직을 맨 위에 두면 똑같은거 아니냐"고 할 수도 있지만 먼저 언급한 호이스팅 이슈(TDZ)가 발생한다면 문제의 여지가 있다.
이 내용은 검색해볼 것..!
TypeScript로 React에서 함수 컴포넌트를 작성할 때, 표현식으로는 React.FC 타입을 지정했던 것 같다. 2019년도 근처 튜토리얼과 예제들은 대부분 React.FC를 사용했다. 다만 최근에는 React.FunctionComponent 타입을 지정하는 듯하다. 이 둘의 차이점은 찾아봐도 잘 나오지 않는다.. 같다는 사람도 있고.. 이 둘중 FunctionComponent가 더 낫다는 논란도 있었다고 한다! 자세한 정보를 찾을 수 없었다..
정정합니다. typescript 코드를 뜯어보니 FC와 FunctionComponent는 동일한 타입인 것 같습니다. 근데 왜 구분해놨는지는 모르겠음..
이 문장은 오해의 소지가 좀 있고, 아직 좀 더 알아보는 중이다.
이 글과 번역본에서 No Generics 부분을 참조할 것!!
아마 표현식으로 이 글에서 이야기하는 "어떤 타입이든 받을 수 있는 재사용성 컴포넌트 라이브러리"를 만드는 방법이 반드시 있을 것 같은데, 아직까지는 찾지 못했다.
그렇지만 "라이브러리는 선언문으로만 만들어야한다"는 전제라니 믿을 수 없다..
JavaScript를 공부하며 선언문, 표현식에 대해 공부했을 당시 내린 결론은 표현식이 더 낫다였다.
Airbnb 같은 큰 회사에서도 표현식을 코딩 스타일 가이드에서 권하고 있고,
보통 호이스팅 같은 동작은 예상치 못한 결과를 일으킬 수 있으며,
표현식을 통해서만 할 수 있는 각종 로직들이 존재 했기 때문이다.
하지만 "리액트의 컴포넌트 함수" 에 한해서는 선언문이 더 나을지도.. 라는 생각이 들었다.
export default과 선언을 동시에, 호이스팅을 활용한 코드 정리로 보는 이로 하여금 한 눈에 메인 로직을 보여주게 하기를 우선시한다면, 바닐라에서 표현식을 쓸 때의 장점을 다소 희생?하더라도 더 나은 로직일까?하는 생각도 들었다
게다가 모든 함수를 선언문으로 하겠다기보다 메인 로직에서만 그렇다는거니까??
아니 그러면 표현식이랑 선언문이랑 섞어쓰게되는데.. 더 안 좋아보이기도..?
리액트 공부하는데 왜 const로 함수를 선언하는 지 궁금했는데 같은 고민을 하시는 분이 계셨군요ㅎㅎ 답은 없겠지만 정리를 좋아하는 저의 입장에서는 표현식 형태가 깔끔하게 정리되어서 좋지 않을까 하네요ㅎㅎ 좋은 포스팅 감사합니다!