Sass 模块化革命:深入解析 @use 语法,打造高效 CSS 架构
文章目录
- 前言
- @use 用法
- 1. 模块化与命名空间
- 2. @use 中 as 语法的使用
- 3. `as *` 语法的使用
- 4. 私有成员的访问
- 5. @use 中with默认值
- 6. @use 导入问题
- 总结
- 下一篇预告:
前言
在上一篇中,我们深入探讨了 Sass 中 @import 语法的局限性,正是因为这些问题,Sass 在 1.80 版本 后逐步弃用 @import,推出了更现代化的 @use 语法作为替代。在本文中,我们将深入解析 @use 的核心用法。
@use 用法
为了改进 @import 语法的局限性,Sass 团队引入了 @use 语法。作为一种更为现代和高效的模块化引入方式,@use 不仅解决了 @import 带来的诸多问题,还提供了更强的功能和灵活性。
1. 模块化与命名空间
@use 语法的一个核心优势在于它对模块化的支持。当你通过 @use 引入一个 SCSS 文件时,其中的变量、函数和混合宏并不会直接暴露在全局作用域中,而是被封装在一个特定的命名空间内。这种方式要求你通过明确的命名空间来访问这些内容,从而有效避免了全局作用域的污染,同时显著减少了命名冲突的风险。
这种命名空间可以理解为我们常用的模块化开发. 命名空间名称也可称为模块名称.
我们通过一个示例来理解模块化与命名空间:

示例中, 我通过@debug 在编译过程中观察模块中变量的值。使用Sass 编译时控制台会输入如下结果
Debug: 命名空间: bar, Primary Color: green
在 SCSS 中,使用 @use 语法引入模块时,若直接指定文件路径(如 @use 'path/to/file';),SCSS 会将被导入模块的内容整体封装到一个模块中,并以文件的名称(不含扩展名和路径)作为模块的标识符。
在上面的示例中, main.scss使用@use直接导入了bar.scss 文件, 就会将bar.scss中所有的内容被合并到main.scss中, 并且使用文件名称bar作为模块名称.
封装模块后, 就可以使用模块的方式来访问bar.scss中的变量. 如bar.$color 。通过 bar.$color 访问其中的变量这种方式有效避免了全局作用域污染,同时强化了代码的模块化和可维护性。
2. @use 中 as 语法的使用
当使用文件名称作为默认模块标识时,可能会出现模块名冲突的问题,尤其是在项目中引入了不同路径下的同名文件时。为了解决这一问题,可以通过 as 关键字为模块指定一个自定义名称。
例如,@use 'path/to/button' as btn; 可以将 button 模块重命名为 btn,从而避免命名冲突,确保代码的清晰性和可维护性。
示例

在这个示例中,main.scss 使用 @use 导入了 foo/bar.scss 文件 和bar.scss文件,此时两个文件默认都以文件名bar作为模块名. 编译时就会报错. 报错信息如下:
Error: There’s already a module with namespace “bar”.
此时就需要我们通过as语法创建自定义模块名称。如示例中@use "foo/bar.scss" as foo的导入方式. 会将foo/bar.scss模块重命名为foo。此时就需要通过foo.$color来访问模块中的变量.
3. as * 语法的使用
如果你使用@use语法, 但并不想使用模块化. 就可以使用as *。它表示将导入的模块的所有内容直接合并到当前文件中,并且不会创建一个命名空间。这样可以让导入的模块的所有变量、mixin、函数等直接在当前文件中使用,而不需要使用命名空间来访问它们。
示例:

在这个示例中,main.scss 使用 @use 导入了 bar.scss 文件,并通过 as * 将模块中的所有成员直接引入当前作用域,而无需创建命名空间。因此,bar.scss 中定义的变量、混合宏或函数可以直接在 main.scss 中使用,无需通过命名空间引用。这种写法能够简化代码,但可能会增加命名冲突的风险,因此需要谨慎使用。
4. 私有成员的访问
在 Sass 的 @use 语法中,私有化特性是核心机制之一。通过 @use 导入模块时,模块内部的私有变量、函数或混合宏默认是不可访问的,只有明确导出的内容才能被外部使用。这种方式极大地增强了代码的封装性和安全性,防止模块内部实现细节被外部访问或篡改,从而降低了潜在的错误风险。
在模块中,开发者可以通过为变量或函数命名时添加 $-* 或 $_* 前缀(例如 $-private-var 或 $_internal-function)来显式标记其为私有成员。这些私有成员仅在模块内部可见,无法通过 @use 在外部访问。
示例:

@use不会直接将文件中的私有变量暴露给外部,这意味着你可以更加清晰地控制哪些内容是公共的,哪些内容是私有的。这种严格的作用域控制机制,提升了代码的可维护性和安全性。
5. @use 中with默认值
在 Sass 的 @use 规则中,with 语句用于为模块中的变量提供默认值。通过 with,可以在引入模块时覆盖模块中定义的默认变量值,从而实现高度的灵活性和可配置性。
示例:

在 Sass 的 @use 语法中,默认值覆盖机制是一项非常实用的特性。它允许你在引入模块时为文件中的变量设置新的默认值,而无需修改原始文件。通过这种机制,你可以灵活地调整模块的行为或样式,特别适合开发可配置的 UI 组件或主题系统。
6. @use 导入问题
在 Sass 的 @use 语法中,模块的作用域是封闭的,这意味着每个模块只能访问自身显式导出的成员,而无法直接访问嵌套导入模块中的变量。例如,在以下导入链中:
main.scss -> bar.scss -> foo.scss
如果 main.scss 引入了bar.scss,而 bar.scss 又引入了 foo.scss,main.scss 并不会自动获得访问 foo.scss 中变量的权限。这是为了确保模块的封装性,避免命名冲突和意外的依赖耦合。
示例:

此时编译就会报错, 在main.scss无论使用bar.$color, 还是foo.$color都会报错
● 使用bar.$color报错提示: bar中没有定义$color变量
● 使用foo.$color报错提示: 在main中没有foo这个命名空间
为了解决这个问题,就需要用到 @forward 指令。
总结
本文深入探讨了 Sass 中 @use 语法的核心优势和应用场景。作为 @import 的现代替代方案,@use 通过命名空间、私有成员和变量默认值覆盖等特性,显著提升了 Sass 的模块化能力和代码维护性。
在文中我们通过详细讲解了如何使用 @use 实现模块化开发、避免命名冲突,以及如何通过 with 为模块变量设置默认值,从而打造更灵活、更健壮的样式系统。
下一篇预告:
在下一篇中,我们将继续深入探讨 @forward 规则的使用。@forward 是 @use 的重要补充,它允许你将多个模块的内容转发到单一入口,从而解决模块嵌套导入时的访问限制问题。我们将通过实际示例,展示如何利用 @forward 构建更加高效的模块化架构。敬请期待!🚀
如果觉得这篇文章对你有帮助,别忘了点赞加关注,获取更多实用干货!🥰
相关文章:
Sass 模块化革命:深入解析 @use 语法,打造高效 CSS 架构
文章目录 前言use 用法1. 模块化与命名空间2. use 中 as 语法的使用3. as * 语法的使用4. 私有成员的访问5. use 中with默认值6. use 导入问题总结下一篇预告: 前言 在上一篇中,我们深入探讨了 Sass 中 import 语法的局限性,正是因为这些问题…...
Kotlin中的数字
1、整数类型 Kotlin 提供了一组表示数字的内置类型。 对于整数,有四种不同大小的类型,因此值的范围也不同: 类型大小(比特数)最小值最大值Byte8-128127Short16-3276832767Int32-2,147,483,648 (-231)2,147,483,647 (…...
利用Postman和Apipost进行API测试的实践与优化-动态参数
在实际的开发和测试工作中,完成一个API后对其进行简单的测试是一项至关重要的任务。在测试过程中,确保API返回的数据符合预期,不仅可以提高开发效率,还能帮助我们快速发现可能存在的问题。对于简单的API测试,诸如验证响…...
【前端基础】Day 9 PC端品优购项目
目录 1. 品优购项目规划 1.1 网站制作流程 1.2 品优购项目整体介绍 1.3 学习目的 1.4 开发工具以及技术栈 1.5 项目搭建工作 1.6 网站favicon图标 1.7 网站TDK三大标签SEO优化 2. 品优购首页制作 2.1 常见模块类命名 2.2 快捷导航shortcut制作 2.3 header制作 2.4…...
FFMPEG利用H264+AAC合成TS文件
本次的DEMO是利用FFMPEG框架把H264文件和AAC文件合并成一个TS文件。这个DEMO很重要,因为在后面的推流项目中用到了这方面的技术。所以,大家最好把这个项目好好了解。 下面这个是流程图 从这个图我们能看出来,在main函数中我们主要做了这几步&…...
Linux搭建个人大模型RAG-(ollama+deepseek+anythingLLM)
本文是远程安装ollama deepseek,本地笔记本电脑安装anythingLLM,并上传本地文件作为知识库。 1.安装ollama 安装可以非常简单,一行命令完事。(有没有GPU,都没有关系,自动下载合适的版本) cd 到…...
Docker 学习(二)——基于Registry、Harbor搭建私有仓库
Docker仓库是集中存储和管理Docker镜像的平台,支持镜像的上传、下载、版本管理等功能。 一、Docker仓库分类 1.公有仓库 Docker Hub:官方默认公共仓库,提供超过10万镜像,支持用户上传和管理镜像。 第三方平台:如阿里…...
PHP之变量
在你有别的编程语言的基础下,你想学习PHP,可能要了解的一些关于变量的信息。 PHP中的变量不用指定数据类型,同时必须用$开头。 全局变量 可以在除函数外任意地方访问,如果需要在函数中访问要先获取 $x 111; function tt() {gl…...
centos和ubuntu下安装redis
1,判断环境是否有gcc gcc --version 如果未安装则执行 yum install -y gcc tcl 2,安装包下载,编译安装 cd /usr/local mkdir redis wget https://download.redis.io/releases/redis-4.0.11.tar.gz tar -xvf redis-4.0.11.tar.gz cd redis-4.0.11 编译 m…...
韩国互联网巨头 NAVER 如何借助 StarRocks 实现实时数据洞察
作者: Youngjin Kim Team Leader, NAVER Moweon Lee Data Engineer, NAVER 导读:开源无国界,在“StarRocks 全球用户精选案例”专栏中,我们将介绍韩国互联网巨头 NAVER 的 StarRocks 实践案例。 NAVER 成立于 1999 年࿰…...
K8s 1.27.1 实战系列(二)安装集群并初始化
一、安装 kubeadm、kubelet 和 kubectl(所有节点) 1、配置k8s的yum源地址 cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgchec…...
生命周期总结(uni-app、vue2、vue3生命周期讲解)
一、vue2生命周期 Vue2 的生命周期钩子函数分为 4 个阶段:创建、挂载、更新、销毁。 1. 创建阶段 beforeCreate:实例初始化之后,数据观测和事件配置之前。 created:实例创建完成,数据观测和事件配置已完成,…...
十一、Redis Sentinel(哨兵)—— 高可用架构与配置指南
Redis Sentinel(哨兵)—— 高可用架构与配置指南 在分布式应用中,Redis 主从复制(Master-Slave)虽然能提供读写分离的能力,但它 无法自动故障转移(failover)。如果主节点(Master)发生故障,系统管理员需要手动将某个从节点(Slave)提升为主节点,并重新配置所有从节…...
java8中young gc的垃圾回收器选型,您了解嘛
在 Java 8 的 Young GC(新生代垃圾回收)场景中,对于 ToC的场景,即需要尽可能减少垃圾回收停顿时间以满足业务响应要求的场景,以下几种收集器各有特点,通常 Parnew和 G1 young表现较为出色,下面详…...
C语言学习笔记-初阶(30)深入理解指针2
1. 数组名的理解 在上一个章节我们在使用指针访问数组的内容时,有这样的代码: int arr[10] {1,2,3,4,5,6,7,8,9,10}; int *p &arr[0]; 这里我们使用 &arr[0] 的方式拿到了数组第⼀个元素的地址,但是其实数组名本来就是地址&…...
【Wireshark 02】抓包过滤方法
一、官方教程 Wireshark 官网文档 : Wireshark User’s Guide 二、显示过滤器 2.1、 “数据包列表”窗格的弹出过滤菜单 例如,源ip地址作为过滤选项,右击源ip->prepare as filter-> 选中 点击选中完,显示过滤器&#…...
MySQL基础四(JDBC)
JDBC(重点) 数据库驱动 程序会通过数据库驱动,和数据库打交道。 sun公司为了简化开发人员对数据库的统一操作,提供了一个Java操作数据库的规范。这个规范由具体的厂商去完成。对应开发人员来说,只需要掌握JDBC接口。 熟悉java.sql与javax.s…...
基于CURL命令封装的JAVA通用HTTP工具
文章目录 一、简要概述二、封装过程1. 引入依赖2. 定义脚本执行类 三、单元测试四、其他资源 一、简要概述 在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具。它支持文件的上传和下载,是综合传输工具&…...
cenos7网络安全检查
很多网络爱好者都知道,在Windows 2000和Windows 9x的命令提示符下可使用Windows系统自带的多种命令行网络故障检测工具,比如说我们最常用的ping。但大家在具体应用时,可能对这些命令行工具的具体含义,以及命令行后面可以使用的种…...
FastGPT 引申:混合检索完整实例
文章目录 FastGPT 引申:混合检索完整实例1. 各检索方式的初始结果2. RRF合并过程3. 合并后的结果4. Rerank重排序后5. 最终RRF合并6. 内容总结 FastGPT 引申:混合检索完整实例 下边通过一个简单的例子说明不同检索方式的分值变化过程,假设我…...
一、Prometheus架构
Prometheus 云原生十二要素是一套最佳实践和规范,旨在帮助开发人员更好地构建云原生应用 这十二个要素分别是: 单一职责独立部署无状态声明式API服务发现容错处理自适应算法自动化运维响应式编程通信协议服务注册与发现数据持久化一、Prometheus 是什么 Prometheus 是一个…...
蓝桥杯C组真题——巧克力
题目如下 思路 代码及解析如下 谢谢观看...
【大模型】大模型分类
大模型(Large Models)通常指参数量巨大、计算能力强大的机器学习模型,尤其在自然语言处理(NLP)、计算机视觉(CV)等领域表现突出。以下是大模型的常见分类方式: 1. 按应用领域分类 …...
WebUSB的常用API及案例
WebUSB API 允许网页与 USB 设备进行交互,但出于安全考虑,浏览器要求在调用 requestDevice 方法(用于请求用户选择一个 USB 设备并授予网页访问权限)时,必须是在处理用户手势(例如点击按钮)的过…...
在线研讨会 | 加速游戏和AI应用,全面认识Imagination DXTP GPU
近日,Imagination宣布推出 Imagination DXTP GPU IP,该产品重新定义了智能手机和其他功耗受限设备的图形和计算加速。它专为高效的效率而设计,能够提供运行AI、游戏和用户界面体验所需的性能,确保这些体验可以全天候流畅且持续地运…...
The Rust Programming Language 学习 (三)
所有权 所有权(系统)是 Rust 最为与众不同的特性,它让 Rust 无需垃圾回收器(garbage collector)即可保证内存安全。因此,理解 Rust 中所有权的运作方式非常重要。 这里是非常重非常重的一个知识点,这里一…...
【一个月备战蓝桥算法】递归与递推
字典序 在刷题和计算机科学领域,字典序(Lexicographical order)也称为词典序、字典顺序、字母序,是一种对序列元素进行排序的方式,它模仿了字典中单词的排序规则。下面从不同的数据类型来详细解释字典序: …...
【零基础到精通Java合集】第二十九集:SQL常用优化手段
课程标题:SQL常用优化手段——15分钟快速提升数据库性能 目标:掌握10+核心SQL优化技巧,解决慢查询、高负载等生产问题 0-1分钟:优化核心原则——减少数据扫描量 本质逻辑:通过索引、分页、过滤条件等手段,最小化磁盘I/O和内存计算。 反例:SELECT * FROM orders(全表扫…...
ArcGIS操作:07 绘制矢量shp面
1、点击目录 2、右侧显示目录 3、选择要存储的文件夹,新建shp 4、定义名称、要素类型、坐标系 5、点击开始编辑 6、点击创建要素 7、右侧选择图层、创建面 8、开始绘制,双击任意位置结束绘制...
如何远程访问svn中的URL
简介: 主要opencascade相关知识学习 格言: 万丈高楼平地起 要远程访问 SVN(Subversion)仓库中的 URL,通常需要以下步骤和注意事项: 1. 确认远程 SVN 服务器的访问协议 SVN 支持多种协议访问远程仓库&…...
