분석 순서

  1. 훅 구현체 찾아가기
  2. 훅은 어떻게 생성되는가? (마운트)
  3. 훅은 어떻게 상태를 변경하고 컴포넌트를 리-렌더링시키는가?
  4. 상태가 변경되어 리-렌더될 때 변경된 상태 값은 어떻게 가지고 오는 것일까?(업데이트)

훅을 사용할 때 훅을 코어 패키지에서 불러 오지만 실제 구현체는 외부 모듈에 있다, 따라서 분석의 시작은 코어가 어떻게 외부 모듈에 있는 훅 구현체를 가지고 와서 제공하는지부터 확인한다

1. 훅 구현체 찾아가기

1-1 Hook의 구현체는 어디에 있을까?

// react > React.js

import { useState, useEffect, ... } from './ReactHooks'
import ReactSharedInternals from './ReactSharedInternals'
// 의존성을 주입받는 징검다리

const React = {
	useState,
	useEffect,
	__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED : ReactSharedInternals,
	/* ... */
}

export default React
// react > ReactHooks.js
import ReactCurrentDispatcher from './ReactCurrentDispatcher'

function resolveDispatcher() {
	const dispatcher = ReactCurrentDispatcher.current
	return dispatcher
}

export function useState(initialState) {
	const dispatcher = resolveDispatcher()
	return dispatcher.useState(initialState)
}

export function useEffect(create, inputs) {
	const dispatcher = resolveDispatcher()
	return dispatcher.useEffect(create, inputs)
}
/* ... */
// react > ReactCurrentDispatcher.js
const ReactCurrentDispatcher = {
	current : null,
}

export default ReactCurrentDispatcher