저번엔 MSA 적용하는 내용을 다루었다.
이번엔 프로젝트 최적화와 리팩토링에 관련된 내용을 다룬다
번들링 도구를 webpack에서 vite로 변경하였다.
구글프로젝트인 squoosh로 이미지 최적화. 퍼센테이지에따라 완급조절
3.이미지중 svg로 대체가능한부분 svg로 대체
require방식으로 모듈을 사용한내용을 import,export 방식으로 변경
외부 변수를 의존하는 함수들을 가능하면 순수함수로 분리하여 side effect를 유발하지 않는 형식으로 전환 및 Tree-shaking 유도(쉽게 말하면 순수함수로 함수형 프로그래밍)
정말 side effect가 일어날 확률이 없는경우라고 판단되면
package.json에 아래와같이 입력하면 된다.
"sideEffects": [
"./src/components/Input.js"
]
import { function1, function2 } from "someModule"
다만 이때 주의할점?은 모듈이 자체적으로 export방식을 지원안하면 하나마나 tree shaking을 진행하지 않는다.
주의라기보다 확인을 하고 작업을 진행하면된다.
나는 VSC에서 import cost라는 확장기능을 사용하여 위 내용적용시 용량차이가 존재하는 모듈은 전부 변경하여 적용했다.
const TestComp = () => {
const SomeCompoent = () => {
return (
<div>haha<div>
)
}
let title = "hit me"
let comp1 = SomeComponent // 굳이?
return () {
{comp1()}
}
}
등등 기형적인 구조를 가진경우
const SomeCompoent = () => <div>haha<div>
const TestComp = () => {
const title = "hit me"
return () {
{title}
<SomeComponent />
}
}
암튼 이렇게 쓸때없이 result값을 넣어주는 패턴을 버려준다.
컴포넌트의 단위가 지금은 작으니깐 와닿지 않을 수도있지만 용량이 큰 컴포넌트를
조건에 따라 컴포넌트를 표시하는경우 괜히 메모리만 잡아먹는다.
// pattern1
let num=0
for (i=0;i<2;i++){
num += 1
}
// pattern2
let num=0
num += 1
num += 1
num += 1
알고리즘적으론 pattern1이 더 맞는말이겠지만..
성능적으론 pattern2가 더 빠를수 밖에 없다.
이런부분을 찾아서 완급조절을 해주면된다.
빌드파일 용량: 40MB => 4MB
개발시 번들링속도: 4분 => 10 ~ 15초
초기페이지 다운로드 용량: 10MB~40MB => 1.9MB
메인화면 로딩완료 속도: 5~10s => 2~5s(기존로직에서 under fetching을 변경하고 SSR적용 및 캐싱으로 tric을 좀 사용하면 훨씬 빨라질듯 하다.)
쓸때없는 파일 제거랑 이미지최적화가 제일 드라마틱했고
사실 코딩에쓰여진 텍스트를 줄인다고 뭐 얼마나 줄어들겠나 싶다.
모듈 참조방식이 조금 꿀이었고, 대충 여기까지 물리적인 용량 최적화를 적당히 하고
나머지는 성능 최적화를 하는것이 적당하다 싶다.
알고리즘 수정,
fetching이 사이드이펙트로 중복이 되는경우는 없는지,
over fetching과 under fetching이 일어나는구간은 없는지,
캐싱이 안돼서 매번 새롭게 값을 할당하고있는경우는 없는지
많~은 노오오오오력을하면 성능최적화가 조금씩 조금씩 되고 확률적으로 그중에 분명 크게 얻어걸리는것이 몇개 있다.