May 18, 2024 • ☕️☕️ 11 min read
Ref https://www.npmjs.com/package/@module-federation/typescript
git mv
를 사용해서 도전해보자.
1. git mv로 이름바꾸기
git mv original copy
git commit -n -m "rename original to target name"
2. 해시값 기억해두고 커밋 리셋하기
REV=`git rev-parse HEAD`
git reset --hard HEAD^
3. 다시 git mv로 temp 만들기
git mv original temp
git commit -n -m "rename file to temp"
git merge $REV
git commit -a -n -m "resolve conflict and keep both files"
git mv temp original
git commit -n -m "restore name of copy"
작성한 대로 실행하면 히스토리가 original과 copy에 모두 유지된다.
재생하는, 또는 재생하려는 video 를 PIP로 전환할 수 있다. (사파리 WebKit 기준)
requestPictureInPicture()
- 사용자 액션(이벤트)가 필요하다.video.webkitSetPresentationMode('picture-in-picture')
- 사용자 액션 없이 스크립트로도 실행 가능하다.하지만 지원되는 환경에 차이가 있으니 확인해보자.
api 지원 확인 방법
document.pictureInPictureEnabled
video.webkitSupportsPresentationMode('picture-in-picture')
vite-plugin-libcss
vite.config
의 build.cssCodeSplit
build.lib
을 명시하면 falsebackground-clip: border-box
background-clip
의 기본값은 border-box
다.
해당 값이 border-box
일 때는 background에 준 색깔이나 이미지가 border까지 영향을 준다.
border는 그대로 그려지게 하고 싶으면 background-clip
을 padding-box
로 설정해야한다.
화면 꺼짐을 막을 수 있는 API 😲
Ref https://developer.mozilla.org/en-US/docs/Web/API/Screen_Wake_Lock_API
tailwind-css는 jest에서 인식하지 못한다. 생각해보면 당연하게 스타일 정의가 안되어 있기 때문이다.
이를 해결하기 위해서는 RTL render 시점에 style을 직접 주입해서 해결할 수 있다.
npx tailwindcss -i ./src/index.css -o ./src/__tests__/mocks/index.css (모킹 파일 생성할 위치)
render
를 할 때 style 태그를 생성하고 스타일을 주입한다.render(<컴포넌트 />)
/** tailwind css 주입 */
const style = document.createElement('style');
style.innerHTML = fs.readFileSync('src/__tests__/mocks/index.css', 'utf8');
document.head.appendChild(style);
<script>
와 <iframe>
, 어디까지 알고 있니?<script>
태그에 type="module"
지정 시 자동으로 defer
처리된다.
<iframe>
태그에 srcdoc
을 사용하면 URL 없이 HTML string을 주입할 수 있다
<iframe srcdoc="<html><script>....</script></html>"></iframe>
<script>
태그에 type="importmap"
지정 시 모듈을 더 짧은 이름으로 resolve할 수 있다
<html>
<script type="importmap">
{
"imports": {
"canvas-confetti": "https://esm.sh/canvas-confetti"
}
}
</script>
<script type="module">
import confetti from 'canvas-confetti';
confetti();
</script>
</html>
header에 캐시 컨트롤을 빼먹으면, 브라우저는 기본으로 캐싱을 한다.
🤔 얼마나?
👉 (Date - LastModified) / 10
의 시간만큼
🤔 왜? 👉 RFC 7234 스펙에 정의되어 있다. 여러 브라우저(크롬, 사파리)와 웹뷰도 같게 동작한다.
이전에 블로그로 작성한 내용입니다만 문득 달력보니 5월이길래 생각났어요. 17년 대통령 선거 준비할 때 실제로 겪은 일이거든요
Ref https://medium.com/a-day-of-a-programmer/756158e22f2d
넷플릭스에 채택되었다고 하는 통합/E2E 테스트 프레임워크로, Playwright의 강력한 기능을 그대로 사용할 수 있다.
ex)
Cypress나 Playwright를 이용할 경우 OAuth와 같은 외부 서비스 종속성으로 인해 컴포넌트 렌더링 자체가 불가능하여 테스트를 할 수 없다는 문제점이 있으나, 이러한 복잡한 인증 과정을 setup 단계에 수행할 수 있는 솔루션을 제공한다.
RAM은 휘발성 저장 장치이지만 전원이 차단 되어도 잠깐의 시간동안 데이터가 남아 있을 수 있는데, 이 때를 이용해 정보를 탈취하는 것을 ‘콜드 부트 공격’이라고 한다.
신기한 건, 냉각 스프레이를 뿌려 메모리를 말 그대로 ‘얼리면’ 데이터가 꽤 오랫동안 남아있어 이 같은 방식을 사용하기도 한다.
satisfies
객체의 value들이 유니온일 때 satisfies
를 사용하면 정확하게 key-value 타입을 매핑할 수 있다.
Record
를 사용해 객체의 key를 타입으로 검증하려는 상황에서 사용할 수 있다.
const obj: Record<'a' | 'b', string | string[]> = {
a: 'hello',
b: ['hello', 'world'],
};
obj.a.toUpperCase(); // 🚨 ERROR: Obj.a는 'string | string[]' 타입이므로, 'toUpperCase' 메서드를 사용할 수 없습니다.
const satisfiedObj = {
a: 'hello',
b: ['hello', 'world'],
} satisfies Record<'a' | 'b', string | string[]>;
satisfiedObj.a.toUpperCase(); // ✅ Ok
npm 패키지에서 캐럿이나 틸더 사용 시 설치 가능한 높은 버전으로 맞춰주게 된다.
ex)
"package": "^1.13.2"
"package": "^1.13.4"
인 경우 lock 파일에서 해당 패키지는 1.13.4 로 맞춰지게 된다.
소나큐브에서 JSX 요소 사이 누락된 공백을 방지하기 위해 다음과 같이 명시하기를 권장한다.
공백 문자가 있는 경우
{' ‘}
-> <div>Here is some{' '}<a>space</a></div>
공백 문자가 없는 경우
{/* */}
-> <div><a>No space</a>{/* */}between these</div>
콘텐츠를 불러오기 위해 HTTP로 요청을 보내는 HTTPS 페이지를 일컫는 말.
대부분의 브라우저는 mixed active content 가 로드되지 않도록 막는다. (일부 mixed display content 포함)
git rev-parse
git rev-parse --show-toplevel
현재 인식되는 git의 root 경로 (.git이 있는 경로)를 반환한다.
alias root=cd $(git rev-parse --show-toplevel)
설정을 해두면 root
한방에 언제 어디서든 프로젝트 최상위로 갈 수 있다
cf) 모노레포에서 활용하기 좋다.
vscode의 경우
terminal.integrated.env.{os}
로 환경변수에${workspaceFolder}
변수를 주입해 워크스페이스의 root를 지정할 수 도 있다!
useEffect
의 callback은 언제 실행되나?정리!
useEffect
callback은 DOM 조작이 끝난 후에 실행된다. 대부분의 경우, paint 이후에 비동기적으로 실행되지만 최신 UI 업데이트가 중요하다고 판단되는 경우(예를 들어 사용자 인터랙션이나 layout effect로 스케줄링되는 리렌더링 동작이 있는 경우), 또는 단순히 React가 내부적으로 그렇게 할 시간이 있다고 판단될 경우 React는 callback을 paint 이전에 동기적으로 실행할 수도 있다.
useEffect
문제 하나씩 풀어야겠다 💃
Ref https://jser.dev/2023-08-09-effects-run-paint/
첫 글자 + 중간 글자 수 + 마지막 글자
로 줄여부르는 것을 가리킨다show reference in VSCode를 사용하면!
intelliJ에서 제공하는 Reference를 볼 수 있다. 클릭해서 바로 넘어가는 것도 가능하다 😉
리액트 19가 곧 나오려는 시점에서 바로 19를 업그레이드 하기보다, 18.3으로 먼저 업그레이드를 하면서 자연스럽게 19로의 업데이트를 준비하자!
버전 18.3은 18.2와 동일한 기능을 제공하지만, deprecated되는 API에 대해 경고를 띄운다.
Ref https://react.dev/blog/2024/04/25/react-19-upgrade-guide
텍스트 검색시 $A
와 같은 변수로 특정 값을 치환하고, 쉽게 수정할 수 있다. (복잡한 검색 시, 정규식으로 처리할 필요가 없다)
nvim에는 nvim.ssr이 있고, JetBrain IDE에서는 built-in으로 지원한다.
VSCode에서는 ast-grep에서 지원한다. 단순 문자열 치환이 아니라 ast기반으로 만들어졌다.
Software Mansion에서 만든 RN 개발용 VSCode Extension으로, Expo 못지않게 RN계에 진심인 곳 중 하나다.
기능은 다음과 같다.
Ref https://ide.swmansion.com/
(어떻게 읽는거지… 다그래? 요즘 사람들 다 그래~)
특정 형태의 트리를 그리기 위해 노드를 배치하는 로직이 구현된 라이브러리.
노드 배치 로직만 구현되어 있으며, 트리의 구성 노드의 좌표값이 계산되어 반환된다. 실제로 그려지는 부분에 대해서는 d3와 같은 라이브러리를 사용하면 된다.
빠르게 특정 형태의 트리를 그리고 싶을 때 사용하면 편할 것 같다.
Ref https://github.com/dagrejs/dagre
<style>{` p { color: red; } `}</style>
넘 낯선 코드
Ref https://react.dev/reference/react-dom/components/style
어떻게 읽는 거람? 지피티-포오? (ㅋㅋㅋ)
음성 어시스턴트 모델의 도입이라니. 영화 Her의 세계가 점점 더 가까워진다. (시러 ㅠ)
Ref https://www.aitimes.com/news/articleView.html?idxno=159625
여기저기 장미가 예쁘게 피어났다 🌷
어느덧 많이 더워진 5월의 날씨
왠지 혼자서는 부정적인 감정과 언행만 튀어나오는 것 같아서
다시 한번 따뜻한 봄같은 사람이 되어보자고 다짐해보는 한 주