Vite 构建 Vue3 组件库之路: 使用CSS预处理器构建高效且易维护的样式管理体系

191 阅读3分钟

引言

在构建 UI 组件库时,我们面临着样式一致性、可维护性和可扩展性等诸多挑战。CSS 预处理器,如 Sass 和 Less,为我们提供了一套强大的解决方案。它们通过引入变量、混合(Mixins)、函数等高级特性,极大地扩展了 CSS 的能力,使样式代码的管理更加模块化和可重用,为构建高质量的 UI 组件库奠定了坚实基础。

样式系统目录结构

以下是 styles 文件夹下的 SCSS 文件结构,每个文件都有其特定的职责,共同构建起一个完整的样式系统。

styles/
│
├── index.scss        # 项目的入口文件,用于导入其他所有的SCSS文件
├── variables.scss    # 定义全局变量,如颜色、字体大小、间距等,以保持项目一致性
├── mixins.scss       # 包含自定义的SCSS混合,用于代码复用和减少重复
├── functions.scss    # 包含自定义的SCSS函数,用于执行样式中的计算和逻辑操作
├── animations.scss   # 定义关键帧动画和动画混合,用于项目的动画效果
├── reboot.scss       # 重置和规范化样式,以确保跨浏览器的一致性基础
└── *.scss

定义 UI 组件库的变量

在 variables.scss 文件中,我们定义了中性色、基础色、功能色、字体大小等变量,为 UI 组件库的视觉风格搭建基础框架。

@use 'sass:color';
// 中性色
$white: #ffffff !default;
$gray-100: #f8f9fa !default;
$gray-200: #e9ecef !default;
$gray-300: #dee2e6 !default;
$gray-400: #ced4da !default;
$gray-500: #adb5bd !default;
$gray-600: #6c757d !default;
$gray-700: #495057 !default;
$gray-800: #343a40 !default;
$gray-900: #212529 !default;
$black: #000000 !default;

// 基础色
$blue: #007bff !default;
$indigo: #6610f2 !default;
$purple: #6f42c1 !default;
$pink: #e83e8c !default;
$red: #dc3545 !default;
$orange: #fd7e14 !default;
$yellow: #ffc107 !default;
$green: #28a745 !default;
$teal: #20c997 !default;
$cyan: #17a2b8 !default;

// 品牌色
$primary: $blue !default;
$secondary: $gray-600 !default;
$success: $green !default;
$info: $cyan !default;
$warning: $yellow !default;
$danger: $red !default;
$light: $gray-100 !default;
$dark: $gray-800 !default;

// 功能色
$theme-colors: (
        "primary": $primary,
        "secondary": $secondary,
        "success": $success,
        "info": $info,
        "warning": $warning,
        "danger": $danger,
        "light": $light,
        "dark": $dark,
);

// 字体
$font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
"Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji",
"Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" !default;
$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas,
"Liberation Mono", "Courier New", monospace !default;
$font-family-base: $font-family-sans-serif !default;

// 字体大小
$font-size-base: 1rem !default;
$font-size-lg: $font-size-base * 1.25 !default;
$font-size-sm: $font-size-base * 0.875 !default;
$font-size-root: null !default;

// 字重
$font-weight-lighter: lighter !default;
$font-weight-light: 300 !default;
$font-weight-normal: 400 !default;
$font-weight-bold: 700 !default;
$font-weight-bolder: bolder !default;
$font-weight-base: $font-weight-normal !default;


// 行高
$line-height-base: 1.5 !default;
$line-height-lg: 2 !default;
$line-height-sm: 1.25 !default;

// 标题大小
$h1-font-size: $font-size-base * 2.5 !default;
$h2-font-size: $font-size-base * 2 !default;
$h3-font-size: $font-size-base * 1.75 !default;
$h4-font-size: $font-size-base * 1.5 !default;
$h5-font-size: $font-size-base * 1.25 !default;
$h6-font-size: $font-size-base !default;

// body
$body-bg: $white !default;
$body-color: $gray-900 !default;
$body-text-align: null !default;

// Headings
$headings-margin-bottom: calc($spacer / 2) !default;
$headings-font-family: null !default;
$headings-font-style: null !default;
$headings-font-weight: 500 !default;
$headings-line-height: 1.2 !default;
$headings-color: null !default;

// Links
$link-color: $primary !default;
$link-decoration: none !default;
$link-hover-color: color.adjust($link-color, $lightness: 15%) !default;
$link-hover-decoration: underline !default;

// Spacing
$spacer: 1rem !default;
$spacers: (
        0: 0,
        1: ($spacer * .25),
        2: ($spacer * .5),
        3: $spacer,
        4: ($spacer * 1.5),
        5: ($spacer * 3)
) !default;

// Borders
$border-width: 1px !default;
$border-color: $gray-300 !default;
$border-radius: .25rem !default;
$border-radius-lg: .3rem !default;
$border-radius-sm: .2rem !default;

// Shadows
$box-shadow-sm: 0 0.125rem 0.25rem rgba($black, 0.075) !default;
$box-shadow: 0 0.5rem 1rem rgba($black, 0.15) !default;
$box-shadow-lg: 0 1rem 3rem rgba($black, 0.175) !default;
$box-shadow-inset: inset 0 1px 2px rgba($black, 0.075) !default;

// Code
$code-font-size: $font-size-sm !default;
$code-color: $pink !default;
$pre-color: null !default;

// Animation
$transition-base: .2s ease-in-out !default;
$transition-fade: opacity $transition-base !default;
$transition-collapse: height $transition-base !default;

// Custom variables can be added here

确保样式跨浏览器的一致性

为了确保我们的 UI 组件库在不同浏览器和设备上都能呈现一致的外观和行为,我们引入了 reboot.scss 文件。它是基于著名的 normalize.css 进行的定制化开发,主要负责重置浏览器的默认样式,为我们的组件提供一个干净、统一的样式起点。这有助于避免不同浏览器在渲染 HTML 元素时的默认样式差异,使我们在开发 UI 组件库时,能够将更多的精力集中在组件自身的独特样式上,而无需过多担心浏览器兼容性问题,从而提升开发效率,为用户提供统一且流畅的使用体验。

后记

通过上述的样式系统结构和变量定义,我们能够充分利用 CSS 预处理器的优势,打造一个具有良好一致性、可维护性和可扩展性的 UI 组件库。在后续的开发过程中,可以根据具体的组件需求,灵活运用这些变量、混合和函数,构建出多样化且风格统一的 UI 组件,以满足各种业务场景和用户需求。
在未来的开发中,我们将继续探索 CSS 预处理器的更多高级特性,如嵌套规则和自动前缀,以进一步提升我们的工作流程和组件库的质量


感谢阅读,敬请斧正!