์ต์ ํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ์ํ ๊ณ ๊ธ JavaScript ๋ชจ๋ ๋ก๋ฉ ๊ธฐ์ ์ ํ์ํฉ๋๋ค. ์บ์ ์๋ฐ๊ณผ ์ ์ ์ ๋ชจ๋ ๋ก๋ฉ์ผ๋ก ์ง์ฐ ์๊ฐ์ ์ค์ด๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ์ธ์.
JavaScript ๋ชจ๋ ๋ก๋ฉ ์บ์ ์๋ฐ: ์ ์ ์ ๋ชจ๋ ๋ก๋ฉ ์ ๋ต
ํ๋ ์น ๊ฐ๋ฐ ์ธ๊ณ์์ JavaScript๋ ๋์ ์ด๊ณ ์ํธ์์ฉ์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ง๋๋ ๋ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ณต์กํด์ง์๋ก JavaScript ๋ชจ๋์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ๋ก๋ฉํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ค์ํด์ง๋๋ค. ๋ชจ๋ ๋ก๋ฉ์ ์ต์ ํํ๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฒ ์ค ํ๋๋ ์บ์ ์๋ฐ์ด๋ฉฐ, ์บ์ ์๋ฐ ๋ด์ ํน์ ์ ๋ต์ ์ ์ ์ ๋ชจ๋ ๋ก๋ฉ์ ๋๋ค. ์ด ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์์๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํ ์ ์ ์ ๋ชจ๋ ๋ก๋ฉ์ ๊ฐ๋ , ์ด์ ๋ฐ ์ค์ ๊ตฌํ์ ๋ํด ์์ธํ ์์๋ด ๋๋ค.
JavaScript ๋ชจ๋ ๋ก๋ฉ ์ดํดํ๊ธฐ
์ ์ ์ ๋ก๋ฉ์ ๋ค์ด๊ฐ๊ธฐ ์ ์ JavaScript ๋ชจ๋ ๋ก๋ฉ์ ๊ธฐ๋ณธ ์ฌํญ์ ์ดํดํ๋ ๊ฒ์ด ํ์์ ์ ๋๋ค. ๋ชจ๋์ ์ฌ์ฉํ๋ฉด ๊ฐ๋ฐ์๋ ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๊ณ ์ ์ง๋ณด์ ๊ฐ๋ฅํ ๋จ์๋ก ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ธ ๋ชจ๋ ํ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- CommonJS: ์ฃผ๋ก Node.js ํ๊ฒฝ์์ ์ฌ์ฉ๋ฉ๋๋ค.
- AMD (๋น๋๊ธฐ ๋ชจ๋ ์ ์): ๋ธ๋ผ์ฐ์ ์์ ๋น๋๊ธฐ ๋ก๋ฉ์ ์ํด ์ค๊ณ๋์์ต๋๋ค.
- ES ๋ชจ๋ (ECMAScript ๋ชจ๋): ์ต์ ๋ธ๋ผ์ฐ์ ์์ ๋ค์ดํฐ๋ธ๋ก ์ง์๋๋ ํ์คํ๋ ๋ชจ๋ ํ์์ ๋๋ค.
- UMD (๋ฒ์ฉ ๋ชจ๋ ์ ์): ๋ชจ๋ ํ๊ฒฝ(๋ธ๋ผ์ฐ์ ๋ฐ Node.js)์์ ์๋ํ๋ ๋ชจ๋์ ๋ง๋ค๊ธฐ ์ํ ์๋์ ๋๋ค.
ES ๋ชจ๋์ ์ต์ ์น ๊ฐ๋ฐ์์ Webpack, Parcel, Rollup๊ณผ ๊ฐ์ ๋น๋ ๋๊ตฌ์์ ํตํฉ ๋ฐ ๋ค์ดํฐ๋ธ ๋ธ๋ผ์ฐ์ ์ง์์ผ๋ก ์ธํด ์ ํธ๋๋ ํ์์ ๋๋ค.
๊ณผ์ : ๋ชจ๋ ๋ก๋ฉ ์ง์ฐ ์๊ฐ
JavaScript ๋ชจ๋, ํนํ ํฌ๊ฑฐ๋ ๋ง์ ์ข ์์ฑ์ ๊ฐ์ง ๋ชจ๋์ ๋ก๋ฉํ๋ฉด ์ง์ฐ ์๊ฐ์ด ๋ฐ์ํ์ฌ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด๊ฐ ์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์์ต๋๋ค. ์ด ์ง์ฐ ์๊ฐ์ ๋ค์ํ ๋ฐฉ์์ผ๋ก ๋ํ๋ ์ ์์ต๋๋ค.
- ์ฒซ ๋ฒ์งธ ์ฝํ ์ธ ํ ํ์ธํธ (FCP) ์ง์ฐ: ๋ธ๋ผ์ฐ์ ๊ฐ DOM์์ ์ฒซ ๋ฒ์งธ ์ฝํ ์ธ ๋ฅผ ๋ ๋๋งํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๋๋ค.
- ์ํธ์์ฉ ๊ฐ๋ฅ ์๊ฐ (TTI) ์ง์ฐ: ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์ ํ ์ํธ์์ฉ ๊ฐ๋ฅํ๊ณ ์ฌ์ฉ์ ์ ๋ ฅ์ ๋ฐ์ํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๋๋ค.
- ์ฌ์ฉ์ ๊ฒฝํ ์ ํ: ๋๋ฆฐ ๋ก๋ฉ ์๊ฐ์ ์ข์ ๊ฐ๊ณผ ์ดํ์ ์ ๋ฐํ ์ ์์ต๋๋ค.
๋ชจ๋ ๋ก๋ฉ ์ง์ฐ ์๊ฐ์ ๊ธฐ์ฌํ๋ ์์ธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋คํธ์ํฌ ์ง์ฐ: ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ์์ ๋ชจ๋์ ๋ค์ด๋ก๋ํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๋๋ค.
- ํ์ฑ ๋ฐ ์ปดํ์ผ: ๋ธ๋ผ์ฐ์ ๊ฐ JavaScript ์ฝ๋๋ฅผ ํ์ฑํ๊ณ ์ปดํ์ผํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๋๋ค.
- ์ข ์์ฑ ํด๊ฒฐ: ๋ชจ๋ ๋ก๋๊ฐ ๋ชจ๋ ๋ชจ๋ ์ข ์์ฑ์ ํด๊ฒฐํ๊ณ ๋ก๋ํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๋๋ค.
์บ์ ์๋ฐ ์๊ฐ
์บ์ ์๋ฐ์ ์ค์ ๋ก ํ์ํ๊ธฐ ์ ์ ๋ฆฌ์์ค(JavaScript ๋ชจ๋ ํฌํจ)๋ฅผ ์ ์ ์ ์ผ๋ก ๋ก๋ํ๊ณ ์บ์ฑํ๋ ๊ธฐ๋ฒ์ ๋๋ค. ๋ชฉํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ด๋ฌํ ๋ฆฌ์์ค๋ฅผ ํ์๋ก ํ ๋ ๋ธ๋ผ์ฐ์ ์บ์์์ ์ฆ์ ์ฌ์ฉ ๊ฐ๋ฅํ๋๋ก ํ์ฌ ์ง์ฐ ์๊ฐ์ ์ค์ด๋ ๊ฒ์ ๋๋ค.
๋ธ๋ผ์ฐ์ ์บ์๋ ์๋ฒ์์ ๋ค์ด๋ก๋ํ ๋ฆฌ์์ค(HTML, CSS, JavaScript, ์ด๋ฏธ์ง ๋ฑ)๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ ๋ฆฌ์์ค๊ฐ ํ์ํ๋ฉด ๋จผ์ ์บ์๋ฅผ ํ์ธํฉ๋๋ค. ๋ฆฌ์์ค๊ฐ ์บ์์์ ๋ฐ๊ฒฌ๋๋ฉด ์๋ฒ์์ ๋ค์ ๋ค์ด๋ก๋ํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋น ๋ฅด๊ฒ ๊ฒ์ํ ์ ์์ต๋๋ค. ์ด๋ ๋ก๋ฉ ์๊ฐ์ ํฌ๊ฒ ์ค์ด๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํต๋๋ค.
์บ์ ์๋ฐ์๋ ์ฌ๋ฌ ๊ฐ์ง ์ ๋ต์ด ์์ต๋๋ค. ๋ค์์ ํฌํจํฉ๋๋ค.
- ์กฐ๊ธฐ ๋ก๋ฉ: ์ฆ์ ํ์ํ์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด ๋ชจ๋ ๋ชจ๋์ ๋ฏธ๋ฆฌ ๋ก๋ํฉ๋๋ค. ์ด๋ ์๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์๋ ์ ์ตํ ์ ์์ง๋ง ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ ์ด๊ธฐ ๋ก๋ฉ ์๊ฐ์ด ๊ณผ๋ํ๊ฒ ๊ธธ์ด์ง ์ ์์ต๋๋ค.
- ์ง์ฐ ๋ก๋ฉ: ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ์ ์ํธ ์์ฉ์ ๋ํ ์๋ต์ผ๋ก ๋๋ ํน์ ๊ตฌ์ฑ ์์๊ฐ ๋ ๋๋ง๋ ๋ ๋ชจ๋์ด ํ์ํ ๋๋ง ๋ก๋ํฉ๋๋ค. ์ด๋ ์ด๊ธฐ ๋ก๋ฉ ์๊ฐ์ ๊ฐ์ ํ ์ ์์ง๋ง ์จ๋๋งจ๋๋ก ๋ชจ๋์ ๋ก๋ํ ๋ ์ง์ฐ ์๊ฐ์ ๋์ ํ ์ ์์ต๋๋ค.
- ์ ์ ์ ๋ก๋ฉ: ์กฐ๊ธฐ ๋ก๋ฉ๊ณผ ์ง์ฐ ๋ก๋ฉ์ ์ด์ ์ ๊ฒฐํฉํ ํ์ด๋ธ๋ฆฌ๋ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค. ๋น์ฅ์ ์๋๋๋ผ๋ ๊ฐ๊น์ด ๋ฏธ๋์ ํ์ํ ๊ฐ๋ฅ์ฑ์ด ์๋ ๋ชจ๋์ ๋ก๋ํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค.
์ ์ ์ ๋ชจ๋ ๋ก๋ฉ: ์ฌ์ธต ๋ถ์
์ ์ ์ ๋ชจ๋ ๋ก๋ฉ์ ๊ณง ํ์ํ๊ฒ ๋ ๋ชจ๋์ ์์ธกํ์ฌ ๋ฏธ๋ฆฌ ๋ธ๋ผ์ฐ์ ์บ์์ ๋ก๋ํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ ์ ๋ต์ ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์กฐ๊ธฐ ๋ก๋ฉ(๋ชจ๋ ๊ฒ์ ๋ฏธ๋ฆฌ ๋ก๋)๊ณผ ์ง์ฐ ๋ก๋ฉ(ํ์ํ ๋๋ง ๋ก๋) ์ฌ์ด์ ๊ท ํ์ ๋ง์ถ๋ ค๊ณ ํฉ๋๋ค. ์ฌ์ฉ๋ ๊ฐ๋ฅ์ฑ์ด ์๋ ๋ชจ๋์ ์ ๋ต์ ์ผ๋ก ๋ก๋ํจ์ผ๋ก์จ ์ ์ ์ ๋ก๋ฉ์ ์ด๊ธฐ ๋ก๋ฉ ํ๋ก์ธ์ค๋ฅผ ์๋ํ์ง ์๊ณ ์ง์ฐ ์๊ฐ์ ํฌ๊ฒ ์ค์ผ ์ ์์ต๋๋ค.
์ ์ ์ ๋ก๋ฉ์ด ์๋ํ๋ ๋ฐฉ์์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ ์ฌ์ ๋ชจ๋ ์๋ณ: ์ฒซ ๋ฒ์งธ ๋จ๊ณ๋ ๊ฐ๊น์ด ๋ฏธ๋์ ํ์ํ ๊ฐ๋ฅ์ฑ์ด ์๋ ๋ชจ๋์ ์๋ณํ๋ ๊ฒ์ ๋๋ค. ์ด๋ ์ฌ์ฉ์ ๋์, ์ ํ๋ฆฌ์ผ์ด์ ์ํ ๋๋ ์์ธก๋ ํ์ ํจํด๊ณผ ๊ฐ์ ๋ค์ํ ์์ธ์ ๊ธฐ๋ฐ์ผ๋ก ํ ์ ์์ต๋๋ค.
- ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ชจ๋ ๋ก๋: ์ ์ฌ์ ๋ชจ๋์ด ์๋ณ๋๋ฉด ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ง ์๊ณ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ธ๋ผ์ฐ์ ์บ์์ ๋ก๋๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ต์ฑ๊ณผ ์ํธ ์์ฉ์ฑ์ ์ ์งํฉ๋๋ค.
- ์บ์๋ ๋ชจ๋ ์ฌ์ฉ: ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฌ์ ์ ๋ก๋๋ ๋ชจ๋ ์ค ํ๋๋ฅผ ํ์๋ก ํ ๋ ์บ์์์ ์ง์ ๊ฒ์ํ ์ ์์ด ํจ์ฌ ๋ ๋น ๋ฅธ ๋ก๋ฉ ์๊ฐ์ ์ป์ ์ ์์ต๋๋ค.
์ ์ ์ ๋ชจ๋ ๋ก๋ฉ์ ์ด์
์ ์ ์ ๋ชจ๋ ๋ก๋ฉ์ ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ์ฃผ์ ์ด์ ์ ์ ๊ณตํฉ๋๋ค.
- ์ง์ฐ ์๊ฐ ๊ฐ์: ๋ชจ๋์ ๋ฏธ๋ฆฌ ์บ์์ ๋ก๋ํจ์ผ๋ก์จ ์ ์ ์ ๋ก๋ฉ์ ์ค์ ๋ก ํ์ํ ๋ ๋ชจ๋์ ๋ก๋ํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ํฌ๊ฒ ์ค์ ๋๋ค.
- ํฅ์๋ ์ฌ์ฉ์ ๊ฒฝํ: ๋ ๋น ๋ฅธ ๋ก๋ฉ ์๊ฐ์ ๋ ๋ถ๋๋ฝ๊ณ ๋ฐ์์ฑ์ด ๋ฐ์ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ผ๋ก ์ด์ด์ง๋๋ค.
- ์ต์ ํ๋ ์ด๊ธฐ ๋ก๋ฉ ์๊ฐ: ์กฐ๊ธฐ ๋ก๋ฉ๊ณผ ๋ฌ๋ฆฌ ์ ์ ์ ๋ก๋ฉ์ ๋ชจ๋ ๋ชจ๋์ ๋ฏธ๋ฆฌ ๋ก๋ํ๋ ๊ฒ์ ํผํ๋ฏ๋ก ์ด๊ธฐ ๋ก๋ฉ ์๊ฐ์ด ๋ ๋น ๋ฆ ๋๋ค.
- ํฅ์๋ ์ฑ๋ฅ ์งํ: ์ ์ ์ ๋ก๋ฉ์ FCP ๋ฐ TTI์ ๊ฐ์ ์ฃผ์ ์ฑ๋ฅ ์งํ๋ฅผ ๊ฐ์ ํ ์ ์์ต๋๋ค.
์ ์ ์ ๋ชจ๋ ๋ก๋ฉ์ ์ค์ ๊ตฌํ
์ ์ ์ ๋ชจ๋ ๋ก๋ฉ์ ๊ตฌํํ๋ ค๋ฉด ์ฌ๋ฌ ๊ธฐ๋ฒ๊ณผ ๋๊ตฌ๋ฅผ ์กฐํฉํด์ผ ํฉ๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค.
1. `<link rel="preload">` ์ฌ์ฉ
`` ์์๋ ๋ธ๋ผ์ฐ์ ์๊ฒ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ฆฌ์์ค๋ฅผ ๋ค์ด๋ก๋ํ๋๋ก ์ง์ํ์ฌ ๋์ค์ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ ์ ์ธ์ ๋ฐฉ๋ฒ์ ๋๋ค. ์ด๋ JavaScript ๋ชจ๋์ ์ ์ ์ ์ผ๋ก ๋ก๋ํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
์:
```html <head> <link rel="preload" href="/modules/my-module.js" as="script"> </head> ```
์ด ์ฝ๋๋ ๋ธ๋ผ์ฐ์ ์๊ฒ `my-module.js`๋ฅผ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ค์ด๋ก๋ํ๋๋ก ์ง์ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ด ํ์ํ ๋ ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค. `as="script"` ์์ฑ์ ๋ฆฌ์์ค๊ฐ JavaScript ํ์ผ์์ ์ง์ ํฉ๋๋ค.
2. Intersection Observer๋ฅผ ์ฌ์ฉํ ๋์ ๊ฐ์ ธ์ค๊ธฐ
๋์ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ฌ์ฉํ๋ฉด ํ์์ ๋ฐ๋ผ ๋ชจ๋์ ๋น๋๊ธฐ์ ์ผ๋ก ๋ก๋ํ ์ ์์ต๋๋ค. ๋์ ๊ฐ์ ธ์ค๊ธฐ์ Intersection Observer API๋ฅผ ๊ฒฐํฉํ๋ฉด ๋ชจ๋์ด ๋ทฐํฌํธ์ ๋ณด์ผ ๋ ๋ก๋ํ์ฌ ํจ๊ณผ์ ์ผ๋ก ๋ก๋ฉ ํ๋ก์ธ์ค๋ฅผ ์ ์ ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
์:
```javascript const observer = new IntersectionObserver(entries => { entries.forEach(entry => { if (entry.isIntersecting) { import('./my-module.js') .then(module => { // ๋ชจ๋ ์ฌ์ฉ }) .catch(error => { console.error('๋ชจ๋ ๋ก๋ฉ ์ค๋ฅ:', error); }); observer.unobserve(entry.target); } }); }); const element = document.querySelector('#my-element'); observer.observe(element); ```
์ด ์ฝ๋๋ `my-element` ID๋ฅผ ๊ฐ์ง ์์์ ๊ฐ์์ฑ์ ๋ชจ๋ํฐ๋งํ๋ Intersection Observer๋ฅผ ์์ฑํฉ๋๋ค. ์์๊ฐ ๋ทฐํฌํธ์ ๋ณด์ด๋ฉด `import('./my-module.js')` ๋ฌธ์ด ์คํ๋์ด ๋ชจ๋์ ๋น๋๊ธฐ์ ์ผ๋ก ๋ก๋ํฉ๋๋ค.
3. Webpack์ `prefetch` ๋ฐ `preload` ํํธ
์ธ๊ธฐ ์๋ JavaScript ๋ชจ๋ ๋ฒ๋ค๋ฌ์ธ Webpack์ ๋ชจ๋ ๋ก๋ฉ์ ์ต์ ํํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ `prefetch` ๋ฐ `preload` ํํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ํํธ๋ `` ์์์ ์ ์ฌํ๊ฒ ๋ธ๋ผ์ฐ์ ์ ๋ชจ๋์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ค์ด๋ก๋ํ๋๋ก ์ง์ํฉ๋๋ค.
- `preload`: ๋ธ๋ผ์ฐ์ ์๊ฒ ํ์ฌ ํ์ด์ง์ ํ์ํ ๋ฆฌ์์ค๋ฅผ ๋ค์ด๋ก๋ํ๋๋ก ์ง์ํ๊ณ ๋ค๋ฅธ ๋ฆฌ์์ค๋ณด๋ค ์ฐ์ ์์๋ฅผ ๋ถ์ฌํฉ๋๋ค.
- `prefetch`: ๋ธ๋ผ์ฐ์ ์๊ฒ ํฅํ ํ์ด์ง์ ํ์ํ ๊ฐ๋ฅ์ฑ์ด ์๋ ๋ฆฌ์์ค๋ฅผ ๋ค์ด๋ก๋ํ๋๋ก ์ง์ํ๊ณ ํ์ฌ ํ์ด์ง์ ํ์ํ ๋ฆฌ์์ค๋ณด๋ค ๋ฎ์ ์ฐ์ ์์๋ฅผ ๋ถ์ฌํฉ๋๋ค.
์ด๋ฌํ ํํธ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋งค์ง ์ฃผ์๊ณผ ํจ๊ป Webpack์ ๋์ ๊ฐ์ ธ์ค๊ธฐ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
```javascript import(/* webpackPreload: true */ './my-module.js') .then(module => { // ๋ชจ๋ ์ฌ์ฉ }) .catch(error => { console.error('๋ชจ๋ ๋ก๋ฉ ์ค๋ฅ:', error); }); import(/* webpackPrefetch: true */ './another-module.js') .then(module => { // ๋ชจ๋ ์ฌ์ฉ }) .catch(error => { console.error('๋ชจ๋ ๋ก๋ฉ ์ค๋ฅ:', error); }); ```
Webpack์ HTML ์ถ๋ ฅ์ ์ ์ ํ `` ๋๋ `` ์์๋ฅผ ์๋์ผ๋ก ์ถ๊ฐํฉ๋๋ค.
4. ์๋น์ค ์์ปค
์๋น์ค ์์ปค๋ ๋ฉ์ธ ๋ธ๋ผ์ฐ์ ์ค๋ ๋์ ๋ณ๋๋ก ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํ๋๋ JavaScript ํ์ผ์ ๋๋ค. ๋คํธ์ํฌ ์์ฒญ์ ๊ฐ๋ก์ฑ๊ณ ์ฌ์ฉ์๊ฐ ์คํ๋ผ์ธ์ผ ๋๋ ์บ์์์ ๋ฆฌ์์ค๋ฅผ ์ ๊ณตํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋น์ค ์์ปค๋ ์ ์ ์ ๋ชจ๋ ๋ก๋ฉ์ ํฌํจํ ๊ณ ๊ธ ์บ์ ์๋ฐ ์ ๋ต์ ๊ตฌํํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ (๋จ์ํ๋จ):
```javascript // service-worker.js const cacheName = 'my-app-cache-v1'; const filesToCache = [ '/modules/my-module.js', '/modules/another-module.js', ]; self.addEventListener('install', event => { event.waitUntil( caches.open(cacheName) .then(cache => { return cache.addAll(filesToCache); }) ); }); self.addEventListener('fetch', event => { event.respondWith( caches.match(event.request) .then(response => { return response || fetch(event.request); }) ); }); ```
์ด ์ฝ๋๋ ์ค์น ๋จ๊ณ ์ค์ ์ง์ ๋ JavaScript ๋ชจ๋์ ์บ์ฑํ๋ ์๋น์ค ์์ปค๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ ์ด๋ฌํ ๋ชจ๋์ ์์ฒญํ๋ฉด ์๋น์ค ์์ปค๊ฐ ์์ฒญ์ ๊ฐ๋ก์ฑ๊ณ ์บ์์์ ๋ชจ๋์ ์ ๊ณตํฉ๋๋ค.
์ ์ ์ ๋ชจ๋ ๋ก๋ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
์ ์ ์ ๋ชจ๋ ๋ก๋ฉ์ ํจ๊ณผ์ ์ผ๋ก ๊ตฌํํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
- ์ฌ์ฉ์ ํ๋ ๋ถ์: ๋ถ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ์ํธ ์์ฉํ๋ ๋ฐฉ์์ ์ดํดํ๊ณ ๊ฐ๊น์ด ๋ฏธ๋์ ๊ฐ์ฅ ํ์ํ ๊ฐ๋ฅ์ฑ์ด ์๋ ๋ชจ๋์ ์๋ณํฉ๋๋ค. Google Analytics, Mixpanel ๋๋ ์ฌ์ฉ์ ์ง์ ์ด๋ฒคํธ ์ถ์ ๊ณผ ๊ฐ์ ๋๊ตฌ๋ ๊ท์คํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
- ์ค์ ๋ชจ๋ ์ฐ์ ์์ ์ง์ : ์ ํ๋ฆฌ์ผ์ด์ ์ ํต์ฌ ๊ธฐ๋ฅ์ ํ์์ ์ด๊ฑฐ๋ ์ฌ์ฉ์๊ฐ ์์ฃผ ์ฌ์ฉํ๋ ๋ชจ๋์ ์ ์ ์ ์ผ๋ก ๋ก๋ํ๋ ๋ฐ ์ง์คํฉ๋๋ค.
- ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง: ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ FCP, TTI ๋ฐ ์ ์ฒด ๋ก๋ฉ ์๊ฐ๊ณผ ๊ฐ์ ์ฃผ์ ์ฑ๋ฅ ์งํ์ ๋ํ ์ ์ ์ ๋ก๋ฉ์ ์ํฅ์ ์ถ์ ํฉ๋๋ค. Google PageSpeed Insights ๋ฐ WebPageTest๋ ์ฑ๋ฅ ๋ถ์์ ํ๋ฅญํ ๋ฆฌ์์ค์ ๋๋ค.
- ๋ก๋ฉ ์ ๋ต ๊ท ํ ์กฐ์ : ์ฝ๋ ๋ถํ , ํธ๋ฆฌ ์์ดํน ๋ฐ ์ถ์์ ๊ฐ์ ๋ค๋ฅธ ์ต์ ํ ๊ธฐ๋ฒ๊ณผ ์ ์ ์ ๋ก๋ฉ์ ๊ฒฐํฉํ์ฌ ๊ฐ๋ฅํ ์ต๊ณ ์ ์ฑ๋ฅ์ ๋ฌ์ฑํฉ๋๋ค.
- ๋ค์ํ ์ฅ์น ๋ฐ ๋คํธ์ํฌ์์ ํ ์คํธ: ์ ์ ์ ๋ก๋ฉ ์ ๋ต์ด ๋ค์ํ ์ฅ์น ๋ฐ ๋คํธ์ํฌ ์กฐ๊ฑด์์ ํจ๊ณผ์ ์ผ๋ก ์๋ํ๋์ง ํ์ธํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ํ ๋คํธ์ํฌ ์๋์ ์ฅ์น ๊ธฐ๋ฅ์ ์๋ฎฌ๋ ์ด์ ํฉ๋๋ค.
- ์ง์ญํ ๊ณ ๋ ค: ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฌ๋ฌ ์ธ์ด ๋๋ ์ง์ญ์ ์ง์ํ๋ ๊ฒฝ์ฐ ๊ฐ ๋ก์ผ์ผ์ ์ ํฉํ ๋ชจ๋์ ์ ์ ์ ์ผ๋ก ๋ก๋ํ๊ณ ์๋์ง ํ์ธํฉ๋๋ค.
์ ์ฌ์ ๋จ์ ๋ฐ ๊ณ ๋ ค ์ฌํญ
์ ์ ์ ๋ชจ๋ ๋ก๋ฉ์ ์๋นํ ์ด์ ์ ์ ๊ณตํ์ง๋ง ์ ์ฌ์ ์ธ ๋จ์ ์ ์ธ์งํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ์ด๊ธฐ ํ์ด๋ก๋ ํฌ๊ธฐ ์ฆ๊ฐ: ๋ชจ๋์ ์ ์ ์ ์ผ๋ก ๋ก๋ํ๋ฉด ์ด๊ธฐ ํ์ด๋ก๋ ํฌ๊ธฐ๊ฐ ์ฆ๊ฐํ ์ ์์ผ๋ฉฐ, ์ ์คํ๊ฒ ๊ด๋ฆฌํ์ง ์์ผ๋ฉด ์ด๊ธฐ ๋ก๋ฉ ์๊ฐ์ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค.
- ๋ถํ์ํ ๋ก๋ฉ: ํ์ํ ๋ชจ๋์ ๋ํ ์์ธก์ด ๋ถ์ ํํ๋ฉด ์ฌ์ฉ๋์ง ์๋ ๋ชจ๋์ ๋ก๋ํ๊ฒ ๋์ด ๋์ญํญ๊ณผ ๋ฆฌ์์ค๊ฐ ๋ญ๋น๋ ์ ์์ต๋๋ค.
- ์บ์ ๋ฌดํจํ ๋ฌธ์ : ๋ชจ๋์ด ์ ๋ฐ์ดํธ๋ ๋ ์บ์๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๋ฌดํจํ๋๋๋ก ํ๋ ๊ฒ์ ์ค๋๋ ์ฝ๋๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ๋ฐฉ์งํ๋ ๋ฐ ์ค์ํฉ๋๋ค.
- ๋ณต์ก์ฑ: ์ ์ ์ ๋ก๋ฉ์ ๊ตฌํํ๋ฉด ๋น๋ ํ๋ก์ธ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋์ ๋ณต์ก์ฑ์ด ์ถ๊ฐ๋ ์ ์์ต๋๋ค.
์ฑ๋ฅ ์ต์ ํ์ ๋ํ ๊ธ๋ก๋ฒ ๊ด์
์น ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ์ต์ ํํ ๋ ๊ธ๋ก๋ฒ ๋งฅ๋ฝ์ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ ์ธ๊ณ์ ์ฌ์ฉ์๋ ๋ค์ํ ๋คํธ์ํฌ ์กฐ๊ฑด๊ณผ ์ฅ์น ๊ธฐ๋ฅ์ ๊ฒฝํํ ์ ์์ต๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ๊ธ๋ก๋ฒ ๊ณ ๋ ค ์ฌํญ์ ๋๋ค.
- ๋คํธ์ํฌ ์ง์ฐ: ๋คํธ์ํฌ ์ง์ฐ์ ์ฌ์ฉ์์ ์์น์ ๋คํธ์ํฌ ์ธํ๋ผ์ ๋ฐ๋ผ ํฌ๊ฒ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค. ์์ฒญ ์๋ฅผ ์ค์ด๊ณ ํ์ด๋ก๋ ํฌ๊ธฐ๋ฅผ ์ต์ํํ์ฌ ๊ณ ์ง์ฐ ์๊ฐ ๋คํธ์ํฌ๋ฅผ ์ํด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ต์ ํํฉ๋๋ค.
- ์ฅ์น ๊ธฐ๋ฅ: ๊ฐ๋ฐ๋์๊ตญ์ ์ฌ์ฉ์๋ ๊ตฌํ ๋๋ ์ฑ๋ฅ์ด ๋ฎ์ ์ฅ์น๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. JavaScript ์ฝ๋ ์์ ์ค์ด๊ณ ๋ฆฌ์์ค ์๋น๋ฅผ ์ต์ํํ์ฌ ์ ๊ฐํ ์ฅ์น์ ๋ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ต์ ํํฉ๋๋ค.
- ๋ฐ์ดํฐ ๋น์ฉ: ์ผ๋ถ ์ง์ญ์ ์ฌ์ฉ์์๊ฒ๋ ๋ฐ์ดํฐ ๋น์ฉ์ด ์ค์ํ ์์๊ฐ ๋ ์ ์์ต๋๋ค. ์ด๋ฏธ์ง๋ฅผ ์์ถํ๊ณ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ํ์์ ์ฌ์ฉํ๋ฉฐ ๋ฆฌ์์ค๋ฅผ ์ ๊ทน์ ์ผ๋ก ์บ์ฑํ์ฌ ๋ฐ์ดํฐ ์ฌ์ฉ๋์ ์ต์ํํ๋๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ์ต์ ํํฉ๋๋ค.
- ๋ฌธํ์ ์ฐจ์ด: ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค๊ณํ๊ณ ๊ฐ๋ฐํ ๋ ๋ฌธํ์ ์ฐจ์ด๋ฅผ ๊ณ ๋ คํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ค์ํ ์ธ์ด ๋ฐ ์ง์ญ์ ๋ง๊ฒ ์ง์ญํ๋๊ณ ํ์ง ๋ฌธํ ๊ท๋ฒ ๋ฐ ๊ด๋ก๋ฅผ ์ค์ํ๋์ง ํ์ธํฉ๋๋ค.
์: ๋ถ๋ฏธ์ ๋๋จ์์์์ ์ฌ์ฉ์๋ฅผ ๋์์ผ๋ก ํ๋ ์์ ๋ฏธ๋์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋จ์์์ ์ฌ์ฉ์๊ฐ ๋ถ๋ฏธ์ ๋น ๋ฅธ ๊ด๋์ญ ์ฐ๊ฒฐ ์ฌ์ฉ์๋ณด๋ค ๋ฎ์ ๋์ญํญ์ผ๋ก ๋ชจ๋ฐ์ผ ๋ฐ์ดํฐ์ ๋ ๋ง์ด ์์กดํ ์ ์๋ค๋ ์ ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ์ ์ ์ ๋ก๋ฉ ์ ๋ต์ ๋จผ์ ๋ ์์ ํต์ฌ ๋ชจ๋์ ์บ์ฑํ๊ณ ๋ ์ค์ํ ๋ชจ๋์ ์ง์ฐ์์ผ ์ด๊ธฐ ๋ก๋ฉ ์ค์ ๋๋ฌด ๋ง์ ๋์ญํญ์ ์๋นํ์ง ์๋๋ก, ํนํ ๋ชจ๋ฐ์ผ ๋คํธ์ํฌ์์ ์กฐ์ ๋ ์ ์์ต๋๋ค.
์คํ ๊ฐ๋ฅํ ํต์ฐฐ๋ ฅ
์ ์ ์ ๋ชจ๋ ๋ก๋ฉ์ ์์ํ๋ ๋ฐ ๋์์ด ๋๋ ๋ช ๊ฐ์ง ์คํ ๊ฐ๋ฅํ ํต์ฐฐ๋ ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋ถ์์ผ๋ก ์์: ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉ ํจํด์ ๋ถ์ํ์ฌ ์ ์ ์ ๋ก๋ฉ์ ์ ์ฌ์ ํ๋ณด๋ฅผ ์๋ณํฉ๋๋ค.
- ํ์ผ๋ฟ ํ๋ก๊ทธ๋จ ๊ตฌํ: ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ ๋ถ๋ถ์ ์ ์ ์ ๋ก๋ฉ์ ๊ตฌํํ๋ ๊ฒ๋ถํฐ ์์ํ๊ณ ์ฑ๋ฅ์ ๋ฏธ์น๋ ์ํฅ์ ๋ชจ๋ํฐ๋งํฉ๋๋ค.
- ๋ฐ๋ณต ๋ฐ ๊ฐ์ : ์ฑ๋ฅ ๋ฐ์ดํฐ ๋ฐ ์ฌ์ฉ์ ํผ๋๋ฐฑ์ ๊ธฐ๋ฐ์ผ๋ก ์ ์ ์ ๋ก๋ฉ ์ ๋ต์ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๊ณ ๊ฐ์ ํฉ๋๋ค.
- ๋น๋ ๋๊ตฌ ํ์ฉ: Webpack๊ณผ ๊ฐ์ ๋น๋ ๋๊ตฌ๋ฅผ ํ์ฉํ์ฌ `preload` ๋ฐ `prefetch` ํํธ ์ถ๊ฐ ํ๋ก์ธ์ค๋ฅผ ์๋ํํฉ๋๋ค.
๊ฒฐ๋ก
์ ์ ์ ๋ชจ๋ ๋ก๋ฉ์ JavaScript ๋ชจ๋ ๋ก๋ฉ์ ์ต์ ํํ๊ณ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ํฅ์์ํค๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฒ์ ๋๋ค. ๋ชจ๋์ ๋ฏธ๋ฆฌ ๋ธ๋ผ์ฐ์ ์บ์์ ์ ๋ต์ ์ผ๋ก ๋ก๋ํจ์ผ๋ก์จ ์ง์ฐ ์๊ฐ์ ํฌ๊ฒ ์ค์ด๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํค๋ฉฐ ์ฃผ์ ์ฑ๋ฅ ์งํ๋ฅผ ๊ฐ์ ํ ์ ์์ต๋๋ค. ์ ์ฌ์ ์ธ ๋จ์ ์ ๊ณ ๋ คํ๊ณ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ตฌํํ๋ ๊ฒ์ด ์ค์ํ์ง๋ง, ์ ์ ์ ๋ก๋ฉ์ ์ด์ ์ ํนํ ๋ณต์กํ๊ณ ๋์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ ์๋นํ ์ ์์ต๋๋ค. ๊ธ๋ก๋ฒ ๊ด์ ์ ์์ฉํ๊ณ ์ ์ธ๊ณ ์ฌ์ฉ์์ ๋ค์ํ ์๊ตฌ๋ฅผ ๊ณ ๋ คํจ์ผ๋ก์จ ๋ชจ๋ ์ฌ๋์ด ๋น ๋ฅด๊ณ ๋ฐ์์ฑ์ด ๋ฐ์ด๋๊ณ ์ก์ธ์ค ๊ฐ๋ฅํ ์น ๊ฒฝํ์ ๋ง๋ค ์ ์์ต๋๋ค.