[SCSS] @import πŸ‘‰ @use둜 λ³€κ²½ν•˜κΈ°

jellykellyΒ·2025λ…„ 1μ›” 21일
1

style

λͺ©λ‘ 보기
2/2
post-thumbnail

⚠️ As of Dart Sass 1.80.0, the @import rule is deprecated and will be removed from the language in Dart Sass 3.0.0. Prefer the @use rule instead.

SCSS의 @importλŠ” Dart Sass 1.80.0 버전뢀터 μ‚¬μš©μ΄ μ€‘λ‹¨λ˜μ—ˆμœΌλ©°, Dart Sass 3.0.0μ—μ„œλŠ” μ™„μ „νžˆ 제거될 μ˜ˆμ •μž…λ‹ˆλ‹€. 이에 따라 @importλ₯Ό @use둜 λ³€κ²½ν•˜λŠ” 것이 ꢌμž₯λ©λ‹ˆλ‹€. @use의 μž₯점과 μ‚¬μš©λ²•, 그리고 κΈ°μ‘΄ ν”„λ‘œμ νŠΈλ₯Ό μ–΄λ–»κ²Œ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ν•  수 μžˆλŠ”μ§€ μžμ„Ένžˆ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

@use의 νŠΉμ§• 및 μœ„μΉ˜ κ·œμΉ™

@useλŠ” SCSS 파일 μ΅œμƒλ‹¨μ— μœ„μΉ˜ν•΄μ•Ό ν•˜λ©°, λ‹€λ₯Έ κ·œμΉ™λ³΄λ‹€ λ¨Όμ € μž‘μ„±λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

@import '/src/mixin.scss';
@use '/src/btn.scss';

// Error: @use rules must be written before any other rules.

μœ„ μ˜ˆμ‹œμ²˜λŸΌ @useκ°€ λ‹€λ₯Έ κ·œμΉ™ 이후에 μž‘μ„±λ˜λ©΄ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

@import와 @use의 차이점

@import와 @use의 μ£Όμš” 차이점은 곡식 λ¬Έμ„œμ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€

  • λ„€μž„μŠ€νŽ˜μ΄μŠ€ 관리: @useλŠ” λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό 톡해 λ‹€λ₯Έ νŒŒμΌμ—μ„œ μ •μ˜λœ λ³€μˆ˜, 믹슀인 등을 λͺ…μ‹œμ μœΌλ‘œ μ°Έμ‘°ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • 쀑볡 λ°©μ§€: λ™μΌν•œ 파일이 μ—¬λŸ¬ 번 ν¬ν•¨λ˜λŠ” 것을 λ°©μ§€ν•˜μ—¬ μ„±λŠ₯ ν–₯상을 도λͺ¨ν•©λ‹ˆλ‹€.
// @import μ˜ˆμ‹œ: 쀑볡 λ‘œλ“œ
@import 'variables';
@import 'variables'; // 같은 파일이 두 번 λ‘œλ“œλ¨

// @use μ˜ˆμ‹œ: 쀑볡 λ‘œλ“œ λ°©μ§€
@use 'variables';
@use 'variables'; // ν•œ 번만 λ‘œλ“œλ¨

폴더 ꡬ쑰 λ³€κ²½ν•˜κΈ°

SCSS ꡬ쑰λ₯Ό μ •λ¦¬ν•˜μ—¬ @useλ₯Ό 효율적으둜 ν™œμš©ν•  수 μžˆλ„λ‘ 폴더 ꡬ쑰λ₯Ό κ°œνŽΈν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.
κ΅¬μ‘°λŠ” kliemann의 ν¬μŠ€νŒ…μ„ μ°Έκ³ ν–ˆμŠ΅λ‹ˆλ‹€.

AS-IS

scss/
β”œβ”€β”€ abstracts/
β”‚   β”œβ”€β”€ _functions.scss
β”‚   β”œβ”€β”€ _mixins.scss
β”‚   └── _variables.scss
β”œβ”€β”€ base/
β”‚   β”œβ”€β”€ _reset.scss
β”‚   └── _common.scss
β”œβ”€β”€ components/
β”‚   β”œβ”€β”€ _input.scss
β”‚   β”œβ”€β”€ _badge.scss
β”‚   └── _button.scss
β”œβ”€β”€ layout/
β”‚   β”œβ”€β”€ _layout.scss
β”‚   β”œβ”€β”€ modal.scss
β”‚   β”œβ”€β”€ header.scss
β”‚   └── footer.scss
β”œβ”€β”€ pages/
β”‚   β”œβ”€β”€ login.scss
β”‚   └── user.scss
└── style.scss

νŠΉμ • μ»΄ν¬λ„ŒνŠΈ ν˜Ήμ€ νŽ˜μ΄μ§€μ—μ„œλ§Œ μ“°μ΄λŠ” header.scss와 같은 νŒŒμΌμ„ μ œμ™Έν•œ 곡톡 μŠ€νƒ€μΌ νŒŒμΌμ„ style.scss에 import ν–ˆμŠ΅λ‹ˆλ‹€.

// style.scss
@import 'abstracts/mixin', 'abstracts/variables';
@import 'base/reset', 'base/common';
@import 'components/btn', 'components/input', 'components/badge';
@import 'layout/layout';

그럼 기쑴에 @import둜 뢈러온 곡톡 μŠ€νƒ€μΌ νŒŒμΌμ„ @use둜 λ³€κ²½ν•΄λ΄…λ‹ˆλ‹€.

// style.scss
@use '@css/abstracts/mixin';
@use '@css/abstracts/variables';
@use '@css/base/reset';
@use '@css/base/common';
@use '@css/components/input';
@use '@css/components/badge';
@use '@css/components/button';
@use '@css/layout/layout';

μ΄λ ‡κ²Œ κΈΈμ–΄μ§„ μ΄μœ λŠ”!
@useλŠ” ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ 파일만 κ°€μ Έμ˜€λŠ” κ·œμΉ™μ„ μ μš©ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

Each @use rule can only have one URL.

TO-BE

@use와 @forwardλ₯Ό ν™œμš©ν•˜κΈ° μœ„ν•΄ 각 폴더에 _index.scss νŒŒμΌμ„ μΆ”κ°€ν•©λ‹ˆλ‹€.

scss/
β”œβ”€β”€ abstracts/
β”‚   β”œβ”€β”€ _index.scss  
β”‚   β”œβ”€β”€ _functions.scss
β”‚   β”œβ”€β”€ _mixins.scss
β”‚   └── _variables.scss
β”œβ”€β”€ base/
β”‚   β”œβ”€β”€ _index.scss
β”‚   β”œβ”€β”€ _reset.scss
β”‚   └── _common.scss
β”œβ”€β”€ components/
β”‚   β”œβ”€β”€ _index.scss
β”‚   β”œβ”€β”€ _input.scss
β”‚   β”œβ”€β”€ _badge.scss
β”‚   └── _button.scss
β”œβ”€β”€ layout/
β”‚   β”œβ”€β”€ _layout.scss
β”‚   β”œβ”€β”€ modal.scss
β”‚   β”œβ”€β”€ header.scss
β”‚   └── footer.scss
β”œβ”€β”€ pages/
β”‚   β”œβ”€β”€ login.scss
β”‚   └── user.scss
└── style.scss

νŒŒμΌμ„ ν•œ λ²ˆμ— λ¬Άμ–΄μ„œ 뢈러였기 μœ„ν•΄, 각 폴더에 _index.scssνŒŒμΌμ„ μΆ”κ°€ν•˜κ³  @forward둜 ν•„μš”ν•œ νŒŒμΌμ„ λ‚΄λ³΄λƒ…λ‹ˆλ‹€.

// abstracts/_index.scss
@forward 'variables';
@forward 'mixins';
@forward 'functions';

파일λͺ…을 _index.scss둜 μ§€μ •ν•˜λ©΄, 폴더λͺ…을 파일λͺ…μœΌλ‘œ μ‚¬μš© κ°€λŠ₯ν•©λ‹ˆλ‹€. 이제 style.scssνŒŒμΌμ„ μ΄λ ‡κ²Œ 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€.

// style.scss
@use '@css/abstracts';
@use '@css/base';
@use '@css/components';
@use '@css/layout/layout'; // layout ν΄λ”μ—λŠ” κ³΅ν†΅μœΌλ‘œ importν•  파일이 layout.scss ν•˜λ‚˜λΌμ„œ λ”°λ‘œ index 파일 μž‘μ„±ν•˜μ§€ μ•ŠμŒ

λ³€μˆ˜ 및 믹슀인 μ°Έμ‘°

@useλ₯Ό μ‚¬μš©ν•  λ•ŒλŠ” λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό ν™œμš©ν•΄ λͺ…μ‹œμ μœΌλ‘œ μ°Έμ‘°ν•΄μ•Ό ν•©λ‹ˆλ‹€.

// _variables.scss
$c-white: #ffffff;
$c-primary: #002b5c;


// _footer.scss
@use '@css/abstracts'; // λ„€μž„μŠ€νŽ˜μ΄μŠ€ μ‚¬μš©

------
<λ„€μž„μŠ€νŽ˜μ΄μŠ€>.[λ³€μˆ˜]둜 μž‘μ„±
------
.footer {
  color: abstracts.$c-white;
  background-color: abstracts.$c-primary;
}

// λ„€μž„μŠ€νŽ˜μ΄μŠ€ 별칭 μ‚¬μš©
@use '@css/abstracts' as abs;

.footer {
  color: abs.$c-white;
  background-color: abs.$c-primary;
}

// λ„€μž„μŠ€νŽ˜μ΄μŠ€ μƒλž΅
@use '@css/abstracts' as *;

.footer {
  color: $c-white;
  background-color: $c-primary;
}

vite.config.js μ„€μ •ν•˜κΈ°

μœ„μ˜ μ˜ˆμ‹œμ™€ 같이 κ³΅ν†΅μ μœΌλ‘œ μ‚¬μš© 될 λ³€μˆ˜λŠ” 일일히 λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό λͺ…μ‹œν•˜λŠ”κ²ƒ 보닀 μ „μ—­μ μœΌλ‘œ μ‚¬μš©ν•˜λŠ”κ²ƒμ΄ 합리적일 수 μžˆμŠ΅λ‹ˆλ‹€. (μ΄μ „ν¬μŠ€νŒ…)


// vite.config.js
export default defineConfig({
  css: {
    preprocessorOptions: {
      scss: {
        additionalData: `
            @use '@css/abstracts' as *;
        `,
      },
    },
  },
});

additionalData μ˜΅μ…˜μ„ μ‚¬μš©ν•΄ abstracts νŒŒμΌμ„ μ „μ—­μœΌλ‘œ 뢈러였면, λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό μƒλž΅ν•˜κ³ λ„ SCSS λ³€μˆ˜ 및 λ―ΉμŠ€μΈμ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ λ„ˆλ¬΄ λ§Žμ€ νŒŒμΌμ— as *λ₯Ό μ“°λŠ” 것은 λͺ¨λ“ˆν™”μ˜ μž₯점을 μ•½ν™”μ‹œν‚¬ 수 μžˆμœΌλ‹ˆ ν•„μš”ν•œ κ³³μ—λ§Œ μ‹ μ€‘νžˆ μ‚¬μš©ν•˜λŠ” 게 μ’‹μŠ΅λ‹ˆλ‹€.

profile
Hawaiian pizza with extra pineapples please! πŸ₯€

0개의 λŒ“κΈ€