들어가기 전에 앞서 prefetch 와 preload 의 차이에 대해 알아보자.
💡 prefetch vs preload차이점
번들 필요한 시점 | 부모 청크와의 관계 | 다운로드 시점 | |
---|---|---|---|
prefetch | 미래의 언젠가 | 부모 청크가 다 로딩된 이후에 로딩 시작 | 브라우저가 idle 상태일 때 |
preload | 현재 위치 | 부모 청크와 병렬로 불러와짐 | 요청 즉시 |
Preload (
<link rel="preload">
) is a browser optimization that allows critical resources (that may be discovered late) to be requested earlier.
브라우저 최적화 과정 중 하나로, 중요한 리소스를 빠르게 요청하는 방법이다.
<link rel="preload">
<script defer>
javascript 불러올 때 사용
const EmojiPicker = import(/* webpackPreload: true */ "./EmojiPicker");
preload 하는 파일 때문에 초기 로딩 속도(FCP)가 증가하게 된다. 따라서 initial loading 이후 1초 이내에 보여야 하는 번들에 대해서만 preload 를 사용해야 한다.
Prefetch (
<link rel="prefetch">
) is a browser optimization which allows us to fetch resources that may be needed for subsequent routes or pages before they are needed.
브라우저 최적화 과정 중 하나로, 다른 경로나 페이지에 필요한 리소스를 필요한 시점 이전에 fetch 하는 것
HTML
<link rel="prefetch" href="/pages/next-page.html" />
<link rel="prefetch" href="/js/emoji-picker.js" />
HTTP Header
Link: </js/chat-widget.js>; rel=prefetch
Service Worker
Webpack 과 같은 도구들
const EmojiPicker = import(/* webpackPrefetch: true */ "./EmojiPicker");
webpackPrefetch 를 이용해서 필요한 번들을 prefetch 시킬 수 있다. https://webpack.js.org/api/module-methods/#magic-comments https://webpack.js.org/guides/code-splitting/#prefetchingpreloading-modules필요한 시점에 fetch 하는 것이 아니라 미리 cache 에 저장해놓고 불러오기 때문에 chunk 를 훨씬 빠르게 보여줄 수 있다.
꼭 필요하지 않은 모듈에 prefetch 를 적용하는 경우 불필요하게 리소스를 로드하게 되어 불필요한 메모리를 사용하고 앱을 느리게 할 수 있다.
vite 에서는 내부적으로 direct import 하는 청크(번들)에 대해 알아서 preload 를 하도록 기능을 제공해주고 있다.
다만, dynamic import 하는 파일을 preload 하는 방법은 공식문서에 나와있지 않다.
안 써봤지만, preload 를 제공해주는 rollup 플러그인이 있긴 하다.
preload 와 마찬가지로 공식적으로는 지원하지 않는 거 같다. (공식 문서에서 해당 기능을 찾을 수 없다..)
아래와 같은 플러그인이 존재하기는 한다..
https://github.com/vikerman/rollup-plugin-hoist-import-deps
https://github.com/songzhj/vite-plugin-prefetch-module?tab=readme-ov-file
webpack 에서는 magic-comment 라는 이름으로 손쉽게 preload, prefetch 기능을 사용할 수 있는 반면에 vite 는 번들에 대한 섬세한 설정을 하려면 추가 설정을 많이 해주어야 해서 좀 아쉽다고 느꼈다.
https://www.patterns.dev/vanilla/preload
https://www.patterns.dev/vanilla/prefetch