指南

Scss 模块导入方式

了解 Scss 中 @import、@use 和 @forward 的使用方法及实战结构建议,帮助你更好地管理样式代码。

🎯 引言

学会这篇文章后,你能够理解并使用 Scss 模块化导入的新方式,避免使用已废弃的 @import,掌握 @use 和 @forward 的用法,提升样式代码的可维护性和复用性。通过实战结构建议,让你的项目结构更清晰,效率更高。


🌀 @import(已废弃,仅提及历史原因)

过去我们写 Scss 时,经常用 @import 来导入其他样式文件,比如:

@import 'variables';
@import 'mixins';

这看起来很方便,但它其实有不少问题:

  • 导入的文件会被重复编译,导致样式冗余。
  • 无法控制命名空间,容易产生全局变量冲突。
  • 性能不佳,构建时间长。

因为这些原因,从 Sass 1.23.0 版本开始,官方宣布 @import 已经废弃,推荐改用更加现代的模块系统:@use@forward

如果你的项目还在使用 @import,建议尽快迁移,以免未来遇到兼容性问题。

🌟 @use 用法

@use 是 Sass 推荐的模块导入方式。它能够将一个 Scss 文件作为模块导入,并且默认启用命名空间,避免变量和混入冲突。

基本格式

@use '路径/文件名' as 命名空间;

例如:

@use 'variables' as vars;

body {
    color: vars.$main-color;
}

这里的 variables.scss 里定义了 $main-color,我们通过 vars.$main-color 来访问。

命名空间可以省略

如果你希望直接使用导入文件中的变量,可以用 as * 来省略命名空间:

@use 'variables' as *;

body {
    color: $main-color;
}

但要注意,这样可能会导致命名冲突,尤其是在大型项目中不推荐。

@use 的特点

  • 默认启用命名空间,防止冲突。
  • 只能导入一次,避免重复导入。
  • 支持传参给模块(参数化模块)。
  • 模块中的内容默认是私有的,只有通过 @forward 或公开变量才能暴露。

例子:传参给模块

theme.scss 文件:

$color: blue !default;

body {
    background-color: $color;
}

主文件导入时传参:

@use 'theme' with (
    $color: red
);

这样可以灵活修改模块中的默认变量。


🚀 @forward 用法

@forward 是 Sass 提供的模块系统的一部分,用来转发模块内容。这在构建样式库或整理多个 Sass 文件时特别有用。

举个例子:

你有很多小模块:

  • _variables.scss
  • _mixins.scss
  • _functions.scss

你可以创建一个统一的出口文件(比如 index.scss)

index.scss
@forward 'variables';
@forward 'mixins';
@forward 'functions';

然后,在你的主样式文件中只需要这样导入:

@use 'index' as *;

这样就能一次性使用所有导出的变量和混入,非常方便。

@forward 的作用

  • 重新导出模块内容。
  • 可以重命名导出的变量或混入。
  • 可以隐藏不需要公开的变量。

重命名示例

variables.scss
$color-primary: blue;
index.scss
@forward 'variables' as vars-*;
main.scss
@use 'index' as *;

body {
    color: vars-color-primary; // 而不是 $color-primary
}

导入后,所有变量都会加上 vars- 前缀,防止冲突。

隐藏内容(不导出)

你可以在模块里用 @forward 的 hide 选项:

@forward 'variables' hide $internal-var;

这样外部模块就不能访问 $internal-var 这个变量了。


🏗️ 实战结构建议

组织 Scss 文件结构时,推荐遵循以下思路:

  1. 基础样式放 _variables.scss, _mixins.scss, _functions.scss 中,定义颜色、字体、工具函数等。
  2. 使用一个 _index.scss 作为聚合文件,使用 @forward 把基础模块集中导出。
  3. 组件样式单独建立文件夹,每个组件一个文件,里面使用 @use 'index' as *; 引入基础样式。

示例目录结构:


scss/
├── base/
│ ├── \_variables.scss
│ ├── \_mixins.scss
│ ├── \_functions.scss
│ └── \_index.scss
├── components/
│ ├── \_button.scss
│ └── \_card.scss
└── main.scss

_index.scss 内容:

@forward 'variables';
@forward 'mixins';
@forward 'functions';

_button.scss 内容:

@use '../base/index' as *;

.button {
    background-color: $primary-color;
    @include flex-center;
}

main.scss 内容:

@use 'base/index' as *;
@use 'components/button';
@use 'components/card';

如果你的项目很小,且只涉及少量样式,也可以不使用 @forward,但随着项目变大,合理使用 @forward 能极大提升维护效率。

🧾 小节总结

  • Scss 的 @import 已废弃,推荐使用 @use@forward
  • @use 导入文件并默认启用命名空间,防止全局变量冲突。
  • @forward 用于转发模块,方便管理和统一导入。
  • 合理组织 Scss 文件结构,提高代码复用性和维护性。

❓ 知识问答(Q&A)

Q:为什么不推荐继续使用 @import

A:@import 会重复编译样式,导致性能问题和变量冲突,且已经被废弃,不再更新维护。

Q:如何让 @use 导入的模块变量不加命名空间直接使用?

A:可以使用 as * 语法,但不建议这么做,因为容易引起命名冲突。

Q:@forward@use 有什么区别?

A:@use 是导入模块,@forward 是重新导出模块。@forward 主要用于构建模块的聚合层。


🧪 小练习

  1. 在一个新的 Scss 项目中,写一个 _variables.scss 定义主颜色 $main-color: #3498db;,然后用 @use 导入,并在 body 里应用这个颜色背景。
variables.scss
$main-color: #3498db;
style.scss
@use 'variables' as vars;

body {
    background-color: vars.$main-color;
}
  1. 创建一个 _index.scss 文件,使用 @forward 导出 _variables.scss 和一个自定义 _mixins.scss,然后在主文件里用 @use 导入 _index.scss 并应用混入。
_variables.scss
$primary-color: #e74c3c;
_mixins.scss
@mixin center {
    display: flex;
    justify-content: center;
    align-items: center;
}
index.scss
@forward 'variables';
@forward 'mixins';
style.scss
@use 'index' as *;

.container {
    @include center;
    background-color: $primary-color;
}

🎉 恭喜你已经掌握 Scss 中 @import(了解废弃原因)、@use@forward 以及实战结构组织技能啦!通过这些现代模块化技巧,你的前端样式代码会变得更加规范、高效、易维护。