Sass / SCSS logo

Sass / SCSS

最成熟、最强大的专业级 CSS 预处理器之一

精选工具CSS预处理器SassSCSS变量

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
GitHubhttps://github.com/sass/sass
LicenseMIT
最新版本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/styles

Vite 集成(零配置)

# 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/SCSSLessStylusPostCSS
语法SCSS(CSS 超集)/ 缩进语法CSS 超集灵活(可选括号/花括号)标准 CSS
变量$var@varvar$var通过插件(CSS 自定义属性)
嵌套✅ 完整支持✅ 支持✅ 支持通过插件(postcss-nested)
Mixin@mixin + @include.mixin()✅ 函数/Mixin通过插件
继承@extend不直接支持@extends通过插件
条件/循环@if/@for/@eachwhen 守卫✅ 完整编程能力通过插件
内置函数丰富(颜色、字符串、列表、映射)较丰富非常丰富依赖插件生态
编译速度中等(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
  • 避免在循环中生成大量选择器

技术局限与边界

已知限制

  1. 编译速度:Dart Sass 编译速度不如 LibSass(已废弃),大型项目可能有明显延迟
  2. 运行时缺失:纯编译时工具,不支持动态样式(需搭配 CSS 变量或 JavaScript)
  3. 浏览器特性:不处理浏览器前缀、不 polyfill 新 CSS 特性,需配合 PostCSS
  4. 模块系统过渡@import@use 的迁移需要时间和工具辅助
  5. 调试体验:Source Map 支持存在,但复杂项目的调试仍不够直观

不适用场景

  • 需要运行时动态修改样式 → 使用 CSS 变量 + JavaScript 或 CSS-in-JS
  • 需要自动添加浏览器前缀 → 搭配 PostCSS + Autoprefixer
  • 纯组件化项目(如 CSS Modules、Tailwind) → 考虑更轻量的方案
  • 追求零构建 → 考虑原生 CSS + 构建时工具

迁移注意事项

  • node-sasssass(Dart Sass):API 基本兼容,注意 @import 废弃警告
  • Sass 1.x → 2.x:需关注破坏性变更,使用 sass-migrator 工具
  • 从 Less 迁移到 Sass:语法差异较小,主要是变量符号(@$)和 Mixin 语法

学习资源

官方资源

教程与书籍

社区资源

中文资源

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 新特性,更新内置函数