230315(μ)
π μ±μ₯μΌμ§ 3.2
μ±
ν볡ν μ΄κΈ°μ£Όμμ(μ¨μΈ λ€μ΄μ΄)
μ λ΄μ©μ μκ·Ήλ°μ μμνλ μλ°ν μ±μ₯κΈ°λ‘
μ΄μμλ κ½κ³Ό μ£½μ κ½μ μ΄λ»κ² ꡬλ³νλκ°?
μ±μ₯νκ³ μλ κ²μ΄ μ΄μ μλ κ²μ΄λ€.
μλͺ μ μ μΌν μ¦κ±°λ μ±μ₯μ΄λ€!
π³ ν€μλ (1.0)
μ΅λν κ°λ¨νκ² μ 리, μΆνμ 보면μ μ€μ€λ‘ μ€λͺ
π κ²½ν μμ£Όλ‘ (2.0)
λ¨μ μ 보λ₯Ό μ λ¬νκΈ°λ³΄λ€ λ¬΄μμ λ°°μ κ³ μ΄λ»κ² ν΄κ²°νλμ§ μ§§κ³ κ°λ¨νκ² μμ±
βοΈ μ ν΄μ§ ν νλ¦Ώμ λ§μΆ°μ (3.0)
ν€μλ, κ²½ν λͺ¨λ μ’λ€. λ€λ§ λ§€μΌ μμ±νκΈ°λ‘ λ§μ λ¨Ήμλ§νΌ ν΅μ¬λ§ κ°κ²°νκ² μ 리ν μ μκ² ν νλ¦Ώμ μμ±
(3.1) 230102λΆν° μμλλ νμ΅μ κ΄ν λ΄μ© μΆκ°
(3.2) 230313λΆν° μ’λ κ²½ν, κ°μ μμ£Όμ λ΄μ©λ λ΄κΈ°!
π μ€λμ ν€μλ
Vanilla Extract κ·Έλ¦¬κ³ TypeScript
- Sass, LESSμ κ°μ΄ λΉλ νμμ λͺ¨λ μ€νμΌλ€μ΄ λ°μνλ©΄μ λμμ νμ μ€ν¬λ¦½νΈμ ν¨κ» νλ€.
- Framework Agnostic, μ¦ μ΄λ€ νλ μμν¬μλ μμ‘΄νμ§ μλλ€.
- νμ μ€ν¬λ¦½νΈμ μμ£Ό μ’μ μ‘°ν©μ΄λ€!
// ButtonComponent.ts
import { BaseComponent } from '../Base';
import { ButtonComponentStyle } from '../../style/components/ButtonComponent.css';
export class ButtonComponent extends BaseComponent<HTMLElement> {
constructor(content: string, type?: string) {
super(
`<button class='${ButtonComponentStyle}' type='${type}'>${content}</button>`,
);
if (this.element.getAttribute('type') === 'flexible') {
this.element.style.width = '4rem';
}
}
}
// ButtonComponent.css.ts
import { style } from '@vanilla-extract/css';
export const ButtonComponentStyle = style({
display: 'flex',
flexDirection: 'row',
justifyContent: 'center',
alignItems: 'center',
padding: '0px 10px',
position: 'absolute',
width: '10rem',
height: '2rem',
// left: '20px',
// top: '20px',
background:
'linear-gradient(174.6deg, #FFFFFF 4.31%, #FED15F 50.01%, #FEBE30 95.71%)',
border: '1px solid var(--color-yellow-300)',
borderRadius: '4px',
fontStyle: 'normal',
fontWeight: '600',
fontSize: '11px',
lineHeight: '13px',
textAlign: 'center',
letterSpacing: '-0.06em',
':hover': {
cursor: 'pointer',
},
});
// vite.config.js
// κ°μΈμ μΌλ‘ μ¬κΈ°μ μμ² ν€λ§ΈκΈ° λλ¬Έμ κΈ°μ΅νκΈ° μν΄ μμ±ν΄λλ μμ μ½λ
import { defineConfig } from 'vite';
import { vanillaExtractPlugin } from '@vanilla-extract/vite-plugin';
import { viteStaticCopy } from 'vite-plugin-static-copy';
export default defineConfig({
base: './', // This sets the base path for all generated URLs to './'
// Other configuration options...
plugins: [
vanillaExtractPlugin(),
viteStaticCopy({
targets: [
{
src: 'assets',
dest: '',
},
],
}),
],
});
- μμ κ°μ΄ Button μ»΄ν¬λνΈλ₯Ό ꡬννλ€.
- css.tsμ μνλ μ€νμΌμ vanilla extractλ‘ μ μΈν΄μ£Όκ³ κ·Έ κ°μ exportνμ¬ λλλ§ν htmlμ classμ ν λΉνλ€.
- μ²μ μ΅νλ λ°©λ²κ³Ό css λͺ¨λμ΄λΌμ κ³μ μλ¬, 곡μλ¬Έμμ λ°λ³΅μ΄μλ€.
- νΉνλ μ²μμΌλ‘ Vite λ²λ€λ¬μ ν¨κ» μ¬μ©νλ€λ³΄λ λ μ΅μμΉ μμλ€.
μ°Έκ³
π μμ½ λ° ν루 κ°λ¨ νκ³
tsλ₯Ό μ΄μ©ν μ»΄ν¬λνΈ κ΅¬μ±κ³Ό vanilla extrachκ³Όμ 무ν μ¬ν¬β¦ λκ° μ§μ μ΄ λ§μ§ μμμ νλ€μμ§λ§, κ·Έλλ μ΄λ»κ² viteλ‘ λ²λ€λ§ μμ νμ¬ html νμΌμ srcλ‘ μ¬μ©λμ§ μλ μ΄λ―Έμ§ νμΌμ λ²λ€λ§ λ λκΈΈ μ μλμ§, tsλ‘ μ»΄ν¬λνΈλ₯Ό μ΄λ»κ² λλκ³ μμ±νλ©΄ λλμ§ λ±μ μλ‘κ² λ°°μ λ€. μμ§ν μμ§ μ»΄ν¬λνΈ λ¨μλ‘ λλκ³ μ€κ³νκ³ λ€μ΄κ°λ κ²μ μ΅μμΉκ° μλ€β¦ κ·Έλ¬λκΉ λ ν΄λ΄μΌνλ€!!!
μ€λμ μν μ
- μλ‘μ΄ κ²(vanilla extract, ts component)μ μλν κ²
- μ΄μ¬ν 곡μλ¬Έμ 보면μ λλκ±°λ €λ³Έ κ²
- κ·Έλ¦¬κ³ κ²°κ΅μ ν΄κ²°ν κ²!!!
μ€λμ μμ¬μ΄ μ
- λκ° νλ‘μ νΈ μ§λ μ체λ λ§μ΄ λͺ» λκ° κ² (γ γ )