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()이 실행된다.
useEffecthook 내부에서 쓰는 값은 모조리 deps에 넣어달라고 lint가 불평하곤 했었는데,useEffectEventhook을 사용하면, 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주 앞으로 다가왔고, 갑자기 인생 난이도 극상승 🎢
역시 돈 버는 건 쉽지 않다. 새로운 계획이 필요해