根本不是路径或文件名错了,而是@use必须出现在文件最顶部——任何前置内容(哪怕一个空行、注释、@charset)都会让它失效;vue单文件组件中@use须置于块首行,且需as *才能直接使用变量,文件名必须以下划线开头,混用@import会导致整文件降级为legacy模式。

为什么
根本不是路径或文件名错了,而是@use必须出现在文件最顶部——任何前置内容(哪怕一个空行、注释、@charset)都会让它失效。Vue单文件组件的<style></style>块里,如果上面有<template></template>或<script></script>标签,@use就不能放那儿。
常见错误包括:
- 在
<style scoped></style>里写@use '@/styles/_variables',但没加as *,结果只能用variables.$primary-color - 路径写成
@use '@/styles/variables.scss'——Sass要求模块文件名必须以下划线开头,_variables.scss才合法 - 同一文件里混了
@import 'reset.css',整份文件立刻退化为legacy模式,@use被无视
Vite项目中全局变量该走additionalData还是每个文件手动@use
additionalData是唯一靠谱的选择,它在Sass编译器读取组件样式前就把代码拼进去,所有<style lang="scss"></style>(含scoped)都能直接用变量,不用开发者操心。
配置时注意三点:
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
- 字符串末尾必须加分号和换行:
'@use "@/styles/_variables" as *;\n',少;或\n会导致CSS语法错误 -
@/别名只在Vite配置的resolve.alias里生效,additionalData字符串里不解析;若alias未配好,得改用path.resolve(__dirname, 'src/styles/_variables.scss') - 被注入的
_variables.scss里不能含@import,否则整条链降级,@use失效
SCSS变量和CSS变量混用时最常踩的坑
SCSS的$primary-color是编译期静态值,CSS变量--primary-color是运行时可变属性,二者不能互相赋值或嵌套。
典型翻车点:
- 写
--primary: #{$primary-color};是对的,但反过来$css-var: var(--primary);会直接报错——Sass不理解var() - 在JS里想读SCSS变量?不行。必须先用
#{$primary-color}插值导出为CSS变量,再用getComputedStyle取 - 用
v-bind()绑定响应式数据生成CSS变量时,它只作用于当前<style module></style>,子组件拿不到,也不能被全局样式引用
第三方UI库导致变量失效怎么办
不是你的变量丢了,而是别的库往:root写了同名变量,后加载的覆盖了你定义的——比如Element Plus和你自己的--primary-color冲突,谁的CSS后注入谁赢。
解法很实在:
- 别把所有Token塞
:root,改用语义化容器节点,例如.my-app { --color-primary: #3498db; } - Web Components必须在
:host里显式承接::host { --color-primary: inherit; },否则Shadow DOM里压根看不到 - 微信小程序
<root-portal></root-portal>这类隔离组件,CSS变量继承链被掐断,得靠el.style.setProperty()动态挂到父容器上,而不是依赖:root
all: initial清掉——这些都得靠DevTools的Computed面板逐层查,而不是靠猜。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










