February 18, 2024 • ☕️ 7 min read
SSG(Static Site Generation)에서 Static
이라는 용어가 들어간 것은 HTML이 정적이라는 것이지, 페이지가 정적이라는 것이 아니다.
SSG는 Next.js에서 권장하는 렌더링 방식으로, 다음과 같은 장단점이 있다.
FP
, FCP
, TTI
를 제공한다.SSR
과 달리 일관성있게 빠른 TFB
를 달성할 수 있다.이미 생성된 HTML 파일을 받기 때문에 SEO
친화적이다.Ref https://ajdkfl6445.gitbook.io/study/web/csr-vs-ssr-vs-ssg
기존 이벤트 핸들러들은 같은 동작을 다시 수행할 때만 다시 실행된다. 이벤트 핸들러와 달리, effect는 prop이나 state 등의 값이 지난번 렌더링과 달라지면 다시 실행된다.(re-synchronize).
이벤트 핸들러의 로직은 ‘non-reactive’하고, effect의 로직은 ‘reactive’하다고 말할 수 있다.
때로 이 두 개 동작을 섞고 싶을 수 있는데, 예를 들면 특정 값의 업데이트에만 동작하는 effect를 만들고 싶을 수 있다.
useEffectEvent
hook을 사용하면 non-reactive 로직을 effect에서 분리해낼 수 있다.
before
function ChatRoom({ roomId, theme }) {
useEffect(() => {
const connection = createConnection(serverUrl, roomId);
connection.on('connected', () => {
showNotification('Connected!', theme);
});
connection.connect();
return () => {
connection.disconnect()
};
}, [roomId, theme]); // ✅ All dependencies declared
// ...
theme
의 값만 바뀌었을 때도 showNotification()
이 실행되어버리는 버그가 있다.
after
function ChatRoom({ roomId, theme }) {
const onConnected = useEffectEvent(() => {
showNotification('Connected!', theme);
});
useEffect(() => {
const connection = createConnection(serverUrl, roomId);
connection.on('connected', () => {
onConnected();
});
connection.connect();
return () => connection.disconnect();
}, [roomId]); // ✅ All dependencies declared
// ...
onConnected
는 마치 effect 로직 같지만, 이벤트 핸들러처럼 동작한다. useEffectEvent
내부의 로직은 reactive하지 않으며, 마지막 props와 state의 값을 보게 된다.
이제 useEffect
의 deps에서 theme
을 지우면, roomId
가 바뀌었을 때만 showNotification()
이 실행된다.
useEffect
hook 내부에서 쓰는 값은 모조리 deps에 넣어달라고 lint가 불평하곤 했었는데,useEffectEvent
hook을 사용하면, reactive해야 하는 값만 정확하게 분리해낼 수 있을 것 같다.
즉 useEffectEvent
는 Effect에서 Event를 분리하기 위해 탄생한 것으로, reactive와 non-reactive한 업데이트에 대해서 생각해보면 좋을 것 같다.
Ref https://react.dev/learn/separating-events-from-effects
Ref
키보드의 cmd + k를 눌렀다가 k 먼저 떼고 cmd를 나중에 떼면 cmd의 이벤트만 발생하고 k는 무시된다.
그런데 cmd를 먼저 떼면 cmd와 k의 이벤트 둘 다 발생한다.
-> 즉, 메타키에서 손이 떼진 순간 비로소 keyup
이벤트가 발생한다.
cf) keydown과 keyup 이벤트가 항상 대칭으로 일어나는 것은 아니니 사용자 경험을 위해 커맨드를 이용한 숏컷을 만들때는 keydown 이벤트만을 이용하라는 애플의 큰그림?
react-beautiful-dnd의 메인테이너가 새로운 dnd 라이브러리를 만들고있다. 이미 트랠로,지라 등에 사용되고 있다고 한다.
이름은 pragmatic-drag-and-drop
아직 배포는 안됐지만 영상으로 어떤 라이브러리인지 설명한다.
react-beautiful-dnd에서는 마우스 이벤트를 사용해서 dnd를 구현했다면 이번에는 네이티브 drag-and-drop API를 이용해서 구현했다고한다. 모든 부분(성능, 번들 크기)에서 좋아졌지만 react-beautiful-dnd의 애니메이션은 사라진 것 같다. 네이티브 dnd라 어쩔 수 없는듯하다.
이 분은 dnd만 파신다고 한다. 멋진 외길인생…
스크린샷을 코드로 바꿔주는 서비스! 😲
뭐야… 어떻게 한거야…
Ref https://screenshottocode.com/
React 19 버전이라는 게 더 놀랍다. 16학번이었던 내가 19학번 맞이하는 느낌이랄까…
use(Promise)
: Promise가 resolve될 때까지 클라이언트 suspending 처리use(Context)
: useContext
와 같지만, loop이나 조건문 등에 사용할 수 있는 hookForm actions
: form이 submit될 때 발생하는 동작을 정의useFormState
: 비동기 form 동작을 도와준다. 마지막으로 form이 submit되었을 때의 값에 접근할 수 있다.useFormStatus
: form이 성공적으로 submit되었는지 알려준다.useOptimistic
: 액션이 실제로 완료되기 전까지 UI를 optimistic하게 update해준다.Tanstack Query, react-hook-form들의 기능들을 가져온 것 같은… 라이브러리들이 잘 나가는 꼴을 볼 수 없었던 건가…(?)
Ref https://marmelab.com/blog/2024/01/23/react-19-new-hooks.html
노장의 귀환… 아무튼 대단하다.
Ref https://blog.jquery.com/2024/02/06/jquery-4-0-0-beta/
Mozilla의 웹 엔진이라고 한다.
Ref https://news.itsfoss.com/servo-rust-web-engine/
요약
Ref
이번주 나의 합법적인 투잡이 시작되었고, 공연은 2주 앞으로 다가왔고, 갑자기 인생 난이도 극상승 🎢
역시 돈 버는 건 쉽지 않다. 새로운 계획이 필요해