November 4, 2022 • ☕️ 6 min read
넘 추웡
반응형 디자인이란, 하나의 UI가 모든 디바이스 화면에 대응되도록 디자인하는 것이다. 반응형 디자인에도 2가지 스타일이 존재한다.
Ref https://hello-woody.tistory.com/8
react-query를 사용할 때, 항상 그 수많은 key들을 어떻게 관리해야할지 의문이었다. 그런데 query-key를 만들어주는 라이브러리를 알게 되었다. 바로 query-key-factory
createQueryKeyStore
메서드를 사용하여 앱에서 사용하는 query key들을 한데 선언한다.
import { createQueryKeyStore } from "@lukemorales/query-key-factory";
// if your prefer to declare everything in one file
export const queries = createQueryKeyStore({
users: {
all: null,
detail: (userId: string) => ({
queryKey: [userId],
queryFn: () => api.getUser(userId),
}),
},
todos: {
detail: (todoId: string) => [todoId],
list: (filters: TodoFilters) => ({
queryKey: [{ filters }],
queryFn: (ctx) => api.getTodos({ filters, page: ctx.pageParam }),
contextQueries: {
// ...
},
}),
},
});
useQuery
를 사용하는 곳에서는 다음과 같이 가져온다.
import { queries } from "../queries";
export function useUsers() {
return useQuery({
...queries.users.all,
queryFn: () => api.getUsers(),
});
}
export function useUserDetail(id: string) {
return useQuery(queries.users.detail(id));
}
자바스크립트로 간단하게 polling과 retrying을 구현할 수 있다.
const timeout = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
while ((await timeout(500), true)) {
if (request().ok) {
break;
}
}
👩🏫 쉼표 연산자 쉼표 연산자는 각각의 피연산자를 왼쪽에서 오른쪽 순서로 평가하고, 마지막 연산자의 값을 반환합니다. 위 예제에서,
while (await timeout(500))
만 하면while (undefined)
니 루프가 안 돌지만, 쉼표 연산자 우항에treu
값을 넣으면while (true)
가 돼 무한 반복한다. (Ref)
*=
signCSS에서 *=
기호는, 특정 문자열을 포함하고 있는 속성을 가리킨다.
element[attribute*="includesthis"]
즉 다음 요소에서 a
태그는,
<a class="someclassicol-hello">Click me and win a free monkey</a>
아래 CSS 셀렉터로 가져올 수 있다.
a[class*="icol-"]
👩🏫 참고
- 특정 문자열로 시작할 때:
^=
- 특정 문자열로 끝날 때:
$=
curl
명령어를 통해서 젠킨스 서버를 실행시키는 것이었다.pages/
에서 app/
으로
app/
디렉토리는 여전히 nested routes와 layout을 지원한다.page.js
파일을 이용하여 정의할 수 있다.page.js
, layout.js
)이 사용된다.app/
디렉토리 안에 컴포넌트, 스타일, 테스트 파일들까지 넣을 수 잇다.getServerSideProps
, getStaticProps
, getStaticPaths
등의 데이터 페칭 함수들은 이제 app
내의 새로운 API로 대체되었다.pages/_app.js
와 pages/_document.js
는 이제 하나의 app/layout.js
로 대체되었다.pages/_error.js
는 더 세분화된 error.js
파일들로 대체된다.pages/404.js
는 notFound()
로 대체되었다.pages/api/*
는 pages/
디렉토리 안에 남는다.<Image />
컴포넌트의 개선: 클라이언트 자바스크립트 코드를 줄이고, 스타일 방식과 접근성을 개선했으며, 브라우저 네이티브 lazy loading을 지원한다.<Link />
컴포넌트의 변화: 이제 더 이상 자식에 <a>
태그를 넣을 필요가 없다.<Script />
컴포넌트: pages/
와 app/
디렉토리를 모두 지원하게 되었다.next/font
모듈을 제공하여, 폰트 로딩 속도를 커스텀하게 향상시킬 수 있다.뭔가 엄청 많이 바뀐 것 같은데, 점진적인 적용이 가능하다고 한다 😎
Ref https://beta.nextjs.org/docs/upgrade-guide
critical 등급의 OpenSSL 보안 취약점이 있었고, 11/1 긴급 패치 업데이트가 이루어졌다고 한다.
Ref https://www.zdnet.com/article/openssl-warns-of-critical-security-vulnerability-with-upcoming-patch/
(Vue.js/Vite 개발자 Evan You의 글이다.)
Turbopack이 공개되면서 “Vite보다 10배 빠름”을 강조하며 많은 곳에서 사용되었다.
Next 13 + Turbopack 이 React HMR에서 0.01초 걸린데 반해, Vite는 0.09초 걸렸다는 벤치마크 결과가 있었다. 그러나 다른 성능에서는 10배 빠른 것은 없고 오직 HMR에서만 그렇게 나왔다.
Vercel이 처음엔 실제 HMR 벤치마크 자료를 첨부하지 않아서 직접 Next 13과 Vite 3.2를 비교해 본 결과, (코드와 방법 모두 공개) 실제로는 Next HMR이 2배 정도 빠르게 나왔다.
하지만 이건 Vite가 Babel을 이용하기 때문에 약간 다르게 나온 결과일 수 있다. 똑같이 Rust로 코딩된 SWC를 이용하면 속도가 거의 비슷하게 나오기 때문이다. (Vite가 SWC를 사용하지 않은 것은 SWC의 크기 문제 때문이다. Vite가 19MB인데, SWC가 58MB이다.)
흥미로운 점은, import 하는 컴포넌트가 많아지면 Next/Turbo는 4배 느려지는데 반해 Vite는 2.4배만 느려진다.
Evan이 벤치마크를 공개하고 나서, Vercel도 블로그에 벤치마크 방법을 공개했다.
결과적으로 Turbopack이 10배 빠르려면
그러한 결과가 나온다는 것이다!
Evan You는 사용자가 용량vs속도에 대한 트레이드 오프를 스스로 결정할 수 있도록 Vite에서도 공식 React SWC 플러그인 도입을 고려중이라고 한다.
Ref https://github.com/yyx990803/vite-vs-next-turbo-hmr/discussions/8
Ref https://shopify.engineering/remix-joins-shopify
2019년부터 구글이 jpeg를 대체하기 위해 내놓은 이미지 포맷인 XL이 여전히 실험적이고 아직 생태계에서 각광 받지 못한다는 이유로 드롭되었다.
XL포맷은 webp등의 포맷보다 효율적이고 무손실과 빠른 처리등으로 사용된 바 있다.
Ref https://www.phoronix.com/news/Chrome-Dropping-JPEG-XL-Reasons
디자인 패턴을 그림으로 쉽게 정리한 페이지
Ref https://refactoring.guru/ko/design-patterns
인생 첫 지인 결혼식을 다녀왔다. 거의 우테코 정모였고, 반가운 얼굴들과 함께 결혼식도 보고, 맛있는 밥도 먹고, 다같이 처음으로 멀끔한 차림으로 워크샵을 빙의한 놀자판까지 즐거운 주말이었당 😋