Sass 模块化 #
什么是模块化? #
模块化是将 Sass 代码拆分成多个小文件,按功能或组件组织,然后通过导入语句组合在一起。这种方式提高了代码的可维护性和复用性。
text
styles/
├── abstracts/
│ ├── _variables.scss
│ ├── _mixins.scss
│ └── _functions.scss
├── base/
│ ├── _reset.scss
│ └── _typography.scss
├── components/
│ ├── _buttons.scss
│ └── _cards.scss
└── main.scss
部分文件(Partials) #
命名规则 #
以下划线 _ 开头的文件称为部分文件,Sass 不会单独编译它们:
text
_variables.scss → 部分文件,不单独编译
mixins.scss → 普通文件,会单独编译
导入时省略下划线 #
scss
// 导入 _variables.scss
@use 'variables'; // 省略下划线和扩展名
@import(旧语法) #
基本用法 #
scss
// 导入单个文件
@import 'variables';
// 导入多个文件
@import 'variables', 'mixins', 'functions';
// 导入目录下所有文件
@import 'components/*';
@import 的问题 #
| 问题 | 说明 |
|---|---|
| 无命名空间 | 容易造成变量冲突 |
| 重复导入 | 同一文件可能被多次加载 |
| 无私有成员 | 所有内容都是公开的 |
| 已弃用 | 官方推荐使用 @use |
@use(新语法,推荐) #
基本用法 #
scss
// _variables.scss
$primary-color: #3498db;
$secondary-color: #2ecc71;
// main.scss
@use 'variables';
.button {
background-color: variables.$primary-color;
}
命名空间 #
@use 默认使用文件名作为命名空间:
scss
@use 'variables';
@use 'mixins';
@use 'functions';
.container {
color: variables.$primary-color;
@include mixins.flex-center;
width: functions.calculate-width(100);
}
自定义命名空间 #
scss
@use 'variables' as v;
@use 'mixins' as m;
.container {
color: v.$primary-color;
@include m.flex-center;
}
无命名空间 #
scss
@use 'variables' as *;
.container {
color: $primary-color; // 直接使用,无需命名空间
}
私有成员 #
以 - 或 _ 开头的成员是私有的:
scss
// _variables.scss
$-private-var: red; // 私有变量
$public-var: blue; // 公开变量
@function -helper() { // 私有函数
@return red;
}
@function get-color() { // 公开函数
@return $public-var;
}
配置模块变量 #
使用 with 配置模块的默认变量:
scss
// _variables.scss
$primary-color: #3498db !default;
$secondary-color: #2ecc71 !default;
// main.scss
@use 'variables' with (
$primary-color: #e74c3c,
$secondary-color: #9b59b6
);
完整示例 #
scss
// _variables.scss
$colors: (
primary: #3498db,
secondary: #2ecc71
) !default;
// _mixins.scss
@mixin button-base {
display: inline-block;
padding: 10px 20px;
border: none;
cursor: pointer;
}
// _buttons.scss
@use 'variables' as v;
.button {
@include button-base;
background-color: map-get(v.$colors, primary);
}
// main.scss
@use 'variables';
@use 'mixins';
@use 'buttons';
@forward(转发模块) #
基本用法 #
@forward 用于创建模块索引,转发其他模块的内容:
scss
// abstracts/_index.scss
@forward 'variables';
@forward 'mixins';
@forward 'functions';
// main.scss
@use 'abstracts';
.container {
color: abstracts.$primary-color;
}
添加前缀 #
scss
// abstracts/_index.scss
@forward 'variables' as var-*;
@forward 'mixins' as mx-*;
// main.scss
@use 'abstracts';
.container {
color: abstracts.$var-primary-color;
@include abstracts.mx-flex-center;
}
选择性转发 #
scss
// 只转发特定成员
@forward 'variables' show $primary-color, $secondary-color;
// 隐藏特定成员
@forward 'variables' hide $internal-var;
转发时配置 #
scss
// abstracts/_index.scss
@forward 'variables' with (
$primary-color: #e74c3c
);
// main.scss
@use 'abstracts';
模块组织结构 #
7-1 模式 #
text
sass/
│
├── abstracts/
│ ├── _index.scss # 转发所有抽象层
│ ├── _variables.scss # 变量
│ ├── _mixins.scss # 混合宏
│ └── _functions.scss # 函数
│
├── base/
│ ├── _index.scss
│ ├── _reset.scss # 重置样式
│ ├── _typography.scss # 排版
│ └── _base.scss # 基础样式
│
├── components/
│ ├── _index.scss
│ ├── _buttons.scss # 按钮
│ ├── _cards.scss # 卡片
│ ├── _forms.scss # 表单
│ └── _navbar.scss # 导航栏
│
├── layout/
│ ├── _index.scss
│ ├── _header.scss # 页头
│ ├── _footer.scss # 页脚
│ ├── _sidebar.scss # 侧边栏
│ └── _grid.scss # 网格
│
├── pages/
│ ├── _index.scss
│ ├── _home.scss # 首页
│ ├── _about.scss # 关于页
│ └── _contact.scss # 联系页
│
├── themes/
│ ├── _index.scss
│ ├── _default.scss # 默认主题
│ └── _dark.scss # 暗色主题
│
├── vendors/
│ ├── _index.scss
│ └── _normalize.scss # 第三方库
│
└── main.scss # 主文件
主文件结构 #
scss
// main.scss
// 1. 配置和抽象层
@use 'abstracts';
// 2. 基础样式
@use 'base';
// 3. 布局
@use 'layout';
// 4. 组件
@use 'components';
// 5. 页面
@use 'pages';
// 6. 主题
@use 'themes';
// 7. 第三方
@use 'vendors';
抽象层索引文件 #
scss
// abstracts/_index.scss
@forward 'variables';
@forward 'mixins';
@forward 'functions';
// 或者使用 show/hide 控制导出
@forward 'variables' show $primary-color, $secondary-color;
@forward 'mixins' show flex-center, button-variant;
@forward 'functions' show calculate-rem, get-color;
实际应用示例 #
创建设计系统 #
scss
// design-tokens/_colors.scss
$colors: (
primary: (
base: #3498db,
light: #5dade2,
dark: #2980b9
),
secondary: (
base: #2ecc71,
light: #58d68d,
dark: #27ae60
),
neutral: (
white: #ffffff,
light: #f5f5f5,
base: #333333,
dark: #1a1a1a
)
) !default;
// design-tokens/_spacing.scss
$spacing: (
xs: 4px,
sm: 8px,
md: 16px,
lg: 24px,
xl: 32px,
xxl: 48px
) !default;
// design-tokens/_index.scss
@forward 'colors';
@forward 'spacing';
@forward 'typography';
@forward 'breakpoints';
// main.scss
@use 'design-tokens' as tokens;
.container {
padding: map-get(tokens.$spacing, md);
color: map-get(tokens.$colors, neutral, base);
}
组件库结构 #
scss
// components/_index.scss
@forward 'buttons';
@forward 'cards';
@forward 'forms';
@forward 'modals';
@forward 'navigation';
// components/_buttons.scss
@use '../abstracts' as *;
.button {
display: inline-block;
padding: $spacing-sm $spacing-md;
border: none;
border-radius: $border-radius;
cursor: pointer;
&--primary {
background-color: map-get($colors, primary, base);
color: white;
}
&--secondary {
background-color: map-get($colors, secondary, base);
color: white;
}
}
@import 与 @use 迁移 #
迁移前 #
scss
// 旧代码
@import 'variables';
@import 'mixins';
.button {
color: $primary-color;
@include flex-center;
}
迁移后 #
scss
// 新代码
@use 'variables';
@use 'mixins';
.button {
color: variables.$primary-color;
@include mixins.flex-center;
}
迁移工具 #
bash
# 使用 Sass 官方迁移工具
npm install -g sass-migrator
# 迁移 @import 到 @use
sass-migrator module --migrate-deps styles/
最佳实践 #
1. 使用索引文件 #
scss
// 好:使用索引文件统一导出
// components/_index.scss
@forward 'buttons';
@forward 'cards';
// main.scss
@use 'components';
// 不好:在主文件中逐个导入
@use 'components/buttons';
@use 'components/cards';
2. 合理使用命名空间 #
scss
// 好:简短清晰的命名空间
@use 'abstracts/variables' as v;
@use 'abstracts/mixins' as m;
// 不好:命名空间过长
@use 'abstracts/variables' as variables;
3. 保持模块职责单一 #
scss
// 好:每个文件职责单一
// _variables.scss - 只定义变量
// _mixins.scss - 只定义混合宏
// _functions.scss - 只定义函数
// 不好:一个文件包含所有内容
// _utils.scss - 变量、混合宏、函数混在一起
4. 使用 @forward 创建 API #
scss
// abstracts/_index.scss
// 只公开需要的成员
@forward 'variables' show $primary-color, $secondary-color;
@forward 'mixins' show flex-center, button-variant;
@forward 'functions' show get-color;
下一步 #
掌握了模块化后,继续学习 混合宏,创建可复用的样式片段!
最后更新:2026-03-28