4. Styled-components

keyword

  • styled-componets

1. styled-componets

  • ๋Œ€ํ‘œ์ ์ธ CSS-in-JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

  • CSS ์ž‘์„ฑ์„ ์ปดํฌ๋„ŒํŠธ๋กœ ์‚ฌ๊ณ ํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์ 

  • sc๋ผ๋Š” ์ ‘๋‘์‚ฌ๊ฐ€ ๋ถ™์€ ์œ ๋‹ˆํฌํ•œ class name์„ ์ƒ์„ฑํ•จ

  • React ์ปดํฌ๋„ŒํŠธ์—์„œ ์ „๋‹ฌ๋ฐ›์€ props๋ฅผ ํ†ตํ•ด ๋™์ ์œผ๋กœ ์Šคํƒ€์ผ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ

  • Tagged templates literals์„ ์‚ฌ์šฉํ•ด ํ•จ์ˆ˜ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์‚ฌ์šฉ๋ฒ•

import React from "react";
import styled from "styled-components";

const StyledButton = styled.button`
  padding: 6px 12px;
  border-radius: 8px;
  font-size: 1rem;
  line-height: 1.5;
  border: 1px solid lightgray;
  color: gray;
  background: white;
`;

function Button({ children }) {
  return <StyledButton>{children}</StyledButton>;
}

Tagged templates์€ ํ•จ์ˆ˜๋กœ ํŒŒ์‹ฑํ•  ์ˆ˜ ์žˆ์–ด ์•„๋ž˜์™€ ๊ฐ™์ด ํ•จ์ˆ˜ ํ‘œํ˜„์‹ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

const StyledButton = styled.button`
  padding: 6px 12px;
  border-radius: 8px;
  font-size: 1rem;
  line-height: 1.5;
  border: 1px solid lightgray;

  color: ${(props) => props.color || "gray"};
  background: ${(props) => props.background || "white"};
`;

์ถ”๊ฐ€ ํ‚ค์›Œ๋“œ

Tagged templates literals ๋งํฌ

ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด์˜ ๋ฐœ์ „๋œ ํ˜•ํƒœ๋กœ ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด์„ ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํƒœ๊ทธ ํ•จ์ˆ˜์˜ ์ฒซ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์ •์  ๋ฌธ์ž์—ด์˜ ๋ฐฐ์—ด์„ ๋‚˜๋จธ์ง€ ํŒŒ๋ผ๋ฏธํ„ฐ์—” ๋™์  ๋ฐ์ดํ„ฐ์ธ ํ‘œํ˜„์‹์„ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค.

function myTag(strings, personExp, ageExp) {
  var str0 = strings[0]; // "that "
  var str1 = strings[1]; // " is a "

  // ์‚ฌ์‹ค ์ด ์˜ˆ์ œ์˜ string์—์„œ ํ‘œํ˜„์‹์ด ๋‘ ๊ฐœ ์‚ฝ์ž…๋˜์—ˆ์œผ๋ฏ€๋กœ
  // ${age} ๋’ค์—๋Š” ''์ธ string์ด ์กด์žฌํ•˜์—ฌ
  // ๊ธฐ์ˆ ์ ์œผ๋กœ strings ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋Š” 3์ด ๋ฉ๋‹ˆ๋‹ค.
  // var str2 = strings[2];

  var ageStr;
  if (ageExp > 99) {
    ageStr = "centenarian";
  } else {
    ageStr = "youngster";
  }

  // ์‹ฌ์ง€์–ด ์ด ํ•จ์ˆ˜๋‚ด์—์„œ๋„ template literal์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  return str0 + personExp + str1 + ageStr;
}

var output = myTag`that ${person} is a ${age}`;

console.log(output);
// that Mike is a youngster

with Babel

next.js๋Š” SSR(Server Side Rendering) ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ์„œ๋ฒ„์—์„œ pre-redering๋œ HTML ๋ฌธ์„œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฒ€์ƒ‰ ์—”์ง„์ด ์›น ์‚ฌ์ดํŠธ๋ฅผ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”(SEO)๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

์ดˆ๊ธฐ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง ํ›„ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•  ๋•Œ styled-components์˜ class name์˜ ํ•ด์‹œ๊ฐ’์ด ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„์— ๋ถˆ์ผ์น˜ํ•  ์ˆ˜ ์žˆ์–ด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ด๋Š” babel-plugin-styled-components๋ฅผ ์‚ฌ์šฉํ•ด ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„์— ์ผ๊ด€๋œ class name์„ ์ƒ์„ฑํ•ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

๋˜ํ•œ, ๋ณด๋‹ค ํŽธ๋ฆฌํ•œ ๋””๋ฒ„๊น…์„ ์œ„ํ•ด ์ปดํฌ๋„ŒํŠธ ์ด๋ฆ„์„ class name์˜ ํ•ด์‰ฌ๊ฐ’ ์ ‘๋‘์‚ฌ๋กœ ์ถ”๊ฐ€ํ•œ๋‹ค.

Last updated