Y J S

CSS ์ž๋™ ์ฃผ์ž…์ด ๊ฐ€๋Šฅํ•œ Toast ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐœ๋ฐœ๊ธฐ

ํ”„๋กœ์ ํŠธ ๊ฐœ์š”

ํ”„๋ ˆ์ž„์›Œํฌ์— ๋ฌด๊ด€ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋Ÿ‰ํ™”๋œ Toast ์•Œ๋ฆผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐœ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ฐ€์žฅ ํฐ ํŠน์ง•์€ CSS ํŒŒ์ผ์„ ๋ณ„๋„๋กœ importํ•˜์ง€ ์•Š์•„๋„ ์ž๋™์œผ๋กœ ์Šคํƒ€์ผ์ด ์ ์šฉ๋œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.


ํ•ต์‹ฌ ๋ชฉํ‘œ

  • CSS ํŒŒ์ผ ์—†์ด๋„ ์™„์ „ํžˆ ์ž‘๋™ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • import { toast } from "js-toastify" ํ•œ ์ค„๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ์™„์ „ํ•œ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ์ง€์›
  • TypeScript ์™„๋ฒฝ ์ง€์›
  • ๊ฒฝ๋Ÿ‰ํ™” (3.8KB)

๊ธฐ์ˆ  ์Šคํƒ

๊ธฐ์ˆ  ์—ญํ• 
TypeScript ํƒ€์ž… ์•ˆ์ •์„ฑ๊ณผ ๊ฐœ๋ฐœ ํŽธ์˜์„ฑ
Rollup ๋ฒˆ๋“ค๋ง ๋ฐ ESM/CommonJS ์ง€์›
CSS Variables ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ๊ฐ€๋Šฅํ•œ ์Šคํƒ€์ผ ์‹œ์Šคํ…œ
Vanilla JavaScript ํ”„๋ ˆ์ž„์›Œํฌ ์˜์กด์„ฑ ์ œ๊ฑฐ

ํ•ต์‹ฌ ๊ตฌํ˜„ ์•„์ด๋””์–ด

1. CSS ์ž๋™ ์ฃผ์ž… ์‹œ์Šคํ…œ

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ importํ•˜๋Š” ์ˆœ๊ฐ„, ๋‚ด๋ถ€์ ์œผ๋กœ CSS ๋ฌธ์ž์—ด์„ <style> ํƒœ๊ทธ๋กœ ์ฃผ์ž…ํ•˜์—ฌ
์‚ฌ์šฉ์ž๊ฐ€ ๋ณ„๋„๋กœ CSS ํŒŒ์ผ์„ importํ•˜์ง€ ์•Š์•„๋„ ์Šคํƒ€์ผ์ด ์ ์šฉ๋˜๋„๋ก ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

const style = document.createElement("style");
style.textContent = `
  .toast {
    position: fixed;
    bottom: 20px;
    left: 50%;
    transform: translateX(-50%);
    background: var(--toast-bg, #333);
    color: var(--toast-color, #fff);
    padding: 10px 16px;
    border-radius: 6px;
    font-size: 14px;
    opacity: 0.95;
    transition: opacity 0.3s ease;
  }
`;
document.head.appendChild(style);

2. CSS ๋ณ€์ˆ˜๋ฅผ ํ™œ์šฉํ•œ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•

CSS ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž ์ •์˜ ์Šคํƒ€์ผ์„ ์†์‰ฝ๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

:root {
  --toast-bg: #222;
  --toast-color: #fff;
  --toast-radius: 8px;
}

3. Rollup ์„ค์ •

import typescript from "@rollup/plugin-typescript";
import { terser } from "rollup-plugin-terser";
import css from "rollup-plugin-import-css";

export default {
  input: "src/index.ts",
  output: [
    { file: "dist/index.esm.js", format: "esm", sourcemap: true },
    { file: "dist/index.cjs.js", format: "cjs", sourcemap: true },
  ],
  plugins: [typescript(), css(), terser()],
};

rollup-plugin-import-css๋ฅผ ํ†ตํ•ด CSS ํŒŒ์ผ์„ ๋ฒˆ๋“ค์— ํฌํ•จ์‹œํ‚ค๊ณ , terser๋กœ ์ตœ์ข… ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ตœ์†Œํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ๋ฒ•

๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

import { toast } from "js-toastify";

toast("Hello from js-toastify!");

์ปค์Šคํ„ฐ๋งˆ์ด์ง•
:root {
--toast-bg: #0055ff;
--toast-color: #fff;
--toast-radius: 10px;
}

toast("Custom styled toast!");

npm ๋ฐฐํฌ ๊ณผ์ •

1.ํŒจํ‚ค์ง€ ์ด๋ฆ„ ์ถฉ๋Œ ํ•ด๊ฒฐ

์ฒ˜์Œ js.toast๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋ฐฐํฌ๋ฅผ ์‹œ๋„ํ–ˆ์œผ๋‚˜, ๊ธฐ์กด ํŒจํ‚ค์ง€์™€ ์ด๋ฆ„์ด ์œ ์‚ฌํ•˜์—ฌ ์ด๋ฆ„ ์ถฉ๋Œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ตœ์ข…์ ์œผ๋กœ js-toastify ์ด๋ฆ„์œผ๋กœ ๋ฐฐํฌ์— ์„ฑ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.

2. ์ตœ์ข… ๋ฐฐํฌ

https://www.npmjs.com/package/js-toastify

๊ฒฐ๊ณผ

ํ•ญ๋ชฉ ๋‚ด์šฉ ํŒจํ‚ค์ง€ ํฌ๊ธฐ 3.8KB (์••์ถ• ํ›„) ๋ฒˆ๋“ค ํฌ๊ธฐ 14.6KB (์••์ถ• ํ•ด์ œ) ํŒŒ์ผ ์ˆ˜ 7๊ฐœ TypeScript ์ง€์› ๋ชจ๋˜ ๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜์„ฑ

ํ•ต์‹ฌ ์„ฑ๊ณผ

  1. CSS ํŒŒ์ผ import ์—†์ด๋„ ๋ฐ”๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

  2. CSS ๋ณ€์ˆ˜๋กœ ์™„์ „ํ•œ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ๊ฐ€๋Šฅ

  3. ๊ฒฝ๋Ÿ‰ํ™” (3.8KB)

  4. TypeScript ํƒ€์ž… ์™„๋ฒฝ ์ง€์›

  5. React, Vue, Angular ๋“ฑ ํ”„๋ ˆ์ž„์›Œํฌ ๋ฌด๊ด€ํ•˜๊ฒŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

ํ–ฅํ›„ ๊ณ„ํš

  1. ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ์˜ต์…˜ ์ถ”๊ฐ€

  2. ๋‹คํฌ/๋ผ์ดํŠธ ํ…Œ๋งˆ ์ง€์›

  3. ๋ชจ๋ฐ”์ผ UI ์ตœ์ ํ™”

  4. ์ ‘๊ทผ์„ฑ ๊ฐœ์„ 

๊ฐœ๋ฐœ ํ›„๊ธฐ

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ตœ์šฐ์„ ์œผ๋กœ ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค๊ณ„์˜ ์ค‘์š”์„ฑ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. CSS ์ž๋™ ์ฃผ์ž… ์‹œ์Šคํ…œ์„ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋“ค์ด ๋ณ„๋„์˜ ์„ค์ • ์—†์ด ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“  ๊ฒƒ์ด ๊ฐ€์žฅ ํฐ ์„ฑ๊ณผ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ CSS ๋ณ€์ˆ˜ ๊ธฐ๋ฐ˜ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ์‹œ์Šคํ…œ์œผ๋กœ ์œ ์—ฐ์„ฑ๊ณผ ์‚ฌ์šฉ์„ฑ์„ ๋ชจ๋‘ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ๋„ ๋” ๋‚˜์€ DX(Developer Experience)๋ฅผ ์ œ๊ณตํ•˜๋Š” UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ง€์†์ ์œผ๋กœ ์—ฐ๊ตฌํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.