Sass / SCSS
最成熟、最强大的专业级 CSS 预处理器之一
Sass 和 SCSS 为 CSS 提供变量、嵌套、混入、模块系统等高级能力,长期是大型样式工程的主流基础设施。
Sass / SCSS
世界上最成熟、最强大的专业级 CSS 预处理器,拥有丰富的变量、嵌套、混入(Mixin)等高级特性。
技术简介说明
Sass(Syntactically Awesome StyleSheets)由 Hampton Catlin 于 2006 年设计开发,是世界上最先出现的 CSS 预处理器之一。它为 CSS 添加了编程语言的能力,包括变量、嵌套、混入(Mixin)、选择器继承、条件语句和循环等特性,极大提升了样式代码的可维护性和复用性。Sass 由 Ruby 实现,后迁移至 Dart 语言(Dart Sass)。
Sass 提供两种语法格式:缩进语法(.sass,使用缩进和换行代替花括号与分号)和 SCSS 语法(.scss,完全兼容 CSS 的花括号和分号语法)。由于 SCSS 语法与 CSS 完全兼容,且对 IDE 支持更好,SCSS 已成为社区中主流的选择。Sass 经过近 20 年的发展,已成为前端工程化中不可或缺的基础工具。
Sass 在 2024 年推出了 1.80 版本引入了新的模块系统 @use 作为 @import 的替代品,并计划在 2.0.0 版本中完全废弃 @import。Sass 2.0.0 的路线图包括移除旧模块系统、改进内置函数、移除无括号 URL 解析等破坏性变更。
基本信息
| 项目 | 说明 |
|---|---|
| 官网 | https://sass-lang.com |
| GitHub | https://github.com/sass/sass |
| License | MIT |
| 最新版本 | 1.89.2(2025 年 4 月发布);2.0.0-alpha 开发中 |
| 主要维护者 | Google Chrome 团队、Sass Core Team(Natalie Weizenbaum 等) |
| 实现语言 | Dart(Dart Sass) |
| npm 包名 | sass(替代旧的 node-sass) |
快速上手
安装
# 使用 npm 安装(推荐)
npm install -D sass
# 使用 pnpm 安装
pnpm add -D sass
# 使用 yarn 安装
yarn add -D sass
# 全局安装 CLI
npm install -g sass⚠️ 注意:
node-sass已被废弃,官方推荐使用sass(即 Dart Sass)。node-sass依赖本地 Node.js 编译,存在兼容性问题。
基础配置
独立使用 CLI
# 编译单个文件
sass input.scss output.css
# 监听文件变化
sass --watch input.scss output.css
# 压缩输出
sass --style=compressed input.scss output.css
# 编译整个目录
sass --watch src/styles:dist/stylesVite 集成(零配置)
# Vite 内置支持 SCSS,只需安装 sass
pnpm add -D sass// vite.config.js(可选自定义配置)
import { defineConfig } from 'vite'
export default defineConfig({
css: {
preprocessorOptions: {
scss: {
additionalData: `@use "src/styles/variables" as *;`,
api: 'modern-compiler', // Vite 5.4+ 支持
},
},
},
})Webpack 集成
pnpm add -D sass sass-loader// webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.scss$/,
use: [
'style-loader',
'css-loader',
{
loader: 'sass-loader',
options: {
api: 'modern',
implementation: require('sass'),
},
},
],
},
],
},
}最小示例
// variables.scss
$primary-color: #3498db;
$font-stack: 'Helvetica Neue', Arial, sans-serif;
$spacing-unit: 8px;
// 嵌套语法
.nav {
background-color: $primary-color;
font-family: $font-stack;
// 父选择器引用
&__item {
padding: $spacing-unit * 2;
color: white;
&:hover {
color: lighten($primary-color, 20%);
}
&--active {
font-weight: bold;
border-bottom: 2px solid white;
}
}
}
// Mixin
@mixin responsive($breakpoint) {
@if $breakpoint == mobile {
@media (max-width: 768px) { @content; }
} @else if $breakpoint == tablet {
@media (max-width: 1024px) { @content; }
}
}
.card {
padding: $spacing-unit * 3;
@include responsive(mobile) {
padding: $spacing-unit;
}
}核心概念与架构
模块系统
Sass 从 1.23 版本开始引入 @use 和 @forward 模块系统,替代原有的 @import:
@use:加载其他 Sass 文件作为模块,带有命名空间,避免全局变量污染@forward:转发模块规则,构建公开 API@import(已废弃):全局导入,无命名空间,存在命名冲突风险
编译模型
Sass 是 编译时预处理器,在构建阶段将 .scss/.sass 文件编译为标准 CSS。Sass 不提供运行时能力,编译后的 CSS 不包含任何 Sass 特有语法。
实现架构
- Dart Sass:官方主推实现,纯 Dart 编写,可编译为 JavaScript 或直接运行
- LibSass:C/C++ 实现,已停止维护(deprecated)
- Ruby Sass:最初的 Ruby 实现,已停止维护
核心特性
1. 变量(Variables)
$primary: #3498db;
$font-size-base: 16px;
.button {
color: $primary;
font-size: $font-size-base;
}支持多种数据类型:字符串、数字、颜色、列表、映射、布尔值、null。
2. 嵌套(Nesting)
.container {
max-width: 1200px;
.header {
display: flex;
align-items: center;
// 父选择器引用
&:hover {
background: rgba(0, 0, 0, 0.1);
}
// 属性嵌套
font: {
family: 'Arial', sans-serif;
size: 14px;
weight: bold;
}
}
}3. 混入(Mixins)
// 带参数的 Mixin
@mixin flex-center($direction: row) {
display: flex;
flex-direction: $direction;
justify-content: center;
align-items: center;
}
// 使用 Mixin
.modal {
@include flex-center(column);
}
// 带可选参数的 Mixin
@mixin button-variant($bg, $color: white, $radius: 4px) {
background: $bg;
color: $color;
border-radius: $radius;
}4. 继承/扩展(@extend)
%button-base {
padding: 8px 16px;
border: none;
cursor: pointer;
}
.btn-primary {
@extend %button-base;
background: #3498db;
}
.btn-danger {
@extend %button-base;
background: #e74c3c;
}5. 条件语句
@mixin theme($theme) {
@if $theme == dark {
background: #333;
color: white;
} @else if $theme == light {
background: white;
color: #333;
} @else {
@error "Unknown theme: #{$theme}";
}
}6. 循环
// @for 循环
@for $i from 1 through 4 {
.col-#{$i} {
width: 25% * $i;
}
}
// @each 循环
$sizes: (sm: 12px, md: 16px, lg: 24px);
@each $name, $size in $sizes {
.text-#{$name} {
font-size: $size;
}
}
// @while 循环
$i: 6;
@while $i > 0 {
.h#{$i} { font-size: 12px + $i * 2; }
$i: $i - 1;
}7. 数学运算
$base-size: 16px;
.container {
width: 100% - 20px;
padding: $base-size / 2;
margin: 10px + 5px;
}8. 内置函数
// 颜色函数
$lighter: lighten(#3498db, 20%);
$darker: darken(#3498db, 20%);
$transparent: rgba(#3498db, 0.5);
$mix-color: mix(#3498db, #e74c3c, 50%);
// 字符串函数
$str: to-upper-case('hello');
$joined: join('hello', 'world', '-');
// 列表和映射
$list-length: length(1px 2px 3px); // 3
$map-get: map-get((sm: 12px, md: 16px), md); // 16px
// 选择器函数
$selector: selector-nest('.parent', '.child');9. 部分文件与模块系统
// _variables.scss(部分文件,以下划线开头)
$primary: #3498db;
$secondary: #2ecc71;
// _mixins.scss
@mixin respond-to($breakpoint) {
@if $breakpoint == 'mobile' {
@media (max-width: 768px) { @content; }
}
}
// main.scss
@use 'variables' as *;
@use 'mixins' as *;
.button {
color: $primary;
@include respond-to('mobile') {
width: 100%;
}
}10. @forward 模块转发
// _framework.scss
@forward 'variables';
@forward 'mixins';
@forward 'functions';
// 消费者只需
@use 'framework';
// 即可访问所有转发的成员生态图
Sass 生态系统
├── 核心实现
│ ├── Dart Sass(官方主推,纯 Dart)
│ ├── LibSass(已废弃,C/C++ 实现)
│ └── Ruby Sass(已废弃,Ruby 实现)
├── 构建工具集成
│ ├── Vite(内置支持)
│ ├── webpack(sass-loader)
│ ├── Gulp(gulp-sass)
│ ├── Parcel(内置支持)
│ └── Turbopack(内置支持)
├── 框架集成
│ ├── Next.js(内置支持)
│ ├── Nuxt(内置支持)
│ ├── Angular(内置支持)
│ ├── Vue(vue-loader 内置支持)
│ └── Svelte(svelte-preprocess)
├── IDE 支持
│ ├── VS Code(内置 SCSS 语法高亮)
│ ├── WebStorm(内置支持)
│ └── Prettier(@prettier/plugin-scss)
├── 社区工具
│ ├── Stylelint(SCSS 插件)
│ ├── sass-migrator(模块迁移工具)
│ └── compass(已废弃,Sass 框架)
└── 社区生态
├── Stack Overflow(350k+ Sass 问题)
├── Sass Guidelines(Hugo Giraudel)
└── Sass News(官方博客)
适用场景
1. 大型项目样式架构
适合需要严格组织 CSS 结构的大型项目。通过模块系统、变量、Mixin 实现设计系统级别的一致性。
2. 设计令牌(Design Tokens)管理
使用变量和映射管理颜色、间距、字体等设计令牌,实现主题切换和品牌一致性。
$themes: (
light: (
bg: #ffffff,
text: #333333,
primary: #3498db,
),
dark: (
bg: #1a1a1a,
text: #ffffff,
primary: #5dade2,
),
);3. 响应式设计系统
通过 Mixin 封装媒体查询断点,实现可复用的响应式模式。
4. UI 组件库开发
许多知名 UI 库使用 Sass 构建,如 Bootstrap、Foundation 等。Mixin 和继承机制适合构建参数化组件。
5. 遗留项目维护
大量遗留项目使用 Sass 编写,需要持续维护和迭代。
6. 静态站点生成
与 Hugo、Jekyll、Hexo 等静态站点生成器良好集成,适合博客、文档站点等场景。
7. 团队样式规范统一
通过统一的变量和 Mixin 库,保证团队成员编写一致的样式代码。
开发与工程化
目录结构推荐
src/
├── styles/
│ ├── _variables.scss // 设计令牌
│ ├── _mixins.scss // 通用 Mixin
│ ├── _functions.scss // 自定义函数
│ ├── _reset.scss // CSS Reset
│ ├── _typography.scss // 排版
│ ├── _utilities.scss // 工具类
│ ├── base/
│ │ ├── _buttons.scss
│ │ ├── _forms.scss
│ │ └── _tables.scss
│ ├── components/
│ │ ├── _card.scss
│ │ ├── _modal.scss
│ │ └── _nav.scss
│ ├── layouts/
│ │ ├── _header.scss
│ │ ├── _footer.scss
│ │ └── _sidebar.scss
│ ├── pages/
│ │ ├── _home.scss
│ │ └── _about.scss
│ └── main.scss // 入口文件
└── ...
CI/CD 集成
# GitHub Actions 示例
- name: Install dependencies
run: pnpm install
- name: Build CSS
run: pnpm sass --style=compressed src/styles/main.scss:dist/styles/main.css
- name: Lint SCSS
run: pnpm stylelint "src/**/*.scss"代码质量
- Stylelint:使用
stylelint-scss插件进行 SCSS 代码规范检查 - Prettier:配置
prettier-plugin-scss保持代码格式一致 - husky + lint-staged:提交前自动检查 SCSS 代码
性能与安全
性能特点
- Dart Sass 编译速度:比旧的
node-sass(LibSass)慢,但差距在缩小 - Vite 优化:Vite 5.4+ 支持
api: 'modern-compiler'模式,使用sass-embedded提升编译速度 20-30% - 缓存机制:构建工具通常缓存编译结果,增量编译提升开发体验
- 生产优化:
--style=compressed输出压缩 CSS,配合 cssnano 进一步优化
性能建议
- 避免深层嵌套(建议不超过 3-4 层),减少 CSS 选择器复杂度
- 合理使用
@extend,避免生成大量冗余选择器 - 部分文件(
_前缀)不会被独立编译,利用模块系统减少重复 - 大型项目考虑使用
sass-embedded替代纯 JavaScript 实现
安全注意事项
- 避免将用户输入直接拼接到 Sass 变量中,防止 CSS 注入
- 使用
@debug和@warn进行开发调试,生产环境移除 - 第三方 Sass 包需审查来源,避免恶意代码
技术对比
| 特性 | Sass/SCSS | Less | Stylus | PostCSS |
|---|---|---|---|---|
| 语法 | SCSS(CSS 超集)/ 缩进语法 | CSS 超集 | 灵活(可选括号/花括号) | 标准 CSS |
| 变量 | $var | @var | var 或 $var | 通过插件(CSS 自定义属性) |
| 嵌套 | ✅ 完整支持 | ✅ 支持 | ✅ 支持 | 通过插件(postcss-nested) |
| Mixin | ✅ @mixin + @include | ✅ .mixin() | ✅ 函数/Mixin | 通过插件 |
| 继承 | ✅ @extend | 不直接支持 | ✅ @extends | 通过插件 |
| 条件/循环 | ✅ @if/@for/@each | ✅ when 守卫 | ✅ 完整编程能力 | 通过插件 |
| 内置函数 | 丰富(颜色、字符串、列表、映射) | 较丰富 | 非常丰富 | 依赖插件生态 |
| 编译速度 | 中等(Dart Sass) | 快(JavaScript 原生) | 中等 | 快(AST 转换) |
| 社区规模 | 最大(npm 周下载 2000 万+) | 大(约 500-800 万) | 中等(约 100-200 万) | 极大(周下载 3000 万+) |
| 学习曲线 | 中等 | 低 | 中等 | 低(标准 CSS) |
| 框架支持 | 广泛(Bootstrap 等) | 广泛(Ant Design 等) | Vue 历史偏好 | 现代化工具链标配 |
| 模块系统 | ✅ @use/@forward | 无原生模块 | 无原生模块 | N/A(AST 工具) |
最佳实践
1. 使用现代模块系统
// ❌ 旧方式(已废弃)
@import 'variables';
@import 'mixins';
// ✅ 新方式
@use 'variables' as *;
@use 'mixins' as mixins;2. 迁移至 Sass 2.0
- 使用
sass-migrator工具自动迁移@import到@use - 关注
silence-deprecation选项处理过渡期警告 - 在
package.json中配置sassOptions控制废弃行为
3. 避免过度嵌套
// ❌ 过深嵌套
.page {
.container {
.header {
.nav {
.item {
.link { color: blue; }
}
}
}
}
}
// ✅ 扁平化 + BEM
.page-container { max-width: 1200px; }
.header-nav { display: flex; }
.header-nav__item { padding: 8px; }
.header-nav__link { color: blue; }4. 设计令牌管理
// _tokens.scss
$colors: (
'primary': (50: #eff6ff, 500: #3b82f6, 900: #1e3a8a),
'gray': (50: #f9fafb, 500: #6b7280, 900: #111827),
);
@function color($name, $shade: 500) {
@return map-get(map-get($colors, $name), $shade);
}5. 性能优化
- 使用
@use替代@import避免重复编译 - 合理使用
@extend或改用 Mixin - 生产环境启用
style: compressed - 避免在循环中生成大量选择器
技术局限与边界
已知限制
- 编译速度:Dart Sass 编译速度不如 LibSass(已废弃),大型项目可能有明显延迟
- 运行时缺失:纯编译时工具,不支持动态样式(需搭配 CSS 变量或 JavaScript)
- 浏览器特性:不处理浏览器前缀、不 polyfill 新 CSS 特性,需配合 PostCSS
- 模块系统过渡:
@import到@use的迁移需要时间和工具辅助 - 调试体验:Source Map 支持存在,但复杂项目的调试仍不够直观
不适用场景
- 需要运行时动态修改样式 → 使用 CSS 变量 + JavaScript 或 CSS-in-JS
- 需要自动添加浏览器前缀 → 搭配 PostCSS + Autoprefixer
- 纯组件化项目(如 CSS Modules、Tailwind) → 考虑更轻量的方案
- 追求零构建 → 考虑原生 CSS + 构建时工具
迁移注意事项
node-sass→sass(Dart Sass):API 基本兼容,注意@import废弃警告- Sass 1.x → 2.x:需关注破坏性变更,使用
sass-migrator工具 - 从 Less 迁移到 Sass:语法差异较小,主要是变量符号(
@→$)和 Mixin 语法
学习资源
官方资源
- Sass 官方文档 - 最权威的参考
- Sass 官方教程 - 入门指南
- Sass 2.0 路线图 - 未来规划
- Sass Migrator 工具 - 模块迁移
教程与书籍
- Sass Guidelines - Hugo Giraudel 的 Sass 最佳实践
- The Sass Way(存档) - 社区教程
- Sass for Web Designers(A Book Apart) - 经典入门书
- CSS Wizardry(Harry Roberts) - BEM + Sass 架构实践
社区资源
- Stack Overflow #sass - 350k+ 问答
- Reddit r/Sass - 社区讨论
- Sass Discord - 实时交流
- Sass News 博客 - 官方动态
- GitHub Discussions - 技术讨论
中文资源
- Sass 中文网 - 中文文档镜像
- Sass 入门教程 - 阮一峰 - 经典中文教程
2026 年现状
版本状态
- 稳定版:Sass 1.89.2(2025 年 4 月),持续维护更新
- 开发版:Sass 2.0.0-alpha 正在开发中,包含破坏性变更
发展趋势
- 模块系统迁移:社区正从
@import向@use/@forward过渡,Sass 2.0 将完成这一迁移 - 嵌入式编译器:
sass-embedded(基于 Dart 的嵌入式编译器)成为性能优选,Vite、webpack 等工具逐步支持 - 原生 CSS 功能竞争:CSS 原生嵌套、变量等特性逐步普及,但 Sass 的编程逻辑(Mixin、循环、条件)仍不可替代
- 与 Tailwind CSS 共存:Tailwind CSS 兴起改变了样式方案选择,但 Sass 在复杂逻辑和组件库场景中仍有优势
社区活跃度
- npm 周下载量 2000 万+,是 CSS 预处理器中使用最广泛的
- GitHub 30k+ stars,持续活跃
- Google Chrome 团队作为主要维护方,项目稳定性有保障
- 大量遗留项目和新项目仍在使用 Sass
未来路线图
- Sass 2.0.0:移除
@import、移除无括号 URL 解析、改进内置函数 - 性能持续优化:嵌入式编译器将进一步提升编译速度
- CSS 新功能对齐:持续跟进 CSS 新特性,更新内置函数