June 10, 2023 • ☕️☕️ 9 min read
참을성이 없던 아이
타입스크립트에서 number union을 한방에 string union으로 바꿔보자
type NumberIncludedUnion = 100 | 200 | 300 | "none";
type StringUnion = `${NumberUnion}`; // '100' | '200' | '300' | 'none';
다음과 같이 buttonStyle
을 cva
로 지정한 후,
const buttonStyle = cva(
"flex items-center justify-center px-4 py-2 rounded font-medium focus: outline-none",
{
variants: {
intent: {
primary: "...",
secondary: "...",
},
},
defaultVariants: {
// ...
},
}
);
컴포넌트에서 가져다 쓸 수 있다.
<button className={buttonStyle({ intent: "primary" })} />
jest.useFakeTimers()
jest.runAllTimers()
Aborting after running 100000 timers, assuming an infinite loop!"
같은 실패 메시지를 보게된다.jest.runOnlyPendingTimers()
jest.advanceTimersByTime(n)
5,100,000글자 기준/5.1MB
spilt(' ').join('')
---- 82.53 msreplace(/\+s/g, '')
---- 144.96 msreplaceAll(' ', '')
---- 129.23 mstoBeVisible
단순 DOM 트리에 포함됐는지를 확인하는 toBeInTheDocument
보다 상세하게 검사한다.
실제 화면상에 보이는지 다음 항목을 통해 검증한다.
mousedown
event 발생focus
된 요소가 이미 존재한다면 해당 요소의 blur
(focusout
과의 차이는 bubbling에 있다) event가 발동한다.mouseup
event 발생click
event 발생preventDefault()
를 실행시켜 기본 동작을 막는다.👩🏫 주의!
click
이벤트는mousedown
과mouseup
사이가 아닌,mouseup
이벤트가 끝난 후 실행된다!
input onChange 이벤트 실행 시 위와 같은 warning 메시지가 뜨면서 실행이 너무 느릴 때
-> onChange handler로 실행되는 state updater 함수가 해당 컴포넌트의 리렌더링을 유발하는데, 이 컴포넌트가 너무 무겁거나 계산이 큰 로직이 포함되어 있지 않은지 확인하자!
resolve.fallback
Webpack 5는 더 이상 Node.js의 핵심 모듈을 자동으로 폴리필하지 않는다. 즉, 브라우저 등에서 실행되는 코드에서 사용하는 경우 npm에서 호환되는 모듈을 설치하고 직접 포함해야 한다.
Webpack이 resolve 시 node.js 폴리필을 찾지 못하면 명시한 fallback 경로로 가서 폴리필을 찾도록 해준다.
resolve: {
modules: ['./src', './node_modules'],
extensions: ['.ts', '.tsx', '.js', '.json'],
alias: { common: path.resolve('...') },
fallback: {
events: require.resolve('events/'),
buffer: require.resolve('buffer/'),
querystring: require.resolve('querystring-es3'),
},
},
Ref https://webpack.kr/configuration/resolve/#resolvefallback
nest에서 제공하는 HttpService의 get, post 등의 요청이 Observable<AxiosResponse<T>>
타입의 값을 반환하기 때문에,
observable 타입의 값을 다루는 rxjs의 메서드를 이용하여 원하는 값을 정제할 수 있다.
import { HttpService } from '@nestjs/axios';
import { firstValueFrom } from 'rxjs';
async getRegistryInfo(name: string) {
return this.httpService.get<NexusRegistryResponse>(
`${NEXUS_NPM_URL_PREFIX}/${name}`,
);
}
async getLibraryMeta(name: string) {
try {
const { data } = await firstValueFrom(await this.getRegistryInfo(name));
// ...
}
// ...
}
rxjs
firstValueFrom
- observable을 구독하여 observable을 promise로 바꿔준다. observable에서 도착하는 첫 번째 값을 promise로 resolve하고 구독은 종료된다.
Ref https://rxjs.dev/api/index/function/firstValueFrom
HTMLElement.style
CSSStyleSheet
Window.getComputedStyle()
Ref https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleDeclaration
Ref https://www.debugbear.com/docs/metrics/time-to-first-byte
(이번주는 적을 게 없네? 🙃)
Partytown은 리소스를 많이 사용하는 스크립트를 메인쓰레드가 아닌 web worker에 재배치함으로써 lazy-load를 해주는 라이브러리다. 메인쓰레드를 코드 전용으로 지정하고, 써드파티 스크립트를 web worker에 맡김으로써 사이트의 속도를 높인다.
전에 어디선가 들어본 것 같은데, 참신한 라이브러리구만
Partytown을 적용할 각 써드파티 스크립트에 다음 script 구문을 삽입하여 사용한다.
<script type="text/partytown">...</script>
Ref
애플에서 요런 것도 만들고 있었구나 😯
웹사이트를 Mac Dock에서 사용할 수 있는 앱으로 옮겨놓은 형태다.
Ref https://developer.apple.com/videos/play/wwdc2023/10120/
키오스크 편리하지만 공공성을 너무 해쳐 진짜 반대하는 사람 중 하나로써~
드디어 이런 게 나왔구나. 2023년이 되어서야…
그럼에도 실제 노령자층이나 장애인들에게 실질적인 도움이 되는지는 궁금하다.
뭐든 차근차근 나아지겠지 🤷♀️
ui.dev 팀에서 만들었다고 한다. (무슨 팀인지 모른다 ^^;)
적은 데이터에서 “70%” 개선, 많은 데이터에서도 1.7% 개선…
이제 AI가 알고리즘도 만들어주는 세상이라니. 머지 않았다. (?)
Ref https://news.hada.io/topic?id=9352
wasmer 그룹에서 새로 마련한 WASI의 superset(WASI를 기반으로 하는 시스템 호출 확장)으로, 현재까지 C와 Rust로 제공한다. (C ffi/addon을 통한 확장이 가능해 node 등 다양한 런타임에서의 wrapping 확장이 가능하다.)
계획대로만 진행된다면 현재의 작업환경을 아무런 변경없이 WASI-based로 이전하는 것까지도 가능할 것으로 보인다.
🤔 WASI가 뭐였지… 브라우저 외부에서 WebAssembly를 사용하기 위한 Mozilla 프로젝트로, WebAssembly 환경이 운영 체제에서 제공하는 기능에 액세스 할 수 있도록 한다.
Ref
실행력은 대단하지만 참을성도 기다릴 줄도 모르던 바보같은 애는 커서도 여전히 그런 어른이 되었당
이런 날도 있고 저런 날도 있는 거지 싶지만 조금만 더 맘놓고 기다릴 줄 안다면 더 나은 내일이 되지 않을까 😙