在Vue3项目中集成SCSS的完整流程与高级用法

 更新时间:2026年06月08日 09:23:28   作者:叫我少年  
在 Vue3 项目中希望使用 SCSS 来提升样式代码的可维护性和开发效率,但配置方式与高级用法容易混淆,这篇就来聊清楚 Vue3 集成 SCSS 的完整流程、常见场景和进阶技巧,需要的朋友可以参考下

引言

在 Vue3 项目中希望使用 SCSS 来提升样式代码的可维护性和开发效率,但配置方式与高级用法容易混淆。这篇就来聊清楚 Vue3 集成 SCSS 的完整流程、常见场景和进阶技巧。

  1. 安装与基础配置:不同构建工具下的依赖安装与配置步骤
  2. 全局变量与混合器:如何共享变量与 mixin,避免重复定义
  3. 高级用法:样式模块化、深度选择器、响应式 mixin

一、使用场景

  • 需要使用 CSS 变量和主题切换功能
  • 大型项目中的样式模块化管理
  • 需要复用样式代码(mixins、继承)
  • 复杂的样式逻辑处理

二、注意事项

  1. 需要安装相应的 SCSS 编译器依赖(sass​ + sass-loader
  2. 不同构建工具(Vite、Webpack)配置方式略有不同
  3. SCSS 语法需要编译为 CSS 才能在浏览器中运行
  4. 作用域样式需要配合 Vue 的 scoped 属性使用
  5. 生产环境需要确保样式正确压缩和优化

三、基本用法

3.1 安装依赖

# 使用 npm
npm install sass sass-loader -D
# 使用 yarn
yarn add sass sass-loader -D
# 使用 pnpm
pnpm add sass sass-loader -D

3.2 Vue 组件中使用 SCSS

<template>
  <div class="container">
    <h1 class="title">{{ title }}</h1>
  </div>
</template>
<script setup>
import { ref } from 'vue'
const title = ref('Hello SCSS in Vue3')
</script>
<style lang="scss" scoped>
// 定义 SCSS 变量(编译后不再存在,仅在开发时使用)
$primary-color: #42b883;
$font-size: 16px;
.container {
  padding: 20px;
  .title {
    color: $primary-color;
    font-size: $font-size * 1.5;
    // &: 引用父选择器,相当于 .container .title:hover
    &:hover {
      text-decoration: underline;
    }
  }
}
</style>

代码解析:

  1. $primary-color/ $font-size:SCSS 变量,编译时替换为实际值,不产生额外 CSS 规则。
  2. &:hover​:SCSS 嵌套语法中的父选择器引用,编译后为 .container .title:hover
  3. scoped​:Vue 提供的作用域样式,自动添加 data-v-xxx 属性,只作用于当前组件。

四、常用操作

4.1 全局样式文件引入

main.js​ 或 main.ts 中引入全局 SCSS 文件:

import { createApp } from 'vue'
import App from './App.vue'
import './styles/global.scss' // 引入全局样式,所有组件均可访问

createApp(App).mount('#app')

4.2 Vue 配置全局 SCSS 变量(Vite)

vite.config.js​ 中配置,使所有组件自动注入变量文件,无需手动 @import

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

export default defineConfig({
  plugins: [vue()],
  css: {
    preprocessorOptions: {
      scss: {
        // 自动在每个 SCSS 文件开头注入变量文件
        additionalData: `@import "@/styles/variables.scss";`
      }
    }
  }
})

常见坑: additionalData​ 中的路径需确保与项目别名解析一致(如 @​ 对应 src​)。若使用 sass​ 包(dart-sass),@import​ 可能在未来版本废弃,建议改用 @use(参见官方文档)。

4.3 创建 SCSS 变量文件

src/styles/variables.scss

// 颜色变量
$primary-color: #42b883;
$secondary-color: #35495e;
$danger-color: #ff4757;
// 尺寸变量
$spacing-sm: 8px;
$spacing-md: 16px;
$spacing-lg: 24px;
// 响应式断点
$breakpoint-sm: 576px;
$breakpoint-md: 768px;
$breakpoint-lg: 992px;

五、高级用法

5.1 使用 Mixins

创建 src/styles/mixins.scss

@mixin flex-center($direction: row) {
  display: flex;
  justify-content: center;
  align-items: center;
  flex-direction: $direction;
}
@mixin responsive($breakpoint) {
  @media (max-width: $breakpoint) {
    @content;
  }
}

在组件中使用:

// 先引入 mixins
@import "@/styles/mixins";

.container {
  @include flex-center(column);

  @include responsive($breakpoint-md) {
    padding: $spacing-sm;
  }
}

代码解析:

  1. @mixin:定义可复用的样式块,可带参数。
  2. @include:将 mixin 插入当前位置。
  3. @content:允许在 mixin 内部插入外部样式块,常用于媒体查询包装。

5.2 样式模块化

使用 Vue 的 module 属性实现 CSS Modules 风格:

<template>
  <div :class="$style.container">
    <h1 :class="$style.title">模块化样式</h1>
  </div>
</template>
<style module lang="scss">
.container {
  padding: 20px;
  .title {
    color: $primary-color;
  }
}
</style>

划重点: $style 是 Vue 编译时生成的样式对象,类名会被哈希,避免全局冲突。

5.3 深度选择器

当需要覆盖子组件内部样式时,使用深度选择器:

::v-deep(.child-component) {
  color: red;
}
// 新版语法(推荐)
:deep(.child-component) {
  color: red;
}

注意: ::v-deep​ 是 Vue 2 的写法,Vue 3 中支持但更推荐 :deep()​。两者语义相同,均会去掉 scoped 属性对当前选择器的限制。

六、项目结构建议

src/
├── styles/
│   ├── variables.scss    # 全局变量
│   ├── mixins.scss       # 混合器
│   ├── reset.scss        # 重置样式
│   ├── global.scss       # 全局样式
│   └── components/       # 组件样式(如按钮、弹窗等)
│       ├── button.scss
│       └── modal.scss
└── components/
    └── MyComponent.vue

最后: 掌握 SCSS 集成后,配合 Vue 的单文件组件样式,可以大幅提高样式代码的复用性和可维护性。建议团队统一变量和 mixins 管理,形成样式规范,从项目初期就避免样式散乱的问题。

以上就是在Vue3项目中集成SCSS的完整流程与高级用法的详细内容,更多关于Vue3集成SCSS流程与用法的资料请关注脚本之家其它相关文章!

相关文章

  • vue数据初始化initState的实例详解

    vue数据初始化initState的实例详解

    Vue 实例在建立的时候会运行一系列的初始化操作,而在这些初始化操作里面,和数据绑定关联最大的是 initState。这篇文章主要介绍了vue数据初始化--initState,需要的朋友可以参考下
    2019-04-04
  • mpvue构建小程序的方法(步骤+地址)

    mpvue构建小程序的方法(步骤+地址)

    mpvue是一个使用Vue.js开发小程序的前端框架。框架基于 Vue.js 核心,这篇文章主要介绍了mpvue构建小程序的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • vue element编辑框根据值动态确认是否是必填项required true or false问题

    vue element编辑框根据值动态确认是否是必填项required true or&n

    该文章主要介绍了在编辑数据时,根据是否有时间数据来决定某项是否为必填项,作者提供了一个简单的解决方法,并分享了HTML表单代码和校验规则,最后表示希望对读者有所帮助
    2026-04-04
  • el-date-picker change事件无响应问题及解决方案

    el-date-picker change事件无响应问题及解决方案

    文章总结:在使用el-date-picker组件时,如果回显数据后change事件无法监听到变化,可以改用input事件,选择日期后页面不更新但数据变化,可以在监听事件中使用forceUpdate强制刷新视图
    2025-12-12
  • Vue动态组件 component :is的使用代码示范

    Vue动态组件 component :is的使用代码示范

    vue 动态组件用于实现在指定位置上,动态加载不同的组件,这篇文章主要介绍了Vue动态组件 component :is的使用,需要的朋友可以参考下
    2023-09-09
  • vue、uniapp中动态添加绑定style、class 9种实现方法

    vue、uniapp中动态添加绑定style、class 9种实现方法

    这篇文章主要介绍了vue、uniapp中动态添加绑定style、class 9种方法实现,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • Vue2路由地址栏变化API(pushState和replaceState)的避坑指南

    Vue2路由地址栏变化API(pushState和replaceState)的避坑指南

    你是不是也遇到过这种尴尬场景:明明URL变了,页面却没刷新?或者一刷新直接404教做人?别慌,这都是history.pushState和replaceState在搞事情,因此本文给大家介绍了Vue2路由地址栏变化API的避坑指南,需要的朋友可以参考下
    2026-02-02
  • Vue中组件通信的8种实现方法与对比的完整指南

    Vue中组件通信的8种实现方法与对比的完整指南

    选择正确的通信方式,能让你的应用像高效运转的团队一样协作顺畅,本文就把Vue组件通信的8种神操作一次性讲清楚,每种方法都有适用场景和代码示例,下面就跟随小编一起深入了解下吧
    2025-10-10
  • vue实现抽屉弹窗效果

    vue实现抽屉弹窗效果

    这篇文章主要为大家详细介绍了vue实现抽屉弹窗效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • 基于Vue.js 2.0实现百度搜索框效果

    基于Vue.js 2.0实现百度搜索框效果

    这篇文章主要为大家详细介绍了基于Vue.js 2.0实现百度搜索框效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09

最新评论