@import在中会重复生成css,因其语义是“内容包含”,每次导入都展开变量文件全部内容,导致同一段代码被复制进多个css chunk;而@use "@/styles/variables.scss" as *;仅导入符号(变量、mixin、function),不输出css,避免重复注入且符合sass模块规范。

为什么 @import 在 <style lang="scss"></style> 里会重复生成 CSS
每次你在组件的 <style lang="scss"></style> 块里写 @import "@/styles/variables.scss";,Vite 就会把那个文件的内容原样拼进去编译——哪怕它只定义了 $color-primary 这种变量,不产生任何 CSS 规则,Sass 编译器仍会把它当作“参与构建的源”,最终打包时,这个 @import 被展开 20 次,就可能让同一段空逻辑(或带 :export 的 JS 导出块)被复制进 20 个 CSS chunk。这不是 bug,是 @import 的语义决定的:它本质是“内容包含”,不是“作用域引用”。
@use + as * 是局部引入变量的正确姿势
想只用变量、不导出样式、还不污染全局或重复打包,必须用 Sass 模块系统:@use。它只导入符号(变量、函数、mixin),不自动展开 CSS 规则。
使用 `@ainative/vue-sdk` 为 Vue 3 应用添加 AI 聊天功能。适用于以下场景:(1) 安装 `@ainative/vue-sdk`,(2) 在 Vue 组件中使用 `useChat` 组合式函数,(3) 提供……
-
@use "@/styles/variables.scss" as *;—— 把变量平铺进当前作用域,可直接写color: $primary-color; -
@use "@/styles/variables.scss" as vars;—— 用命名空间方式,写color: vars.$primary-color;,更安全但略啰嗦 - 两种写法都不会在最终 CSS 中插入任何额外规则,也不会触发重复注入
- 注意:路径必须真实存在,且
variables.scss里不能混用@import(尤其不能@import其他含实际样式的文件)
怎样确保变量只用于 JS 而不进 CSS
如果你的目标是在 JS 中读取 SCSS 变量(比如动态换肤),而不是在样式里用,那就别走 <style></style> 注入这条路——那是给样式编译器用的。应该用 .module.scss + :export:
- 文件名必须是
xxx.module.scss(Vite 识别为模块) - 内容只能是变量定义 +
:export块,例如:$primary-color: #409eff;<br>:export {<br> primaryColor: $primary-color;<br>} - JS 中
import theme from "@/styles/variables.module.scss",拿到的是纯 JS 对象:{ primaryColor: "#409eff" } - 这种写法完全绕过 CSS 构建流程,零样式副作用
容易被忽略的关键点
最常卡住的地方不在语法本身,而在工具链协同:
-
sass必须装,node-sass必须卸载干净——后者和 Vite 5+ 不兼容,会导致@use静默失效 -
@use路径里的@/别名,依赖vite.config.ts中resolve.alias正确配置,否则报错找不到文件 - 如果
variables.scss里用了@forward或@use引其他模块,确保整个链条都用模块语法,不要和旧式@import混用 -
@use必须写在<style lang="scss"></style>的最顶部,前面不能有空行或注释(Sass 解析器对位置敏感)
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










