April 21, 2023 • ☕️ 7 min read
감기 돌았니 🤒
ES6 Module은 cyclic dependencies(순환 참조)를 지원하도록 설계되었다.
순환 참조는 근본적으로 나쁜 것이 아니다. 특히 객체를 다루면서, 이러한 의존성이 필요할 수도 있다. 예를 들어, 몇몇 트리에서(ex. DOM 문서) 부모는 자식을 가리키고 자식은 다시 부모를 가리키는 경우가 있다.
라이브러리들에서는 섬세한 설계로 순환 참조를 피할 수 있다. 하지만 규모가 큰 시스템에서, 특히 리팩토링 시 순환 참조가 발생할 수 있다. 이때 모듈 시스템이 순환 참조를 지원하는 것이 좋다.
Node.js에서 순환적인 require()
가 발생하면, 의존하는 대상이 반환될 때까지 모듈은 실행을 끝내지 않는다. (예제는 Node.js 문서 에서 확인 가능). 다만 순환 참조 과정에서 import된 값이 아직 초기화되지 않아 undefined일 때 문제가 발생할 수 있는 것이다!
Ref https://exploringjs.com/es6/ch_modules.html#sec_design-goals-es6-modules
render
함수 대신 screen
을 사용해요Kent C Dodds에 따르면, RTL에서는 render
함수 대신 screen
을 쓰는 것이 권장된다.
screen
을 사용하면 필요한 쿼리를 추가/제거할 때 render
호출의 destructure(?)를 최신 상태로 유지할 필요가 없다. 에디터가 알아서 자동완성해줄 것이다.
이게 대체 무슨 뜻인가 했더니 나 말고도 이해 못한 사람들이 있어서 다행이다. 👉 https://stackoverflow.com/questions/61482418/react-testing-library-screen-vs-render-queries
render
는 구조 분해 할당할 수 있는 객체를 제공한다. 예를 들면 이렇게.
const { getByText } = render(<MyComponent />);
만약 다른 쿼리를 쓰고 싶다면, 이 구조 분해 할당 객체를 업데이트해야 한다. 예를 들면 이렇게.
const { getByText, getByLabelText } = render(<MyComponent />);
근데 screen
을 사용하면, 바로 객체에서 함수를 사용할 수 있다. 이렇게. screen.getByText
, screen.getByLabelText
👉 그래서 항상 최신 상태의 쿼리를 날릴 수 있다!
// ❌
const { getByRole } = render(<Example />);
const errorMessageNode = getByRole("alert");
// ✅
render(<Example />);
const errorMessageNode = screen.getByRole("alert");
Ref https://kentcdodds.com/blog/common-mistakes-with-react-testing-library#not-using-screen
-p
- npm에서는 --parseable
의 약자지만, npx에서는 --package
의 약자다.-c
- --call
의 약자로, 뒤에 실행하고자 하는 커맨트가 따라붙는다 (command의 약자가 아니었다니)
npx -- <pkg>[@<version>] [args...]
npx --package=<pkg>[@<version>] -- <cmd> [args...]
npx -c '<cmd> [args...]'
npx --package=foo -c '<cmd> [args...]'
Ref https://docs.npmjs.com/cli/v9/commands/npx
Entry.contentBoxSize
의 하위 프로퍼티로 ResizeObserver
가 있다.
blockSize
: width 에 대응되는 값inlineSize
: height에 대응되는 값👩🏫 Entry.borderBoxSize
도 동일하다. 다만 context box인지 border box인지만 다르다.
RPC(Remote Procedure Call)는 프로세스간 통신을 위해 사용하는 IPC(Inter Process Communication) 방법의 한 종류다.
💡 참고: gRCP (Google Remote Procedure Call)
node 16 EOL(end of life)의 일정이 기존보다 7개월 앞당겨진 2023년 9월 11일로 변경되었다. 이는 OpenSSL 1.1.1의 지원 종료 일정과 맞추기 위한 결정이라고 한다. 이에 따라 vite도 버전 5부터 node 14, 16의 지원을 모두 중단하기로 1차 합의되었다. Vite 5 Discussion
불용어란 “별 의미가 없는 단어”로, 관사, 전치사, 조사, 접속사, 의미없이 붙인 문자 숫자 등을 가리킨다.
touch-action
속성으로 터치 제스처를 제한할 수 있다. (e.g. touch-action: pan-y;
상하스크롤만 허용 (zoom pinch 방지 가능))구글에서 만든 대화형 생성 AI 바드(Bard)가 국내에 상륙했다고 한다!
Ref https://bard.google.com/?hl=en
정작 using 선언문은 없지만 그래도 맛있네요 특히 Linked Cursors for JSX Tags
undefined
를 리턴하는 함수들에 대한 쉬운 암묵적 리턴typeRoots
를 사용@param
JSDoc 태그 스니펫 제공
Snippet Completions for @param JSDoc TagsRef https://devblogs.microsoft.com/typescript/announcing-typescript-5-1-beta/
물론 나는 아니고
Ref https://jpub.tistory.com/1409
시상에 세상이 이렇게나 어마무시한 속도로 진화하고 있다 Ref https://nodejs.org/en/blog/announcements/v20-release-announce
크롬 최신 버전에 새로 나온 View Transitions API로 서로 다른 DOM 상태 사이 전환에 쉽게 애니메이션을 추가할 수 있다고 한다. 애플리케이션의 상태나 뷰 전환 간에 사용자를 컨텍스트에 유지시켜두면서 사용자의 인지 부하를 줄여줄 수 있다.
function updateView(event) {
// <a>나 <img> 태그 중 무엇에서 이벤트가 발생했는지를 구분한다
const targetIdentifier = event.target.firstChild || event.target;
const displayNewImage = () => {
const mainSrc = `${targetIdentifier.src.split("_th.jpg")[0]}.jpg`;
galleryImg.src = mainSrc;
galleryCaption.textContent = targetIdentifier.alt;
};
// View Transitions를 지원하지 않는 브라우저 대응
if (!document.startViewTransition) {
displayNewImage();
return;
}
// View Transitions를 사용
const transition = document.startViewTransition(() => displayNewImage());
}
Ref https://developer.mozilla.org/en-US/docs/Web/API/View_Transitions_API#browser_compatibility
한국 돌아와서 신난 마음 + 갓생 살겠다고 바로 무리해서 인생 풀악셀로 달리다가 기어코 감기몸살에 걸리고 말았다.
원래 감기같은 거 진짜 안 걸리는데, 성인되고 코로나 이외에 감기 처음 걸려보는 것 같다.
하루 약 먹으면 될 줄 알았는데, 나를 너무 과대평가했지 🫠
결국 휴가까지 내고 앓아누웠더니 조금 나아진 것 같다.
‘몸’은 나아졌는데 ‘목’은 안 나아진다. 목 아프다고 죽 먹어놓고 아이스크림은 목 안아프다고 또 냠냠 하는 인생 🤷♀️
그나저나 고작 6주였지만 매일같이 청정한 공기 마시다가 서울 오니 진짜 매캐한 냄새가 절로 느껴진다.
하… 도시가 좋다는 말 취소 🙅♀️ 이거 때문에 목이 더 아픈 것 같다.