July 23, 2022 • ☕️☕️ 8 min read
맥북 너 왜그러는데
git stash drop 을 통해 삭제했던 stash 목록을 볼 수 있으며, 복구할 수 있다.
// stash 삭제한 목록
git fsck --unreachable | grep commit | cut -d ' ' -f3 | xargs git log --merges --no-walk
// stash 복구하기
git update-ref refs/stash < Commit ID > -m "다시 저장할 Stash 이름"
core-js, babel/polyfil 은 Promise
, Set
, Map
같은 빌트인 변환 함수를 제공하는데, 이는 global scope를 더럽힌다. 따라서 이 함수들을 스코프로 처리해줄 수 있는 @babel/plugin-transform-runtime 등의 런타임 라이브러리를 사용하는 것이 좋다.
Ref https://tech.kakao.com/2020/12/01/frontend-growth-02/ https://babeljs.io/docs/en/babel-plugin-transform-runtime
eslint import/order
룰을 설정할 때 newlines-between
옵션을 통해 import 그룹별로 개행을 추가할 수 있다.
// .eslintrc.js
"import/order": [
"error",
{
groups: [
"builtin",
"external",
"internal",
"parent",
"sibling",
"index",
],
alphabetize: {
order: "asc",
},
"newlines-between": "always",
},
],
// import 예시
import { Col, Row } from "antd/lib/grid";
import dayjs from "dayjs";
import PageTitle from "components/Title";
import PATH from "routes/path";
import StatusCard from "./units/StatusCard";
async function
안에서 return await
를 하면 콜스택 안의 함수에서 Promise가 resolved 될 때 까지 대기하므로 추가적인 microtask 비용이 든다.
관련해서 eslint에 no-return-await 룰이 있다.
주의할 점은, 아래 코드도 return await
과 동일하다는 것이다.
// Bad
async function foo() {
// 'return await bar();'와 동일하지만, eslint는 이를 잡지 못한다.
const x = await bar();
return x;
}
아래처럼 작성해야 한다.
// Correct
async function foo() {
return bar();
}
파일의 첫번째 몇줄만 뽑아낼 수 있는 터미널 명령어다. grep
으로 매치된 문자열 중 첫번째 것만 뽑은 싶은 경우에도 활용할 수 있다.
grep -Eo '(feat|test)' | head -1
Ref https://stackoverflow.com/questions/14093452/grep-only-the-first-match-and-stop
React.FC
, React.VFC
사용을 반대하는 입장의 주장은 다음과 같다.
React.VFC
는 @types/react 16.9.48 에서 추가되었으나, React 18에서 Deprecated 되었다. 또 React.FC는 Create React App Typescript 템플릿에서 삭제되었다. React.FC
는 이 함수가 “react function component”임을 명시할 수 있다는 장점이 있지만, 단점들도 존재한다.
children
을 암시적으로 포함하고 있다. (이 부분은 React 18에서 수정되었다.)
children
을 포함시키기 위해 별도의 intersection을 만들어 써야 한다.defaultProps
와 함께 동작하지 않는다.React.FC를 찬성하는 입장에서는 이를 반박한다.
리턴 타입이 명확히 JSXElement가 되지 않는이상 FC와 VFC는 지켜져야 한다. React.FC를 쓰지 않으면, 의도치 않게 컴포넌트의 리턴 값을 Promise<void>
와 같은 타입으로 반환해버릴 수 있다. FC, VFC는 컴포넌트틀을 예측 가능한 범위로 만드는 것에 대한, React의 가이드다. 그렇기 때문에 props를 제외하고 () => JSXElement
형태의 제약이 존재한다.
리턴타입을 지정하지 않는다면 컴포넌트에서 비즈니스 등을 갖고 있는 특성상 타입 추론에 의존할 때, 다음과 같은 상황이 발생할 수 있다.
if (!pageRender) return;
return <div>hi</div>;
이런 경우, 잠재적으로 Promise<void>
혹은 void
를 반환하게 되며, 의외로 이런 실수는 자주하는 개발자의 실수 중 하나다. early return이 아니라 React 18의 ErrorBoundary 혹은 Concurrency API 등의 명확한 방법을 사용하지 않는 이상 피할 수 없는 문제다.
또 함수 컴포넌트에 제네릭을 사용하는 것은 컴포넌트 복잡도를 증가시키기 때문에 사용해서는 안 된다.
git log --dirstat-by-file
: 커밋 로그를 볼 때 해당 커밋에 변경사항이 있는 파일들을 같이 볼 수 있다.<Component>
{a} {b}
</Component> // children은 [a, b]
@types
패키지가 컴파일에 포함된다. 만약 typeRoots
가 명시되어 있으면, typeRoots
에 있는 패키지들만 컴파일에 포함된다. (Ref)
{
"compilerOptions": {
"typeRoots": ["./typings", "./vendor/types"]
}
}
<i>
태그의 크기 조절에는 width
height
대신 font-size
를 쓰자. width
height
는 이미지 (컨테이너를 가리킨다)의 크기를 조절한다.HTMLAttributes
에 ref
와 key
가 추가된 형태다.interface ReactHTML {
a: DetailedHTMLFactory<
AnchorHTMLAttributes<HTMLAnchorElement>,
HTMLAnchorElement
>;
// ...
body: DetailedHTMLFactory<HTMLAttributes<HTMLBodyElement>, HTMLBodyElement>;
br: DetailedHTMLFactory<HTMLAttributes<HTMLBRElement>, HTMLBRElement>;
button: DetailedHTMLFactory<
ButtonHTMLAttributes<HTMLButtonElement>,
HTMLButtonElement
>;
// ...
}
을 앞두고 잇다!
Ref https://github.com/axios/axios/releases/tag/v1.0.0-alpha.1
그리고 axios의 미래는?
Ref https://github.com/axios/axios/issues/4209
멋쟁이사자처럼 홈커밍을 다녀왔다. 원래 갈 생각이 없었는데, 운영진 친구들이 가자 그래서 살짝 다녀왔다. 오랜만에 보는 얼굴들도 반가웠고, 벌써 10기나 되어버린 후배 기수들이 정말 눈이 반짝반짝 다들 너무 멋있었다.
지난주 흠뻑쇼의 여파인지 일주일 내내 아침에 일어나기가 너무 벅찼다… 따라잡을 수 없을 만큼 빠른 속도로 일이 늘어나고 있지만, 어쨌든 하나씩 쳐내고 있는 것 같다.
그런데 일요일 아침에 블로그 쓰려고 개인 노트북을 열어보니… 고장났다! 무슨 수를 써도 켜지지 않는다. 완전 거지같다. 😩