본 포스트는 인프런의 프론트엔드 개발자를 위한, 실전 웹 성능 최적화(feat. React) - Part. 1 강의(링크)를 듣고 정리한 내용입니다.
브런치
에서 image CDN을 사용하고 있는 것을 볼 수 있다.<http://cdn.image.com?src=>[img src]&width=200&height=100
/* 파라미터 참고: <https://unsplash.com/documentation#supported-parameters> */
function getParametersForUnsplash({ width, height, quality, format }) {
return `?w=${width}&h=${height}&q=${quality}&fm=${format}&fit=crop`;
}
<img src={props.image + getParametersForUnsplash({width: 1200, height: 1200, quality: 80, format: 'jpg'})} alt="thumbnail" />
getParametersForUnsplash
을 이용해 이미지 사이즈 조절 가능cra
의 경우 빌드시 자동으로 줄여주기 때문에 신경 안써도 된다./*
* 파라미터로 넘어온 문자열에서 일부 특수문자를 제거하는 함수
* (Markdown으로 된 문자열의 특수문자를 제거하기 위함)
*/
function removeSpecialCharacter(str) {
const removeCharacters = ["#", "_", "*", "~", "&", ";", "!", "[", "]", "`", ">", "\\n", "=", "-"];
let _str = str;
let i = 0,
j = 0;
for (i = 0; i < removeCharacters.length; i++) {
j = 0;
while (j < _str.length) {
if (_str[j] === removeCharacters[i]) {
_str = _str.substring(0, j).concat(_str.substring(j + 1));
continue;
}
j++;
}
}
return _str;
}
에서
function removeSpecialCharacter(str) {
let _str = str;
_str = _str.replace(/[\\#\\_\\*\\~\\&\\;\\!\\[\\]\\`\\>\\/n\\=\\-]/g, "");
return _str;
}
function removeSpecialCharacter(str) {
let _str = str.substring(0, 300);
_str = _str.replace(/[\\\\#\\\\_\\\\*\\\\~\\\\&\\\\;\\\\!\\\\[\\\\]\\\\`\\\\>\\\\/n\\\\=\\\\-]/g, "");
return _str;
}
웹상에서의 압축
관련 설정은 ./node_modules/serve/bin/serve.js
에서 설정 되고 있다.
node ./node_modules/serve/bin/serve.js —help
width
값 변경에서 transform: scaleX()
로 변경const BarGraph = styled.div`
width: ${({width}) => width}%;
transition: width 1.5s ease;
`
// tramsform을 사용하여 최적화
const BarGraph = styled.div`
transform: scaleX(${({ width }) => width / 100});
transform-origin: left;
transition: transform 1.5s ease;
`;
function App() {
const [showModal, setShowModal] = useState(false);
const handleMouseEnter = () => {
const Component = import("./components/ImageModal");
};
return (
<div className="App">
<ButtonModal
onClick={() => {
setShowModal(true);
}}
onMouseEnter={handleMouseEnter}
>
올림픽 사진 보기
</ButtonModal>
...
</div>
);
}
만약 로드 해야 하는 파일이 너무 커서 1초 이상 걸릴 경우 다음 방법으로
function App() {
const [showModal, setShowModal] = useState(false);
useEffect(() => {
const Component = import("./components/ImageModal");
}, []);
return (
<div className="App">
<ButtonModal
onClick={() => {
setShowModal(true);
}}
>
올림픽 사진 보기
</ButtonModal>
...
</div>
);
}
만약 여러 컴포넌트를 import해야 한다면 함수를 만들어서 쓰자
function lazywithPreload(importFunction) {
const Component = React.lazy(importFunction);
Component.preload = importFunction;
return Component;
}
const LazyImageModal = lazywithPreload(() => import("./components/ImageModal"));
function App() {
const [showModal, setShowModal] = useState(false);
useEffect(() => {
LazyImageModal.preload();
}, []);
return (
<div className="App">
<ButtonModal
onClick={() => {
setShowModal(true);
}}
>
올림픽 사진 보기
</ButtonModal>
...
</div>
);
}
이미지는 원래 이미지가 노출되는 시점이 아니면 로드 X
자바스크립트의 이미지 Object를 사용하면 미리 로드 가능하다