August 31, 2024 • ☕️ 7 min read
테스트를 위해 특정 url 또는 도메인을 block 처리할 수 있다
Ref https://dev-yujin.tistory.com/entry/개발자도구-Block-request-URL-사용하기
<OffScreen>
이라는 컴포넌트 추가 예정, <Activity>
로 이름을 변경하여 개발startTransition
으로 감싼 업데이트는 긴급하지 않은 것으로 처리되며, 클릭, 키 입력과 같은 더 긴급한 업데이트가 들어오면 중단될 수 있음useTransition
: transition을 사용하기 위한 훅startTransition
: transition을 사용할 수 있는 APIcreateRoot
hydrateRoot
onRecoverableError
옵션
createRoot
, hydrateRoot
모두에서 사용 가능renderToPipeableStream
renderToReadableStream
useId
useId
로 생성된 ID는 컴포넌트가 다시 마운트될 때마다 달라질 수 있다.useTransition
긴급하지 않은 것으로 표시할 수 있게 해준다
(기본적으로 다른 상태 업데이트는 긴급한 것으로 간주)
const [isPending, startTransition] = useTransition();
useDeferredValue
긴급하지 않은 부분의 리렌더링을 지연시켜줌
debounce와 비슷하지만, 고정된 시간 지연이 없어서 첫 번째 렌더링이 화면에 반영된 직후 지연된 렌더링을 시도함
function SearchPage() {
const [query, setQuery] = useState('');
const deferredQuery = useDeferredValue(query);
// ...
}
useSyncExternalStore
외부 스토어(mobx, redux 등)가 동시(concurrent) 읽기를 지원할 수 있도록 업데이트를 동기화하는 훅
function TodosApp() {
const [subscribe, getSnapshot] = useSyncExternalStore(todosStore.subscribe, todosStore.getSnapshot);
// ...
}
라이브러리에서 사용되는 hook
useInsertionEffect
CSS-in-JS 라이브러리들이 렌더링 시 스타일을 주입하는 성능 문제를 해결할 수 있도록 돕는 훅
layout 을 읽어야하는 Effects가 호출되기 전에 스타일을 주입할 수 있습니다.
// CSS-in-JS 라이브러리 안에서
function useCSS(rule) {
useInsertionEffect(() => {
// ... <style> 태그를 여기에서 주입 ...
});
return rule;
}
라이브러리에서 사용되는 hook
React tree의 렌더링 성능을 측정해준다
phase: “mount” | “update” | “nested-update”
actualDuration
<Profiler>
와 그 서브트리가 현재 업데이트를 수행하는 데 걸리는 실제 시간baseDuration
<Profiler>
와 그 서브트리가 리렌더링하는 데 걸리는 시간👩🏫 baseDuration - actualDuration 값이 클수록 최적화(메모이제이션)가 잘 되었다는 의미
Ref https://react.dev/reference/react/Profiler
기본 패턴
Ref https://developer.mozilla.org/ko/docs/Web/API/IndexedDB_API/Using_IndexedDB
uncontrolled와 controlled 두 가지 방식으로 사용 가능하다.
register
함수를 사용Controller
컴포넌트 사용가상 API서버를 제공해 주어 요청과 응답이 실제 처리되는 것처럼 시뮬레이션해 준다.
Ref https://darrenlog.tistory.com/44
다음 코드를 vite.config.js에 추가한다.
function logBundleOrder(): Plugin {
let config: ResolvedConfig
return {
name: 'log-bundle-order',
configResolved(resolvedConfig) {
config = resolvedConfig
},
generateBundle(options, bundle) {
console.log('Bundle processing order:')
Object.keys(bundle).forEach((fileName, index) => {
console.log(`${index + 1}. ${fileName}`)
})
},
}
}
…
하반기에 접어들면서 많은 회사들의 테크 밋업 정보가 올라오는 중
드디어 ASDF 데뷔 무대 ^0^
아쉬움 반, 후련함 반 남았던 무대였지만
진짜 내가 밴드를 많이 사랑하는구나, 앞으로도 자주 보겠구나 느꼈던 순간
주말 저녁 날 보러 와준 사람들과 술 왕창 마시고 다음날까지 기절 🛌