现代前端开发 Sass 项目结构惯例

Sass 是 css 的预处理器,赋予了 css 模块化的能力。此文介绍在这种情况下组织下项目结构的惯例
在现代前端开发中,组织 Sass 项目结构时,最常用和推荐的模式是 7-1 模式 (7-1 Pattern)。这个模式的核心思想是将 Sass 文件组织到 7 个不同的文件夹中,并通过一个主文件(通常是 main.scss
或 style.scss
)来导入它们。
1 | sass/ |
各文件夹用途详解:
-
abstracts/
(或utils/
,helpers/
) - 抽象层- 用途:存放项目中所有 Sass 工具和辅助函数。这里的文件不应该输出任何 CSS 代码,它们是用来辅助其他 Sass 文件的。
- 内容示例:
_variables.scss
:颜色、字体、边距、断点等全局变量。_mixins.scss
:可重用的 Sass 混合宏。_functions.scss
:自定义的 Sass 函数。_placeholders.scss
:占位符选择器(%placeholder
),用于@extend
。
-
vendors/
- 第三方库- 用途:存放来自外部库或框架的 CSS/Sass 文件。
- 内容示例:
- Bootstrap 的 Sass 文件
- Normalize.css / Reset.css
- 第三方插件的样式
- 注意:如果你使用 npm/yarn 管理这些依赖,并且它们提供了 Sass 入口,你可能可以直接从
node_modules
导入,而不是复制到这里。但如果需要定制,复制过来修改会更方便。
-
base/
- 基础样式- 用途:定义项目的基础样式,通常是 HTML 元素的默认样式。
- 内容示例:
_reset.scss
或_normalize.scss
:如果vendors/
中没有提供。_typography.scss
:全局字体设置、标题、段落、链接等文本元素的样式。_base.scss
:body
,html
等标签的样式,以及一些基本的盒模型设置(如box-sizing: border-box;
)。_utilities.scss
:一些常用的工具类,如.clearfix
,.visually-hidden
(可选,也可以放在abstracts/
作为 mixin)。
-
layout/
(或grid/
) - 布局结构- 用途:定义网站或应用的主要布局结构。
- 内容示例:
_grid.scss
:网格系统定义。_header.scss
:页头样式。_footer.scss
:页脚样式。_sidebar.scss
:侧边栏样式。_navigation.scss
:主导航样式。_forms.scss
:表单的整体布局和结构(不是单个输入框、按钮的样式,那些属于components/
)。
-
components/
(或modules/
) - 组件- 用途:存放可重用的 UI 组件,如按钮、卡片、提示框等。这是项目中最庞大和最重要的部分。
- 内容示例:
_buttons.scss
_cards.scss
_modals.scss
_alerts.scss
_carousels.scss
- 建议:每个组件一个文件,方便管理和查找。可以结合 BEM (Block, Element, Modifier) 命名规范。
-
pages/
- 页面特定样式- 用途:存放特定页面的样式。这些样式仅在对应页面生效,不具有通用性。
- 内容示例:
_home.scss
:首页的特定布局或组件调整。_about.scss
:关于页面的特定样式。
- 注意:尽量将可重用的部分抽象到
components/
或layout/
。只有当样式确实只服务于单个页面时才放在这里。
-
themes/
(可选) - 主题- 用途:如果你的项目需要支持多种视觉主题(如暗黑模式、不同品牌主题等),这个文件夹用来存放主题相关的样式。
- 内容示例:
_default-theme.scss
_dark-theme.scss
_admin-theme.scss
- 通常,主题文件会覆盖或扩展
abstracts/
中的变量,或者提供特定的组件变体。
主文件 (main.scss
或 style.scss
, app.scss
)
这是唯一的、最终会被编译成 CSS 文件的 Sass 文件(其他文件都以下划线 _
开头,表示它们是 “partials”,不会被单独编译)。它负责按正确的顺序导入所有其他 Sass partials。
现代 Sass (@use
和 @forward
) 的导入顺序示例 (main.scss
):
1 | // 1. Abstracts (Utils, Helpers) - 必须最先,因为它们包含变量和工具,会被其他文件使用 |
传统 Sass (@import
) 的导入顺序示例 (main.scss
):
1 | // 1. Abstracts |
现代前端开发的惯例补充:
- 文件名以下划线
_
开头:如_variables.scss
。这告诉 Sass 编译器这是一个 “partial” 文件,不应该被单独编译成 CSS 文件,而只能被导入到其他 Sass 文件中。 @use
和@forward
优先于@import
:@use
:加载模块(文件),并将其成员(变量、混合宏、函数)命名空间化,避免全局污染。例如,@use 'abstracts/variables';
后,使用变量时需要variables.$primary-color
。@forward
:允许你将一个模块的成员暴露给导入当前文件的其他文件,而无需显式@use
。常用于组织库或在main.scss
中重新导出模块。@import
正在被逐步淘汰,因为它会导致全局命名空间污染和难以追踪的依赖关系。
- BEM 命名规范:在
components/
和layout/
中,使用 BEM (Block, Element, Modifier) 命名约定(如.card__title--large
)可以使 CSS 更具可读性、可维护性和模块化。 - 与构建工具集成:
- 现代前端项目通常使用 Webpack, Parcel, Vite 等构建工具。这些工具会配置
sass-loader
(Webpack) 或内置支持来编译 Sass。 - Autoprefixer 通常会自动添加,以处理浏览器前缀。
- CSS 压缩也会在生产构建中进行。
- 现代前端项目通常使用 Webpack, Parcel, Vite 等构建工具。这些工具会配置
- CSS Modules (结合 Sass):在使用 React, Vue, Angular 等组件化框架时,CSS Modules 是一种流行的做法。你可以为每个组件编写一个
.module.scss
文件,Sass 编译后的类名会自动哈希化,实现局部作用域。1
2
3
4
5
6
7// Button.module.scss
.button {
background-color: blue;
&:hover {
background-color: darkblue;
}
} - 组件驱动开发 (Component-Driven Development):
- Sass 结构可以与你的 JavaScript 组件结构相呼应。例如,如果你的 JS 组件在
src/components/Button/Button.js
,那么对应的 Sass 文件可以是src/components/Button/Button.scss
(或者Button.module.scss
)。 - 然后,你的主
main.scss
文件可以从这些组件目录中导入样式。
- Sass 结构可以与你的 JavaScript 组件结构相呼应。例如,如果你的 JS 组件在
- 可维护性和可扩展性:这种结构化方法使得项目更容易维护,新人更容易上手,并且随着项目的增长也更容易扩展。
选择哪种结构最终取决于项目规模和团队偏好,但 7-1 模式是一个非常好的起点,并被广泛认为是最佳实践。
- 标题: 现代前端开发 Sass 项目结构惯例
- 作者: 三葉Leaves
- 创建于 : 2025-05-16 00:00:00
- 更新于 : 2025-05-26 02:57:24
- 链接: https://blog.oksanye.com/7d9058f52f6b/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论