blacktokkies / toquiz-client

์งˆ๋ฌธ์„ ๋จน๊ณ  ์ž๋ผ๋Š” ํ† ๋ผ๋“ค โ‚แข.โ€ธ.โ‘…แขโ‚Ž [Client]
https://toquiz.site/
MIT License
3 stars 1 forks source link

SVG-in-JS ์ œ๊ฑฐํ•˜๊ธฐ #477

Closed leegwae closed 1 year ago

leegwae commented 1 year ago

๐Ÿคธโ€โ™‚๏ธ ๋ชฉํ‘œ

JS ๋นŒ๋“œ๋ฌผ์˜ ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ธฐ๋กœ ํ–ˆ๋‹ค. ๋จผ์ € SVG ํŒŒ์ผ์„ JS ๋ฒˆ๋“ค์—์„œ ์ œ๊ฑฐํ•ด๋ณด์ž.

๊ฐœ์„  ์ „

โœจ์•„์ด์ฝ˜๋“ค์„ SVG ์Šคํ”„๋ผ์ดํŠธ๋กœ ๋งŒ๋“ค๊ธฐ

toquiz์—์„œ๋Š” ์—ฌ๋Ÿฌ ์•„์ด์ฝ˜์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.

์•„์ด์ฝ˜๋“ค

์œ„ ํ™”๋ฉด์„ ์˜ˆ๋กœ ๋“ค๋ฉด ๋ฉ”๋‰ด/๊ณ„์ •/์ข‹์•„์š” ์•„์ด์ฝ˜์ด๋‹ค. ํ˜„์žฌ๋Š” src/components/vectors ํด๋” ์•„๋ž˜์—์„œ JSX๋กœ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค. ๋งŒ์•ฝ ์ด๋“ค์„ ๋ชจ๋‘ ์ •์  ์—์…‹์œผ๋กœ ๋ฐ”๊พผ๋‹ค๋ฉด ๊ทธ ๊ฐœ์ˆ˜๋งŒํผ ์š”์ฒญ์ด ํ•„์š”ํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿฐ ์•„์ด์ฝ˜๋“ค์€ ๋ชจ๋‘ SVG ์Šคํ”„๋ผ์ดํŠธ๋กœ ๋งŒ๋“ค์–ด ์ œ๊ณตํ•˜๊ฒ ๋‹ค.

์˜ˆ์‹œ

// Add.tsx 
import type { SVGProps } from 'react';

import React from 'react';

export const Add = (props: SVGProps<SVGSVGElement>): JSX.Element => (
  <svg
    xmlns="http://www.w3.org/2000/svg"
    height="48"
    viewBox="0 -960 960 960"
    width="48"
    {...props}
  >
    <path d="M450-450H200v-60h250v-250h60v250h250v60H510v250h-60v-250Z" />
  </svg>
);

์œ„ JSX๋ฅผ ์•„๋ž˜์ฒ˜๋Ÿผ .svg๋กœ ๊ตฌ์„ฑํ•ด์ค€๋‹ค.

<-- icons.svg -->
<svg>
  <defs>
    <symbol
      id="add"
      xmlns="http://www.w3.org/2000/svg"
      viewBox="0 -960 960 960"
    >
      <path
        fill="currentcolor"
        d="M450-450H200v-60h250v-250h60v250h250v60H510v250h-60v-250Z"
      />
    </symbol>
  </defs>
</svg>
  1. svg ํƒœ๊ทธ๋ฅผ symbol ํƒœ๊ทธ๋กœ ๋ฐ”๊พผ๋‹ค.
  2. ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ id๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  3. path ํƒœ๊ทธ ๋‚ด์— fill="currentcolor"๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
// MyPage.tsx
import React from "react";
import Icons from "/icons.svg?url";

export function MyPage(): JSX.Element {
  return (
    <svg className="h-6 w-6 text-primary">
      <use href={`${Icons}#add`} />
    </svg>
  );
}

์ด์ œ ์œ„์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

โœจ ๋กœ๊ณ ์šฉ SVG๋ฅผ ์ •์  ์—์…‹์œผ๋กœ ์ œ๊ณตํ•˜๊ธฐ

๊ฐ€์žฅ ๋งŽ์€ ๋ถ„๋Ÿ‰์„ ์ฐจ์ง€ํ•œ ๋กœ๊ณ ์šฉ SVG๋Š” public ํด๋” ์•ˆ์˜ ์ •์  ์—์…‹์œผ๋กœ ์˜ฎ๊ฒผ๋‹ค.

๐ŸŽ‰ SVG-in-JS ์ œ๊ฑฐ ๊ฒฐ๊ณผ

๊ฐœ์„  ํ›„

JS ๋นŒ๋“œ๋ฌผ์˜ ํฌ๊ธฐ๊ฐ€ 523.75KB์—์„œ 402.55KB๋กœ ์•ฝ 20% ์ค„์–ด๋“ค์—ˆ๋‹ค!

๊ธฐํƒ€

SVG ์Šคํ”„๋ผ์ดํŠธ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ํˆด์„ ์ฐพ์•„๋ณด๊ฑฐ๋‚˜ ์ง์ ‘ ๋งŒ๋“ค์–ด๋ด์•ผ๊ฒ ๋‹ค.

์ฐธ๊ณ 

https://kurtextrem.de/posts/svg-in-js