본문 바로가기

전체 글

safari, iPhone 예외 상황 대응하기(Navigation Gestures, new Date) 프로젝트: vegimap, tracking map 키워드: safari, iPhone, navigation gestures, date constructor, cross browsing 상황 1 vegimap은 지도가 화면 전체를 차지하고 있다. iphone에서 touch gesture로 지도를 이동하다보면 navigation gesture가 작동하여 페이지가 이전/이후로 이동해버릴 때가 있다. 지도 타일을 터치할 때는 navigation gesture가 작동하지 않도록 하고자 한다. 해결방법 1 특정 DOM element를 touch했을 때, navigation gesture가 실행되지 않도록 하는 custom hook을 작성한다. // useBlockNavigationGesture.ts import {.. 더보기
Web Worker로 setTimeout을 백그라운드에서 유지하기 프로젝트: tracking map(유동인구분석 지도) 키워드: web worker, setTimeout, inactive tabs 상황 setTimeout으로 특정 delay 시간 이후 동작해야하는 코드가 있다. 탭을 유지할 때는 버그가 일어나지 않지만, 다른 탭으로 이동(현재 탭은 비활성화)했다가 돌아오면 원하는 타이밍보다 훨씬 늦게 setTimeout이 실행되는 버그가 있다. 해결방법 setTimout이 의도와 다르게 동작하는 것은 브라우저의 정책 때문이다. https://developer.mozilla.org/en-US/docs/Web/API/setTimeout#reasons_for_delays_longer_than_specified 부하를 줄이기 위해서 탭이 inactive 될 때 delay 시간.. 더보기
Hammer.js로 swipe 이벤트 감지하기 프로젝트: 채식 지도 키워드: Hammer.js, swipe event, mobile swipe gesture, touch-action 상황 뒤로가기, Sheet 내리기, Sheet 올리기 동작은 버튼을 눌러 실행할 수 있다. (뒤로가기는 ' 더보기
모바일 기기에서 scroll 관련 버그 대응하기 프로젝트: 채식 지도 키워드: viewport height, window.innerHeight, scrollbar, pull-to-refresh, overscroll-behavior 상황 스크롤이 가능한 웹페이지를 moblie 기기에서 보면 예상치 못한 상황이 많이 일어난다. 그 중에서 1) vh가 viewport 보다 크게 잡히는 버그 2) scrollbar를 숨기고 싶은 상황 3) 안드로이드 기기의 pull-to-refresh 기능을 막고 싶은 상황을 대응하고자 한다. 해결 방법 height: 100vh에서 'vh' 단위는 'viewport height'를 의미하기 때문에 100vh는 브라우저 viewport의 높이와 일치해야한다. 하지만 모바일 기기의 경우는 주소창(top bar)과 navigati.. 더보기
react-window로 렌더링 성능 최적화하기 프로젝트: 채식 지도 키워드: react-window, rendering optimization 상황 매장 목록을 보여주는 UI를 구현하였는데, 매장 Row마다 각각 'button' DOM으로 구현되어있다. Next.js 프레임워크 덕분에 이미지()는 자동으로 lazy loading 되고 있어서 image 최적화 문제는 없을 것이다. 하지만 훗날 매장이 점점 많아지고 리스트가 길어짐에 따라 DOM 렌더링 성능에 문제가 생기고 화면이 끊겨보일 가능성이 있다. 그래서 사용자에게 보이는 DOM만 실제로 렌더링하는 'windowing 기법'을 써보기로 한다. 해결 방법 react 라이브러리 중 react-window라는 라이브러리를 설치한다. yarn add react-window yarn add -D @typ.. 더보기
UI library에서 spacing system props 구현하기 프로젝트: loplat UI 키워드: system props, spacing props, typescript 상황 컴포넌트 종류와 상관없이 모든 컴포넌트가 공유하면 좋은 prop이 있다. UI component에 margin이나 padding 값만 추가하고 싶은 경우가 많은데, 사소한 spacing css 때문에 class를 부여하거나 styled API를 사용하는 것은 수고롭다. loplat UI를 사내 프로젝트에 적용하면서 spacing(margin, padding) prop이 필요함을 느꼈기 때문에 spacing system prop을 만들고 적용하고자 한다. 해결방법 spacing system prop은 아래와 같이 사용 가능하다. // margin-top: 8px; margin-bottom: 8.. 더보기
Storybook에서 user interactions 테스트하기 프로젝트: loplat UI 키워드: storybook addon interactions, Storybook test runner, mdx story, csf story, jest 상황 loplat UI에 있던 기존 jest test file들은 cli를 통해서 동작하며 테스트의 진행 과정을 눈으로 확인하기 힘들다는 단점이 있다. loplat UI는 말 그대로 비지니스 로직보다는 ui 자체가 중심이므로, 스토리북과 연동된 테스트를 실행하면서 테스트 진행 상황을 스토리북에서도 확인할 수 있으면 좋을 것이다. 새로 알게된 'Storybook Addon Interactions'와 'Storybook Test Runner'를 도입하는 과정을 소개하고자한다. 해결 과정 1 (storybook addon inter.. 더보기
JS library에서 cjs, esm format 모두 지원하기 프로젝트: loplat UI 키워드: CommonJS, ES Modules, loplat UI, package.json, npm, babel, jest, rollup 상황 loplat UI는 tree shaking을 지원하기 위해 cjs format을 버리고 esm format의 빌드 결과를 채택했었다.(번들링 최적화를 통해 import cost 줄이기(1)) 때문에 es6 문법을 기본적으로 이해하지 못하는 환경(Jest test, Next/SSR build)에서는 라이브러리를 es5 문법으로 transpile해야하는 번거로움이 있다. (Next.js는 'next-transpile-modules' https://www.npmjs.com/package/next-transpile-modules를 사용해야하고.. 더보기

반응형