在 Vue3 中集成 Sass,其实不需要复杂配置:安装好 sass,再通过 additionalData 注入全局变量,通常就能满足大多数项目需求。由于 Vite 已经内置 Dart Sass 支持,因此无需额外启用 sass-loader;其中,@import 更适合直接引入并平铺全局变量,而 @use 则必须配合命名空间使用;到了生产环境,outputStyle 和 sourceMap 这两个选项也建议明确配置,不要省略。

在 Vue3 项目中配置 Sass,关键主要有两步:依赖装对、全局路径注入正确。相比 Webpack,Vite 项目的配置明显更简洁,但很多开发者还是容易在sass-loader安装或additionalData写法上踩坑。
使用 Vite 时只安装 sass,不要再装 sass-loader
从 Vite 2.0 开始,官方就已经内置了 Dart Sass 能力,因此sass-loader在 Vite 项目里不仅没有必要,还有可能和 Vite 的样式预处理流程发生冲突,进而引发编译失败、全局变量失效等问题。
- 正确安装命令:
npm install sass -D或yarn add sass -D - 常见错误操作:执行
npm install sass sass-loader -D(尤其是在 Vite 项目中) - 如果已经误装
sass-loader,建议直接卸载:npm uninstall sass-loader
vite.config.ts 中通过 css.preprocessorOptions.scss.additionalData 注入全局变量
这个配置项的作用,是在每一个 代码块开头自动追加指定的 SCSS 内容,因此它也是共享全局变量、函数和 mixin 最稳定、最常用的方式。
- 如果希望变量可以直接使用,就必须采用
@import(而不是@use);因为@use会要求使用命名空间,组件内原本的$primary-color就需要写成variables.$primary-color - 多个全局文件可以用分号连接:
additionalData: '@import "@/styles/vars.scss"; @import "@/styles/mixins.scss";' - 在 Vite 项目中,路径别名
@默认通常可直接使用,无需额外配置resolve.alias
组件内 的几个关键限制
虽然 SCSS 语法本身没有问题,但在 Vue 组件里使用时,依然会受到 scoped 作用域和编译时机的影响,实际表现与普通 SCSS 文件并不完全一样。
- 在
scoped模式下,&选择器和嵌套写法都可以正常使用,但@import不适合直接写在中——它更适用于顶层 SCSS 文件 - 如果想在某个单独组件里局部引入 mixin,可以使用
@use配合别名:@use "@/styles/mixins" as m;,随后再写@include m.flex-center; :export仅对.module.scss生效,普通并不支持导出 JS 变量
生产环境配置要重点关注 outputStyle 和 sourceMap
Vite 默认不会直接暴露这些 Sass 相关选项,但如果你在 defineConfig 中手动扩展了 css.preprocessorOptions.scss,那么这部分配置就需要自行明确处理。
outputStyle: 'compressed'建议显式指定,否则生产环境中 SCSS 编译结果仍可能保持 expanded 格式,打包体积可能增加 30% 以上sourceMap: false通常建议关闭,因为线上环境一般不需要继续调试原始 SCSS 行号- 不要完全依赖“Vite 自动优化”这一说法,它主要负责压缩最终的 JS/CSS 内容,并不会主动改变 SCSS 编译输出格式
实际开发中,最容易被忽视的一点就是 @import 与 @use 的语义区别:前者会把变量直接平铺到当前作用域中,后者则强调命名空间隔离。到底该选择哪一种,不是看个人习惯,而是要看团队是否接受统一使用命名空间前缀的开发方式。
