SVGR์˜ Props TypeErorr?!

 

SVG๋ฅผ ๋ณ„๋„์˜ ์ปดํฌ๋„ŒํŠธ๋กœ ๋งŒ๋“ค์ง€ ์•Š๊ณ ๋„ ์ปดํฌ๋„ŒํŠธ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก Webpack ์„ค์ •์„ ์ถ”๊ฐ€ํ•œ ๊ณผ์ •์„ ๊ณต์œ ํ•ด ๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ์—์„œ ์ฒซ ๋ฒˆ์งธ SVG์ธ ํ–„๋ฒ„๊ฑฐ ์•„์ด์ฝ˜์„ SVG๋กœ ์ ์šฉํ•˜๋ฉด์„œ ๊ฒช์€ ๋ฌธ์ œ์™€ ๊ทธ ํ•ด๊ฒฐ ๊ณผ์ •์„ ํ•จ๊ป˜ ๋‚˜๋ˆ„๊ฒ ์Šต๋‹ˆ๋‹ค.

 

SVG ํŒŒ์ผ์„ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

SVG๋ฅผ img ํƒœ๊ทธ๊ฐ€ ์•„๋‹Œ ์ปดํฌ๋„ŒํŠธ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์ง€๋งŒ, ์ €๋Š” .svg ํ™•์žฅ์ž๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํŒŒ์ผ ๊ด€๋ฆฌ ์ธก๋ฉด์—์„œ ๋” ํŽธํ•˜๋‹ค๊ณ  ๋А๊ผˆ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์ด์œ ๋ฅผ ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. ํŒŒ์ผ ๊ด€๋ฆฌ ์šฉ์ด์„ฑ: SVG ํŒŒ์ผ์„ ๋ณ„๋„์˜ ์ปดํฌ๋„ŒํŠธ๋กœ ๋งŒ๋“ค ํ•„์š” ์—†์ด, ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•ด ์‰ฝ๊ฒŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์–ด ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๊ฐ€ ๊น”๋”ํ•ด์ง‘๋‹ˆ๋‹ค.
  2. ์žฌ์‚ฌ์šฉ์„ฑ: ๋™์ผํ•œ SVG ํŒŒ์ผ์„ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๋ฉด ๋ชจ๋“  ์ฐธ์กฐ์—์„œ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.
  3. ๋””์ž์ธ ํˆด๊ณผ์˜ ํ˜ธํ™˜์„ฑ: ๋งŽ์€ ๋””์ž์ธ ํˆด์ด SVG ํฌ๋งท์„ ์ง€์›ํ•˜๋ฏ€๋กœ, ๋””์ž์ด๋„ˆ์™€์˜ ํ˜‘์—…์ด ์›ํ™œํ•ฉ๋‹ˆ๋‹ค. SVG ํŒŒ์ผ์„ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋ฉด ๋””์ž์ด๋„ˆ๊ฐ€ ์ž‘์—…ํ•œ ํŒŒ์ผ์„ ๊ทธ๋Œ€๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ด์  ๋•๋ถ„์—, ์ €๋Š” svgr/webpack์„ ์ถ”๊ฐ€๋กœ ์„ค์น˜ํ•˜์—ฌ SVG ํŒŒ์ผ์„ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

๋ฌธ์ œ์˜ ์‹œ์ž‘

SVG ์•„์ด์ฝ˜์„ ์ปดํฌ๋„ŒํŠธ์ฒ˜๋Ÿผ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด svgr/webpack์„ ์„ค์ •ํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

  1. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์—๋Ÿฌ: ํ˜„์žฌ ๊ฐœ๋ฐœํ•œ <Svg /> ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” props๋ฅผ ๋„˜๊ธธ ์ˆ˜ ์—†์–ด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, <Hamburger width="24" /> ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•˜๋ ค ํ–ˆ์„ ๋•Œ, “Type '{width: string} is not assignable to type 'IntrinsicAttributes'.”๋ผ๋Š” ํƒ€์ž… ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด props๋ฅผ ์ œ๋Œ€๋กœ ์ „๋‹ฌํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋˜์—ˆ๊ณ , ๊ฒฐ๊ณผ์ ์œผ๋กœ CSS์—์„œ ์ง์ ‘์ ์œผ๋กœ svg { }์— ์„ค์ •ํ•˜๊ฒŒ ๋˜์–ด ์œ ์—ฐ์„ฑ์ด ๋–จ์–ด์ง„ ์ƒํ™ฉ์ด์—ˆ์Šต๋‹ˆ๋‹ค.
  2. ํƒ€์ž… ์„ ์–ธ ๋ฌธ์ œ: declarations.d.ts ํŒŒ์ผ์—์„œ SVG ํƒ€์ž…์„ any๋กœ ์„ ์–ธํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•œ ์—๋Ÿฌ์˜€์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํƒ€์ž…์„ string์œผ๋กœ ๋ณ€๊ฒฝํ•˜์˜€๊ณ , ์ด๋Š” tsconfig ์„ค์ •๊ณผ ๊ด€๋ จ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. 

 

์ƒ์„ธ ํ•ด๊ฒฐ ๊ณผ์ •

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์„ ๊ฑฐ์ณค์Šต๋‹ˆ๋‹ค.

  1. ํƒ€์ž… ์„ ์–ธ ์ˆ˜์ •: ์ดˆ๊ธฐ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ ์–ธํ–ˆ์Šต๋‹ˆ๋‹ค.
// 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 ๋ฌธ์„œ

 

+ Recent posts