@use能避免重复解析同一模块,因其对同一路径模块仅解析编译一次并复用符号表;而@import每次调用都重新执行完整编译流程,导致50次导入即50次重复解析。

为什么@use能避免重复解析同一模块
@use确保同一路径的模块在整个项目中只被解析、编译一次,符号表(变量定义、mixin AST、函数签名)全程复用;而@import每次出现都触发完整文件读取→词法分析→语法树构建→mixin展开→CSS生成全流程。比如 50 个组件都@import "utils",Dart Sass 就执行 50 次相同解析;换成@use "utils",只解析一次,后续全走缓存。
哪些场景下@use提速最明显
提速不是平均摊在每个文件上,而是集中在三类高开销环节被跳过时:
- 大量组件共用
sass:math或sass:color等内置模块——@import会让它们反复绑定到全局作用域,@use直接复用已编译的函数实例 - 主题切换需并行加载
@use "themes/dark" as dark和@use "themes/light" as light——@use按需加载,@import强制合并全部变量,哪怕只用暗色主题也得解析亮色文件 - 设计系统用
@forward "tokens" with ($spacing-sm: 4px)注入配置——@use在转发层完成变量绑定,下游无需再做覆盖逻辑;@import则要求每个消费者手动重定义$spacing-sm !default
@use没变快?先检查这三处硬伤
用了@use但编译速度没提升,大概率是以下配置或组织问题:
-
@use "variables" as *破坏模块隔离,编译器退化为类似@import的全局查找模式,缓存失效 - webpack 中
sass-loader版本过旧,不支持别名(如@/scss),导致路径解析 fallback 到暴力文件系统遍历,I/O 成瓶颈 - 在
vue.config.js的css.loaderOptions.sass.additionalData里写@use——这会让每个.vue文件都独立触发一次模块解析,完全抵消缓存收益
模块粒度不当反而拖慢编译
模块拆得太粗或太细都会削弱@use的缓存优势:
- 把断点、颜色、间距全塞进一个
_tokens.scss,哪怕只改$font-size-base,整个模块缓存就失效,所有依赖它的文件都要重编译 - 为每个变量建单独文件(如
_spacing-sm.scss、_spacing-md.scss),模块数量爆炸,Dart Sass 的模块注册和符号表查找开销上升 - 真正合理的粒度是按“变更频率+语义聚类”:比如
_breakpoints.scss和_typography.scss各自独立,但_spacing-xs和_spacing-sm应合并到_spacing.scss
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











