sass中的导入与部分导入

文章目录

      • sass中的导入与部分导入
        • 1. @import:传统的导入方式
        • 2. @use:现代化的模块化导入

sass中的导入与部分导入

在大型前端项目中,CSS代码量往往十分庞大,为了保持其可读性、可维护性以及便于团队协作,模块化开发成为了一种必然趋势。Sass为此提供了两种导入外部文件的方式——@import@use,它们分别服务于不同的模块化需求,并有着显著的区别。下面我们将深入探讨这两种导入机制,以及它们的最佳实践。

1. @import:传统的导入方式

语法与作用:

@import 'path/to/file.scss';

@import是Sass早期版本中用于引入外部Sass文件的主要方式。它允许你将一个或多个Sass文件的内容合并到当前文件中,最终编译为一个单一的CSS输出文件。

优点:

  • 简单易用,符合CSS原生的@import语义,对于初次接触Sass的开发者来说易于理解。
  • 支持全局变量和Mixin的覆盖,即后导入的文件可以重新定义先前导入文件中的变量和Mixin。

缺点与局限:

  • 全局作用域:所有通过@import导入的变量、Mixin和函数在整个项目中都是全局可见的,这可能导致命名冲突和难以追踪的问题。
  • 无命名空间:无法为导入的内容创建独立的作用域,不利于代码组织和模块化。
  • 编译效率:每次编译时,@import会递归地处理所有导入的文件,可能增加编译时间,尤其是在项目规模较大时。
  • 已弃用:随着Sass的发展,@import因其上述局限性,官方已计划逐步弃用。
2. @use:现代化的模块化导入

语法与作用:

@use 'module' as m;
// 或者直接引用模块中的成员
@use 'module' {// 引入特定成员variable: $my-variable;mixin: my-mixin();function: my-function();
}// 使用模块中的变量、Mixin或函数
m.$my-variable;
@include m.my-mixin();
m.my-function();

@use是Sass 3.5版本引入的新特性,旨在解决@import的诸多问题,提供真正的模块化支持。它引入了一个新的概念——模块,每个Sass文件都可以被视为一个独立的模块,拥有自己的作用域。

优点与改进之处:

  • 模块化:每个模块有自己的命名空间,避免了全局作用域下的变量、Mixin等命名冲突。
  • 按需导入:可以只导入模块中的特定变量、Mixin或函数,减少编译后的CSS体积。
  • 依赖隔离:模块内部的私有成员(以_开头的变量、Mixin等)不会被外部访问,增强了封装性。
  • 编译效率@use仅编译被实际引用的模块内容,提高了编译速度。

最佳实践:

1. 使用@use替代@import

鉴于@import的局限性和官方的弃用计划,建议在新项目中全面采用@use进行模块化导入,并在已有项目中逐步迁移。

2. 利用命名空间组织模块

// _utilities.scss
$primary-color: #1a1a1a;
@mixin text-shadow($color) { ... }// main.scss
@use 'utilities' as u;body {color: u.$primary-color;@include u.text-shadow(u.$primary-color);
}

通过as关键字为模块指定别名(如上例中的u),有助于在样式表中清晰地标记模块来源,提高代码可读性。

3. 按需导入成员

// _grid.scss
$grid-columns: 12;
@mixin make-grid-columns() { ... }
@mixin make-grid-gutters() { ... }// main.scss
@use 'grid' {// 只导入需要的成员variable: $grid-columns;mixin: make-grid-columns;
}.container {width: calc((100% / grid.$grid-columns) * var(--columns));@include grid.make-grid-columns;
}

仅导入实际使用的变量、Mixin或函数,避免无关代码进入编译结果,有利于减小CSS文件大小。

4. 私有成员与公共接口分离

在模块内部,使用_前缀标识私有成员,确保它们不会被外部访问。对外提供清晰的公共接口(无_前缀的成员),便于其他模块或主文件使用。

总之,@use作为Sass的现代化模块化导入机制,极大地提升了CSS代码的组织性和可维护性。尽管在迁移过程中可能会遇到一些习惯上的调整,但长远来看,它无疑为构建健壮、高效的CSS架构提供了有力支撑。拥抱@use,迈向更美好的CSS模块化世界吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/794759.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日一题 第七十期 洛谷 [蓝桥杯 2020 省 AB2] 回文日期

[蓝桥杯 2020 省 AB2] 回文日期 题目描述 2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年 2 月 2 日。因为如果将这个日期按 yyyymmdd 的格式写成一个 8 8 8 位数是 20200202,恰好是一个回文数。我们称这样的日期是回文日期。…

深度学习方法;乳腺癌分类

乳腺癌的类型很多,但大多数常见的是浸润性导管癌、导管原位癌和浸润性小叶癌。浸润性导管癌(IDC)是最常见的乳腺癌类型。这些都是恶性肿瘤的亚型。大约80%的乳腺癌是浸润性导管癌(IDC),它起源于乳腺的乳管。 浸润性是指癌症已经“侵袭”或扩散到周围的乳…

TR3 - Transformer算法详解

目录 文本输入处理词向量位置向量 编码器 EncoderSelf-Attention多头注意力机制残差连接 解码器 Decoder线性层与Softmax损失函数总结与心得体会 这周来看一下Transformer是怎么将文本转换成向量,然后又输入到模型处理并得到最终的输出的。 文本输入处理 词向量 …

【opencv】教程代码 —ml (主成分分析、支持向量机、非线性支持向量机)

1. introduction_to_pca.cpp 主成分分析 /*** file introduction_to_pca.cpp* brief 这个程序演示了如何使用OpenCV PCA 提取物体的方向* author OpenCV团队*/// 包含OpenCV函数库所需要的头文件 #include "opencv2/core.hpp" #include "opencv2/imgproc.hpp&q…

[VulnHub靶机渗透] pWnOS 2.0

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收…

LeetCode刷题实战1:两数之和

从今天开始加入刷题大军,把算法题刷爆,我们直接进入主题。 题目内容 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应…

冒泡排序及qsort实现

冒泡排序的核心思想就是:两两相邻的元素进行比较。 假设有一个数组,它是:8 3 2 7 10 9 1 0 7 4 现在我们要通过两两对比的方式将其升序排列。 我们要先将第一个和第二个对比,如果第一个数较大的话就交换位置。也就是说我们首先…

微信小程序 ---- 慕尚花坊 订单列表

订单列表 本章节为课堂作业 01. 封装订单列表接口 API 思路分析: 为了方便后续进行商品管理模块的开发,我们在这一节将商品管理所有的接口封装成接口 API 函数 落地代码: ➡️ api/orderpay.js /*** description 获取订单列表* returns …

MongoDB聚合运算符:$maxN

文章目录 语法使用空和缺失值的处理 m a x N 和 maxN和 maxN和topN关于窗口功能和聚合表达式的支持关于内存的限制 举例找出一个项目中前三名的得分查找多个比赛项目中得分最高的三个基于$group分组的Key计算n $maxN聚合运算符用于返回聚合分组中最大的n个元素,如果…

160 Linux C++ 通讯架构实战14,epoll 反应堆模型

到这里,我们需要整理一下之前学习的epoll模型,并根据之前的epoll模型,提出弊端,进而整理epoll反应堆模型,进一步深刻理解,这是因为epoll实在是太重要了。 复习之前的epoll的整体流程以及思路。 参考之前写…

CSS - 你实现过0.5px的线吗

难度级别:中级及以上 提问概率:75% 我们知道在网页显示或是网页打印中,像素已经是最小单位了,但在很多时候,即便是最小的1像素,精度却不足以呈现所需的线条精度和细节。因此,为了在网页显示和网页打印中呈现更加细致的线条,为了在视觉…

Prometheus+grafana环境搭建Nginx(docker+二进制两种方式安装)(六)

由于所有组件写一篇幅过长,所以每个组件分一篇方便查看,前五篇链接如下 Prometheusgrafana环境搭建方法及流程两种方式(docker和源码包)(一)-CSDN博客 Prometheusgrafana环境搭建rabbitmq(docker二进制两种方式安装)(二)-CSDN博客 Prometheusgrafana环…

自动驾驶涉及相关的技术

当科幻走进现实,当影视照进生活,无数次憧憬的自动驾驶,正在慢慢的梦想成真。小时候天马星空的想象,现在正悄无声息的改变着我们的生活。随着汽车电动化进程的加快,自动驾驶技术映入眼帘,很多人可能感觉遥不…

逐步学习Go-sync.Once(只执行一次)Exactly Once

sync.Once简介 sync.Once 是一个会执行且仅执行一次动作的对象。该对象在第一次使用后不能再被复制。 在 Go 内存模型的术语中,sync.Once 的 Do 方法中的函数 f 返回的操作,相对于任何对 once.Do(f) 的调用返回的操作,都具有“同步优先”的…

Jupyter Notebook安装使用(一)

1. 简介 Jupyter Notebook 是一个非常强大的工具,它允许用户创建和共享包含实时代码、方程式、可视化和叙事文本的文档。这种工具特别适合数据清理和转换、数值模拟、统计建模、数据可视化、机器学习等多种应用领域。 2. 安装Jupyter Notebook 2.1. 使用 Anaconda…

Java面试题:请解释Java中的多线程编程?

Java中的多线程编程允许 concurrently 执行多个线程,从而可以同时执行多个任务,提高程序的效率和响应性。在Java中,线程可以通过以下两种主要方式来实现: 继承 Thread 类实现 Runnable 接口 继承 Thread 类 class MyThread ext…

Gson的用法

1. 导入依赖 <dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.6</version> </dependency> 2. 使用Gson进行解析 2.1 Gson解析普通对象 package com.jiang.partnetbackend.…

利用Idea实现Ajax登录(maven工程)

一、新建一个maven工程&#xff08;不会建的小伙伴可以参考Idea引入maven工程依赖(保姆级)-CSDN博客&#xff09;&#xff0c;工程目录如图 ​​​​​​​ js文件可以上up网盘提取 链接&#xff1a;https://pan.baidu.com/s/1yOFtiZBWGJY64fa2tM9CYg?pwd5555 提取码&…

Chatgpt掘金之旅—有爱AI商业实战篇|专业博客|(六)

演示站点&#xff1a; https://ai.uaai.cn 对话模块 官方论坛&#xff1a; www.jingyuai.com 京娱AI 一、AI技术创业博客领域有哪些机会&#xff1f; 人工智能&#xff08;AI&#xff09;技术作为当今科技创新的前沿领域&#xff0c;为创业者提供了广阔的机会和挑战。随着AI技…

ABBYY FineReader15免费电脑OCR图片文字识别软件

产品介绍&#xff1a;ABBYY FineReader 15 OCR图片文字识别软件 ABBYY FineReader 15是一款光学字符识别&#xff08;OCR&#xff09;软件&#xff0c;专门设计用于将扫描的文档、图像和照片中的文本转换成可编辑和可搜索的格式。这款软件利用先进的OCR技术&#xff0c;能够识别…