Nextjs-Optimizing(2) - Package Bundling
๐์์ํ๋ฉฐ
15.2.2 ๊ณต์๋ฌธ์ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ
์์ง ์์ ์ด ์์ ํ ๋๋ ๊ฒ์ ์๋์ง๋ง, ๊ณต์๋ฌธ์๋ฅผ ๋ณด๋ฉด์ ๊พธ์คํ Next.js์ ์ต์ ํ ๊ธฐ๋ฒ์ ๋ํด์ ๊ด์ฌ์ ๊ฐ์ง๊ณ ์๋ค!
ํน์ <Image>
์ปดํฌ๋ํธ๋, <Scripts>
๊ฐ์ ๊ฒฝ์ฐ์๋ ์ง์ ์์ ๋ฅผ ๋ง๋ค์ด ๋ณด๋ฉด์ ํ์ตํ๋ ์ค์ด๋ผ ๋ธ๋ก๊ทธ์ ์ ๋ฆฌํ๋๊ฑด ์กฐ๊ธ ์๊ฐ์ด ๊ฑธ๋ฆด ๊ฒ ๊ฐ์ Package Bundling ๋ถ๋ถ๋ถํฐ ์ดํด๋ณด๊ณ ์ ํ๋ค.
1๏ธโฃAnalyzing JavaScript bundles
@next/bundle-analyzer
๋ ์ ํ๋ฆฌ์ผ์ด์
๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๋๋ฐ ๋์์ ์ฃผ๋ Next.js์ ํ๋ฌ๊ทธ์ธ์ด๋ค. ์ด ํ๋ฌ๊ทธ์ธ์ ํตํด ๊ฐ ํจํค์ง์ ํฌ๊ธฐ์ ์ข
์์ฑ์ ์๊ฐ์ ์ผ๋ก ํ์ธํ ์ ์๊ณ , ์ด ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋์ ๊ฐ์ ์ต์ ํ๋ฅผ ์งํํ ์ ์๋ค.
- ํฐ ์ฌ์ด์ฆ dependencies(์ข ์์ฑ) ์ ๊ฑฐ
- ์ฝ๋ ๋ถํ
- lazy load(์ง์ฐ ๋ก๋)
๐งก์ค์นํ๊ธฐ
1
2
3
4
5
npm i @next/bundle-analyzer
# or
yarn add @next/bundle-analyzer
# or
pnpm add @next/bundle-analyzer
์ค์น๊ฐ ์๋ฃ๋๋ฉด next.config.js
์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๋ค.
1
2
3
4
5
6
7
8
/** @type {import('next').NextConfig} */
const nextConfig = {}
const withBundleAnalyzer = require("@next/bundle-analyzer")({
enabled: process.env.ANALYZE === "true",
})
module.exports = withBundleAnalyzer(nextConfig)
+ ๊ณต์๋ฌธ์์์๋ CommonJS(.cjs)
๋ฐฉ์์ผ๋ก ์์ฑ๋์ด ์์ผ๋, ๋๋ ES Module
๋ฐฉ์์ธ next.config.mjs
๋ฅผ ์ฌ์ฉํ๊ณ ์์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. ๋ฐ๋ผ์ ์๋์ ๊ฐ์ด ์์ฑํด์ฃผ์๋ค.
1
2
3
4
5
6
/** @type {import('next').NextConfig} */
import bundleAnalyzer from "next-bundle-analyzer"
const withBundleAnalyzer = bundleAnalyzer({
enabled: process.env.ANALYZE === "true",
})
โจ์์๋๊ธฐ .cjs โ CommonJS ๋ฐฉ์ (require, module.exports) .mjs โ ES ๋ชจ๋ ๋ฐฉ์ (import, export default)
๐๋ณด๊ณ ์ ์์ฑํ๊ธฐ
1
2
3
4
5
ANALYZE=true npm run build
# or
ANALYZE=true yarn build
# or
ANALYZE=true pnpm build
๋ช ๋ น์ด๋ฅผ ์คํํด์ฃผ๋ฉด, ๋ด๊ฐ ๋ง๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํธ๋ฆฌ๋งต ์ฐจํธ๋ฅผ ํ์ธํ ์ ์๋ค! ํ์ผ ํฌ๊ธฐ์ ๊ตฌ์กฐ๋ฅผ ํ๋์ ํ์ ํ ์ ์์ด, ๋ด๊ฐ ์ด๋ค ํ์ผ์ ์ค์ผ ์ ์๋์ง ํ์ ํ๋๋ฐ ๋์์ ์ค๋ค.๐
2๏ธโฃOptimizing package imports
์์ด์ฝ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฐ์ ์ผ๋ถ ํจํค์ง๋ค์ ์๋ฐฑ ๊ฐ์ ๋ชจ๋์ ๋ด๋ณด๋ผ ์ ์์ด ๊ฐ๋ฐ ํน์ ํ๋ก๋์ ์์ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์๋ค.
์ด๋ฐ ํจํค์ง๋ฅผ import ํ๋ ๋ฐฉ์์ ์ต์ ํ ํ๊ธฐ ์ํด์ optimizePackageImports
์ต์
์ ์ฌ์ฉํ ์ ์๋ค. ์ด ์ต์
์ ์ฌ์ฉํ๋ฉด ์ค์ ๋ก ์ฌ์ฉํ๋ ๋ชจ๋๋ง ๋ก๋ํ๊ฒ ๋๋ค.
1
2
3
4
5
6
7
8
/** @type {import('next').NextConfig} */
const nextConfig = {
experimental: {
optimizePackageImports: ["icon-library"],
},
}
module.exports = nextConfig
โจ์์๋๊ธฐ Next.js๋ ์ผ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์๋์ผ๋ก ์ต์ ํํ๊ธฐ๋๋ฌธ์ ํด๋น ์ต์ ์ ์ฌ์ฉํ์ง ์์๋ ๋๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ๊ทธ ๋ชฉ๋ก์ ์ด์ชฝ์ ์ฐธ์กฐํ๋ค.
3๏ธโฃOpting specific packages out of bundling
์๋ฒ ์ปดํฌ๋ํธ์ ๋ผ์ฐํธ ํธ๋ค๋ฌ ๋ด๋ถ์์ ๊ฐ์ ธ์จ ํจํค์ง๋ Next.js์ ์ํด ์๋์ผ๋ก ๋ฒ๋ค๋ก ์ ๊ณต๋๋ค. ๋ง์ฝ ์ด๋ฅผ ์์น ์๋๋ค๋ฉด, serverExternalPackages
์ต์
์ ์ฌ์ฉํด ์๋ฒ์ธก์์๋ง ์ฌ์ฉํ๋ ํจํค์ง๋ฅผ ํด๋ผ์ด์ธํธ ๋ฒ๋ค์์ ์ ์ธํ๋๋ก ํด ์ต์ ํ ํ ์ ์๋ค.
1
2
3
4
5
6
/** @type {import('next').NextConfig} */
const nextConfig = {
serverExternalPackages: ["package-name"], // 'package-name'์ ๋ฒ๋ค์์ ์ ์ธ
}
module.exports = nextConfig
๐๋ฐฐ์ด์
์ค๊ฐ์ ๊ฒ์ผ๋ก ํ์ฌ ์ ๋ฌด์์ ์์ ํ๋ ํ๋ก์ ํธ์ ํด๋น ์ต์ ์ ์ ์ฉํด์ ์ด๋ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ฌ์ฉ๋๊ณ , ์ด๋ ์ ๋์ ์ฌ์ด์ฆ๋ฅผ ์ฐจ์งํ๋์ง ํ์ธํด๋ณด์๋ค!
์๊ฐ๋ณด๋ค ์ฌ์ด์ฆ๊ฐ ํฐ ๊ฒ์ด ๋ช๊ฐ ๋ณด์๋๋ฐ, ๋ง์ ์ปดํฌ๋ํธ์์ ํ์์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ธฐ๋ฅ์ด ์๋์๊ธฐ ๋๋ฌธ์ ํด๋น ๋ถ๋ถ์ ๋ด๊ฐ ์ง์ ๊ตฌํํ๋ ๊ฒ์ผ๋ก ๋ฆฌํฉํ ๋งํ๋ฉด์ ์ฌ์ด์ฆ๋ฅผ ๋ง์ด ์ค์ผ ์ ์์๋ค.
Next.js ๊ณต์๋ฌธ์์์ ์๊ธฐํ๋ ๊ฒ ์ฒ๋ผ ์ด๋ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋์ ํ ๋, ํน์ ์์ ์ค์ ๋ด๊ฐ ๋ง๋ ์ปดํฌ๋ํธ๊ฐ ์ด๋์ ๋ ์ฌ์ด์ฆ๋ฅผ ์ฐจ์งํ๊ณ ์ด๊ฒ ๋ด ํ๋ก์ ํธ์ ์ด๋ ์ ๋์ ์ํฅ์ ๋ฏธ์น ์ ์๋์ง๋ฅผ ํ๋จํ๋ฉฐ ์์ ํ๋ฉด ํจ์ฌ ์พ์ ํ ๊ฒฐ๊ณผ๋ฌผ์ด ๋ ์ ์์ผ๋ฆฌ๋ผ ์๊ฐํ๋ค.๐