본문 바로가기
front/vue

[Vue] defineComponent()

by juniKang 2022. 7. 30.

defineComponent란?

뷰 컴포넌트를 정의할 때 타입 추론을 도와주는 타입 헬퍼이다.

 

Type

function defineComponent(
  component: ComponentOptions | ComponentOptions['setup']
): ComponentConstructor

=> 예시에서 타입은 가독성을 위해 간략화 했다.

 

Details

첫번째 아규먼트는 컴포넌트 옵션 객체를 받는다. 리턴 값은 옵션객체와 동일한 객체일 것이다. 왜냐하면, 이 defineComponent 함수는 본질적으로 유형추론 목적으로 사용하는 것이기 때문에 런타임시에 옵션이 없기 때문이다. 

 

리턴타입은 약간 특별한데, 옵션에 기반하여 추론된 컴포넌트 인스턴스의 생성자 타입이다. 이 생성자 타입은 리턴타입이 TSX에서 태그로 사용될 때 타입 추론에 사용된다. 

 

아래처럼 defineComponent()의 리턴타입으로부터 컴포넌트의 인스턴스 타입을 추출할 수 있다. ( options의 this의 타입과 동일하다)

const Foo = defineComponent(/* ... */)

type FooInstance = InstanceType<typeof Foo>

Note on webpack Treeshaking

defineComponent()가 함수호출이기 때문에, 웹팩같은 빌드 툴로 사이드 이펙트가 생성될 것 처럼 보인다. 컴포넌트가 사용되지 않을 때 조차 트리쉐이킹으로부터 사이드이펙트는 일어나지 않는다.

 

웹펙에게 이 함수호출이 트리쉐이킹으로부터 안전하다고 말해주기 위해, 함수를 호출하기 전에  /*#_PURE_*/ 커멘트 노테이션을 추가할 수 있다:

export default /*#_PURE_*/ defineComponent(/* ... */)

 

이건 Vite를 사용할 떄에는 불필요하다. 왜냐하면 Rollup (Vite에 의해 사용되는 기초 프로덕션 번들러) 이 defineComponent는 저런 번거로운 주석이 필요없이 사이드 이펙트로부터 자유롭다는걸 알고있기 때문이다.

 

 

'front > vue' 카테고리의 다른 글

[vue]mergeProps()  (0) 2022.07.30
[Vue] h()  (1) 2022.07.30
[Vue] Custom Directives  (0) 2022.07.29
[vue3] checkbox specification  (2) 2022.07.25
[eslint] vue3 eslint 설정  (0) 2022.07.23

댓글