About

JavaScript 가이드

언어 내부, 런타임, 프레임워크 — 코드 레벨로 동작 원리 정리

브라우저 API

Web Workers — JavaScript에서 멀티스레드를 쓰는 법

postMessage의 구조화된 복제(Structured Clone)와 SharedArrayBuffer

Web Worker는 메인 스레드와 별도의 스레드에서 JavaScript를 실행한다. DOM 접근 불가, postMessage로 통신. 무거운 계산을 Worker에 넘기면 UI가 안 멈춘다.

Service Worker 생명주기 — install, activate, fetch의 순서

PWA의 핵심, 오프라인 캐시가 동작하는 메커니즘

Service Worker는 브라우저와 네트워크 사이에 프록시로 동작한다. install → activate → fetch 순서로 생명주기가 진행되며, Cache API로 리소스를 저장해서 오프라인에서도 앱이 작동하게 만든다.

Intersection Observer — 스크롤 이벤트 없이 요소 가시성 감지

lazy loading, 무한 스크롤, 애니메이션 트리거의 성능 좋은 구현 방법

Intersection Observer는 요소가 뷰포트에 들어오거나 나갈 때 콜백을 실행한다. scroll 이벤트 + getBoundingClientRect()보다 성능이 좋고, 브라우저가 최적화된 타이밍에 실행해준다.

Popover API란? JS 없이 툴팁 · 메뉴를 여닫는 법

popover 속성 하나로 열기/닫기, Esc 처리, 접근성이 자동으로 동작하는 브라우저 네이티브 UI

기존 툴팁은 이벤트 리스너, 상태 관리, ARIA 속성 수동 동기화가 전부 필요했다. Popover API는 이걸 브라우저 네이티브로 대체한다. popover 속성과 popovertarget만으로 열기/닫기, Esc 키, 키보드 내비게이션이 자동 동작한다.

Cookie · localStorage · sessionStorage — 질문 세 개면 고를 수 있다

같은 화면에서 폴더 트리는 Cookie, 스크롤 위치는 sessionStorage 로 갈린 이유

서버가 읽나 → 첫 HTML 에 반영돼야 하나 → 탭을 닫아도 남아야 하나. 이 순서로 물으면 거의 다 갈린다. 토큰 같은 비밀값은 묻지 말고 HttpOnly Cookie.

event.target vs currentTarget — 아이콘 선 위를 누를 때만 터지던 버그

data-* 를 읽을 땐 currentTarget. SVG 는 칠해진 선만 클릭을 받는다

리스너를 단 요소의 data-* 를 읽을 때는 event.currentTarget 을 쓴다. event.target 은 실제로 눌린 가장 안쪽 요소라서, 버튼 안 SVG 아이콘의 선을 누르면 <path> 가 잡히고 값이 undefined 가 된다.

웹 오디오

setInterval 로 드럼을 치면 박자가 흔들린다 — 「지금 울려」 말고 「몇 초에 울려」

JS 타이머는 깨우기만 하고, 소리는 오디오 시계로 미리 예약하는 lookahead 스케줄러

브라우저에서 박자를 맞추려면 타이머 콜백 안에서 바로 소리를 내지 말고, 25ms 마다 깨어나 앞으로 0.1초 안에 칠 음을 AudioContext 시각으로 예약한다. 같은 방해 조건에서 setInterval 은 114〜136ms 로 흔들렸고, 예약 방식은 0.5초 간격 그대로였다.

이어폰 「왼쪽만」 은 두 가지다 — StereoPanner(옮기기)와 ChannelSplitter(고르기)

pan: -1 은 오른쪽 소리를 버리지 않고 왼쪽으로 합친다. 실측으로 본 차이

이어폰은 받은 L/R 을 틀기만 한다. 웹에서 「왼쪽만」 을 만들 때 StereoPannerNode 의 pan: -1 은 오른쪽 소리를 왼쪽으로 옮기고, ChannelSplitter 는 왼쪽 채널만 골라 오른쪽을 버린다. 둘 다 오른쪽은 무음이지만 왼쪽에 무엇이 들리는지가 다르다.

오디오 테스트는 화면 말고 AnalyserNode 로 — 백그라운드 탭에서 17개가 전부 「무음」 으로 나온 이유

그림은 멈춰도 소리는 난다. 피크 값을 재면 클리핑까지 잡힌다

브라우저 자동화로 오디오 데모를 검사할 때 캔버스 파형을 보면 백그라운드 탭에서 requestAnimationFrame 이 멈춰 전부 무음으로 오판한다. AnalyserNode 의 시간 영역 데이터에서 피크를 재면 소리 유무와 클리핑(1 초과)을 둘 다 잡는다. 실제로 클리핑 3건을 찾았다.

Strudel 은 비트 스케치엔 최고, 곡 완성엔 약하다 — 그리고 lazy import 하면 이펙트가 조용히 빠진다

앱에 붙여 써 본 감상과, 「다음 mousedown」 을 기다리는 오디오 초기화 함정

Strudel 은 반복 패턴을 즉석에서 만지는 데는 강하지만 곡을 끝까지 만들거나 서비스에 넣는 데는 약하다. 앱에 넣을 때 번들(약 659KB)이 커서 클릭 시 dynamic import 했더니, 오디오 초기화가 이미 지나간 mousedown 을 기다리느라 shape 같은 AudioWorklet 이펙트가 에러 표시 없이 빠졌다. mousedown 을 직접 한 번 쏴 주면 고쳐진다.

오픈소스 분석

background-removal-js란? 브라우저만으로 이미지 배경을 제거해 투명 PNG로 만드는 구조

IS-Net ONNX 모델 + WASM 추론 + Canvas API, 서버 없이 클라이언트에서 완결되는 파이프라인

background-removal-js(imgly)는 이미지 배경을 제거해 투명 PNG로 돌려주는 JavaScript 라이브러리다. IS-Net 모델을 ONNX Runtime WASM으로 브라우저 안에서 돌려 서버가 필요 없다. 디코딩부터 PNG 인코딩까지 5단계를 코드로 본다.

OpenGenerativeUI — Claude의 시각 자료 생성을 오픈소스로 재현한 구조

CopilotKit Deep Agents + LangGraph + 샌드박스 iframe, AI가 차트·3D·다이어그램을 실시간 생성하는 파이프라인

CopilotKit이 Claude의 인터랙티브 시각 자료 생성 기능을 오픈소스로 구현했다. Next.js 16 프론트엔드 + Python LangGraph 에이전트가 HTML/SVG/Chart.js/Three.js 코드를 생성하고, 샌드박스 iframe에서 렌더링한다. MIT 라이선스. Star 1.1K.

Pretext — DOM 없이 텍스트 높이를 측정하는 순수 JS 레이아웃 라이브러리

Canvas measureText()로 글자 너비를 가져오고, 이후 줄 계산은 순수 산술 연산만 — 레이아웃 리플로우 0

브라우저에서 텍스트가 몇 줄인지 알아내려면 보통 getBoundingClientRect이나 offsetHeight를 쓴다. 하지만 이 방법은 레이아웃 리플로우를 강제한다. Pretext는 Canvas measureText()로 폰트 엔진에서 직접 글자 너비를 가져오고, 이후 줄 계산은 캐싱된 너비값으로 순수 산술 연산만 수행. DOM에 전혀 접근하지 않는다. 500개 텍스트 배치 기준 layout()이 0.09ms. React·Relay 창시자 chenglou의 프로젝트. ⭐ 7.1K.