SVG๋ฅผ ๋ณ๋์ ์ปดํฌ๋ํธ๋ก ๋ง๋ค์ง ์๊ณ ๋ ์ปดํฌ๋ํธ์ฒ๋ผ ์ฌ์ฉํ ์ ์๋๋ก Webpack ์ค์ ์ ์ถ๊ฐํ ๊ณผ์ ์ ๊ณต์ ํด ๋ณด๋ ค๊ณ ํฉ๋๋ค.
ํ๋ก์ ํธ์์ ์ฒซ ๋ฒ์งธ SVG์ธ ํ๋ฒ๊ฑฐ ์์ด์ฝ์ SVG๋ก ์ ์ฉํ๋ฉด์ ๊ฒช์ ๋ฌธ์ ์ ๊ทธ ํด๊ฒฐ ๊ณผ์ ์ ํจ๊ป ๋๋๊ฒ ์ต๋๋ค.
SVG ํ์ผ์ ์ง์ ์ฌ์ฉํ๋ ์ด์
SVG๋ฅผ img ํ๊ทธ๊ฐ ์๋ ์ปดํฌ๋ํธ์ฒ๋ผ ์ฌ์ฉํ๋ ค๋ฉด ์ผ๋ฐ์ ์ผ๋ก ํจ์ํ ์ปดํฌ๋ํธ๋ก ๋ณํํ๋ ๋ฐฉ๋ฒ๋ ์์ง๋ง, ์ ๋ .svg ํ์ฅ์๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ํ์ผ ๊ด๋ฆฌ ์ธก๋ฉด์์ ๋ ํธํ๋ค๊ณ ๋๊ผ์ต๋๋ค. ๋ช ๊ฐ์ง ์ด์ ๋ฅผ ๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
- ํ์ผ ๊ด๋ฆฌ ์ฉ์ด์ฑ: SVG ํ์ผ์ ๋ณ๋์ ์ปดํฌ๋ํธ๋ก ๋ง๋ค ํ์ ์์ด, ํ์ผ ๊ฒฝ๋ก๋ฅผ ํตํด ์ฝ๊ฒ ๊ฐ์ ธ์ฌ ์ ์์ด ํ๋ก์ ํธ ๊ตฌ์กฐ๊ฐ ๊น๋ํด์ง๋๋ค.
- ์ฌ์ฌ์ฉ์ฑ: ๋์ผํ SVG ํ์ผ์ ์ฌ๋ฌ ๊ณณ์์ ์ฌ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ํ์ผ์ ์์ ํ๋ฉด ๋ชจ๋ ์ฐธ์กฐ์์ ์๋์ผ๋ก ์ ๋ฐ์ดํธ๋ฉ๋๋ค.
- ๋์์ธ ํด๊ณผ์ ํธํ์ฑ: ๋ง์ ๋์์ธ ํด์ด SVG ํฌ๋งท์ ์ง์ํ๋ฏ๋ก, ๋์์ด๋์์ ํ์ ์ด ์ํํฉ๋๋ค. SVG ํ์ผ์ ์ง์ ์ฌ์ฉํ๋ฉด ๋์์ด๋๊ฐ ์์ ํ ํ์ผ์ ๊ทธ๋๋ก ํ์ฉํ ์ ์์ต๋๋ค.
์ด๋ฌํ ์ด์ ๋๋ถ์, ์ ๋ svgr/webpack์ ์ถ๊ฐ๋ก ์ค์นํ์ฌ SVG ํ์ผ์ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ์ค์ ํ์์ต๋๋ค.
๋ฌธ์ ์ ์์
SVG ์์ด์ฝ์ ์ปดํฌ๋ํธ์ฒ๋ผ ํ์ฉํ๊ธฐ ์ํด svgr/webpack์ ์ค์ ํ๋ ๊ณผ์ ์์ ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
- ํ์ ์คํฌ๋ฆฝํธ ์๋ฌ: ํ์ฌ ๊ฐ๋ฐํ <Svg /> ์ปดํฌ๋ํธ์์๋ props๋ฅผ ๋๊ธธ ์ ์์ด ์๋ฌ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์๋ฅผ ๋ค์ด, <Hamburger width="24" /> ํํ๋ก ์ฌ์ฉํ๋ ค ํ์ ๋, “Type '{width: string} is not assignable to type 'IntrinsicAttributes'.”๋ผ๋ ํ์ ์๋ฌ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์ด๋ก ์ธํด props๋ฅผ ์ ๋๋ก ์ ๋ฌํ์ง ๋ชปํ๊ฒ ๋์๊ณ , ๊ฒฐ๊ณผ์ ์ผ๋ก CSS์์ ์ง์ ์ ์ผ๋ก svg { }์ ์ค์ ํ๊ฒ ๋์ด ์ ์ฐ์ฑ์ด ๋จ์ด์ง ์ํฉ์ด์์ต๋๋ค.
- ํ์ ์ ์ธ ๋ฌธ์ : declarations.d.ts ํ์ผ์์ SVG ํ์ ์ any๋ก ์ ์ธํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ ์๋ฌ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ํ์ ์ string์ผ๋ก ๋ณ๊ฒฝํ์๊ณ , ์ด๋ tsconfig ์ค์ ๊ณผ ๊ด๋ จ์ด ์์์ต๋๋ค.
์์ธ ํด๊ฒฐ ๊ณผ์
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์ณค์ต๋๋ค.
- ํ์ ์ ์ธ ์์ : ์ด๊ธฐ์๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์ธํ์ต๋๋ค.
// declarations.d.ts
declare module "*.svg?url" {
const url: any;
export default url;
}
ํ์ง๋ง any ๋์ string์ผ๋ก ์์ ํ์ฌ ์๋ฌ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
// declarations.d.ts
declare module "*.svg?url" {
const url: string;
export default url;
}
PR ์ฝ๋๋ฆฌ๋ทฐ ๊ณผ์ ์์ SVGR ๋ฌธ์๋ฅผ ์๋ชป ํด์ํ ๊ฒ ๊ฐ๋ค๋ ์ฝ๋ฉํธ๋ฅผ ๋ฐ์๊ณ , resourceQuery: /url/์ ๊ฐ์ ์ค์ ์ด ํ์ํ๋ค๋ ๊ฒ์ ๊นจ๋ซ๊ฒ ๋์์ต๋๋ค. ์ ๊ฐ ์คํดํ ๋ถ๋ถ์, SVG ํ์ผ์ URL๋ก ์ฌ์ฉํ ๋๋ ํด๋น ํ์ผ์ ?url ์ฟผ๋ฆฌ ๋ฌธ์์ด์ ๋ถ์ฌ์ผ ํ๋ค๋ ์ ์ด์์ด์..!
์ด๋ก ์ธํด url์ ํ์ ์ด string์ผ๋ก ์ ์ธ๋์ด์ผ ํ๋ ์ด์ ๋ฅผ ๋์ณค๊ณ ์ด๋ค ํ์ ์ผ๋ก ์ค์ ํด ์ค์ง๋ฅผ ๋ชฐ๋ผ any ํ์ ์ผ๋ก ์ค์ ํด๋์์ต๋๋ค.
2. Webpack ์ค์ ์กฐ์ : ๋ค์์ผ๋ก, Webpack ์ค์ ์์ SVG ๊ด๋ จ ๊ท์น ์ถฉ๋์ ํด๊ฒฐํ์ต๋๋ค. ์๋์ ๊ฐ์ด ์ค์ ์ ๋ณ๊ฒฝํ์ต๋๋ค.
{
test: /\.(jpg|jpeg|gif|png|eot|woff|ttf)$/i,
type: "asset/resource",
},
{
test: /\.svg$/,
oneOf: [
{
use: ["@svgr/webpack"],
issuer: /\.[jt]sx?$/,
resourceQuery: { not: [/url/] },
},
{
type: "asset",
resourceQuery: /url/, // *.svg?url
},
],
},
๋ฐฐ์ด์ ์์๋๋ก ๊ท์น์ ์ฒ๋ฆฌํ๋ ์นํฉ์ ์ํด @svgr/webpack ๊ท์น์ assets/resource ๊ท์น๋ณด๋ค ์์๋ก ์ฌ๋ฆฌ๋ ๋ฐฉ๋ฒ๋ ์์์ผ๋, ๋ ๊ท์น ์ค ํ๋์ ๊ท์น๋ง์ด. svg ํ์ผ์ ์ ์ฉ๋๊ฒ ํ๊ธฐ ์ํด @svgr/webpack์ svg ๊ท์น๋ง์ ์ ์งํ์ต๋๋ค.
๋๋ ์
์ด๋ฒ ์์ ์ ํตํด SVG๋ฅผ ํจ์จ์ ์ผ๋ก ํ์ฉํ ์ ์๋ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ ๋ํด ์๊ฒ ๋์๊ณ , Webpack๊ณผ TypeScript์ ์ค์ ์ ๋ํ ์ดํดํด๋๋ ๋์์ง ๊ฒ ๊ฐ์ต๋๋ค. ํ์ผ ๊ด๋ฆฌ์ ์ฉ์ด์ฑ๊ณผ ์ฌ์ฌ์ฉ์ฑ์ ๊ณ ๋ คํ ๋, SVG๋ฅผ ์ง์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋งค์ฐ ์ ๋ฆฌํ๋ค๋ ์๊ฐ์ด ๋ค์์ต๋๋ค. ์์ผ๋ก๋ ์ด๋ฌํ ๊ฒฝํ์ ๋ฐํ์ผ๋ก ๋ ๋์ ๊ฐ๋ฐ ํ๊ฒฝ์ ๋ง๋ค์ด ๊ฐ๊ณ ์ถ์ต๋๋ค.
SVG ์ปดํฌ๋ํธ๋ก์ ์ ํ์ด ์ฝ์ง ์์์ง๋ง, ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ ์ ์ฐํ ๋์์ธ ์์ ์ด ๊ฐ๋ฅํด์ก์ต๋๋ค. ์ฌ๋ฌ๋ถ๋ SVG๋ฅผ ๋ค์ํ๊ฒ ํ์ฉํด ๋ณด์๊ธธ ์ถ์ฒ๋๋ฆฝ๋๋ค!
๐ ์ฐธ๊ณ ๋ฌธํ |
svgr/webpack ๋ฌธ์ |