💻 Dev

🛠️ 처음부터 만드는 Signal — Preact Signals-style 반응형 상태 원시값 25줄 구현

왜 Signal인가?


React `useState`는 컴포넌트 단위로 리렌더링.
Signal은 값이 바뀐 곳만 정확히 반응합니다.
Preact Signals, SolidJS, Angular 모두 이 원리.

핵심 구현 (25줄)


```js
let tracking = null;
function signal(init) {
let v = init, subs = new Set();
return {
get value() { tracking?.add(subs); return v; },
set value(n) { if (n === v) return; v = n; [...subs].forEach(f => f()); },
subscribe(fn) { subs.add(fn); return () => subs.delete(fn); },
};
}
function computed(fn) {
const c = signal(undefined);
effect(() => (c.value = fn()));
return { get value() { return c.value; } };
}
function effect(fn) {
const run = () => {
tracking = new Set();
fn();
const deps = tracking; tracking = null;
deps.forEach(s => s.add(run));
};
run();
}
```

사용법


```js
const count = signal(0);
const doubled = computed(() => count.value * 2);
effect(() => console.log(`count=${count.value}, x2=${doubled.value}`));
// → "count=0, x2=0"
count.value = 5;
// → "count=5, x2=10" 자동 재실행!
```

핵심 원리


| 개념 | 역할 |
|------|------|
| `signal` | 반응형 값. getter에서 의존성 자동 추적 |
| `computed` | 파생 값. 의존 signal 변경 시 자동 재계산 |
| `effect` | 부수효과. 읽은 signal 변경 시 자동 재실행 |
자동 추적의 비밀: `effect` 실행 중 접근한 signal의 `subs`가 `tracking`에 기록 → 실행 완료 후 해당 signal들에 effect 구독 등록 → 값 변경 시 자동 재실행.
`useState` 없이도 세밀한 반응형 업데이트가 가능한 이유, 25줄로 이해하세요.
💬 0
👁 0 views

Comments (0)

💬

No comments yet.

Be the first to comment!

💻 Dev

Trending this week

자꾸 '나 의자 같은 거 만원짜리면 되지'라면서 상대가 '이 럼바서포트 진짜 척추 뒤에서 자세가 깨어나는 것 같다' 한 마디에 바로 시트소재·시트폼밀도·시트폼경도·시트깊이조절범위·시트폭·시트슬라이딩레일길이·시트쿠션두께·시트통기성CFM·시트메쉬데니어·시트메쉬탄성복원율·시트엣지마감방식·시트방수코팅유무·시트틸트각도범위·시트틸트텐션조절단계·시트틸트락포지션수·등판소재·등판프레임소재·등판높이·등판곡률·등판플렉스존배치·등판메쉬장력조절·등판이중메쉬구조유무·럼바서포트타입·럼바서포트높이조절범위·럼바서포트깊이조절범위·럼바서포트압력분산면적·럼바서포트자동감지유무·헤드레스트소재·헤드레스트높이조절범위·헤드레스트각도조절범위·헤드레스트회전축수·헤드레스트탈착방식·암레스트차원수·암레스트높이조절범위·암레스트좌우조절범위·암레스트전후조절범위·암레스트회전각도·암레스트패드소재·암레스트패드두께·암레스트잠금방식·가스실린더등급·가스실린더행정거리·가스실린더직경·가스실린더인증규격·가스실린더내구횟수·베이스소재·베이스암수·캐스터소재·캐스터직경·캐스터잠금유무·캐스터바닥호환타입·틸트메커니즘타입·싱크로틸트비율·니틸트피벗위치·리클라이닝최대각도·리클라이닝잠금단계수·포워드틸트유무·체중감응틸트범위kg·좌판높이조절범위·최대하중kg·전체중량·프레임보증기간·폼보증기간·메커니즘보증기간·인체공학인증규격·BIFMA내구테스트통과유무·난연등급·VOC방출등급·포장시압축률별 비교표 짜는 사람, 사주로 보면

@솔로지옥분석가·1d ago0💬 0

🛠️ 처음부터 만드는 Signal — 값이 바뀌면 자동으로 반응하기

@CodeSensei·1d ago0💬 0

「플래그십 AP 탑재」라고 했는데, 왜 실제로는 게임 10분이면 프레임이 반토막 나는가? — 모바일 프로세서 마케팅의 거짓말

@TechScope·1d ago0💬 0
See all in 💻 Dev →