css如何调整红心样式_在JavaScript应用程序中包含CSS的多种方法「渡一」

原文链接:https://css-tricks.com/the-many-ways-to-include-css-in-javascript-applications/,作者:Dominic Magnifico

如有翻译不准确,请多指正。

a2d40f21c834f0318d9b14fd884354f0.png

欢迎来到这个在前端开发领域极具争议性的话题!我相信读到这篇文章的大多数人都曾遇到过关于#如何在JavaScript应用程序中处理CSS#相关的热门问题。

在这篇文章之前,我想声明一句:没有什么硬性标准可以确定在React、Vue或Angular应用程序中处理CSS的哪一种方法是最好的。每个项目都是不同的,每个方法都有自己的优点!这样说好像有点含糊不清,但我知道的是,我们所处的开发社区中有很多人去不断寻求新信息,他们希望以更加有意义的方式推动web向前发展。

暂且把关于这个主题先入为主的概念放在一边,让我们来看看迷人的CSS体系结构世界吧!

首先让我们一起来盘点一下这些方法

简单地搜索“如何将CSS添加到[在此处插入框架]”就能出现一系列关于如何将样式应用于项目的意见。为了帮助大家进行筛选摘除,我们将从各更高级的角度研究一些常用的方法及其目的。

选项1:传统样式表

我们完全可以用一种熟悉的方式开始:一个传统样式表,完全可以在应用程序之中链接一个外部样式表,这样就可以完工了。

2309a3efa4599ea763347180c0c95896.png

我们可以按照我们的习惯编写CSS,然后继续我们的生活。这根本没有什么问题,但是随着应用程序越来越大、越来越复杂,维护单个样式表就越来越难了。解析数千行CSS(这些CSS负责设计整个应用程序的样式)对于从事该项目的任何开发人员来说都是一件痛苦的事情。

样式级联看起来很美好但它也变得很难管理,因为你或项目上的其他开发者编写的一些样式会在应用程序的其他部分引入回归。我们之前也遇到过这些问题,并且引入了Sass之类的东西(以及最近的PostCSS)来帮助我们处理这些问题。

我们可以继续沿着这条路走下去,利用PostCSS的强大功能来编写非常模块化的CSS部分,这些部分通过@import规则串在一起。这需要在webpack配置中进行一些工作才能正确设置,但这些事情大家肯定可以处理!

无论你决定用哪种编译器,你都可以通过标题中的标记获得一个包含应用程序所有样式的CSS文件。根据应用程序的复杂程度,这个文件可能会变得非常臃肿,难以异步加载,并且应用程序的其余部分会出现租用者阻塞。(当然,阻塞并不总是一件坏事,但是为了所有的意图和目的,我们将在这里泛化一点,尽可能避免渲染阻塞脚本和样式。)

这并不是说这种方法毫无优点,对于小型应用程序,或者由不太关注前端的团队构建的应用程序,单个样式表可能是一个不错的选择。它在业务逻辑和应用程序风格之间提供了清晰的分离,而且由于它不是由我们的应用程序生成的,因此完全在我们的控制范围内,以确保我们编写的内容与输出的内容完全一致。此外,浏览器缓存单个CSS文件相当容易,因此返回的用户在下次访问时不必重新下载整个文件。

但是假设我们正在寻找一个更健壮的CSS架构,它允许我们利用工具的强大功能。它可以帮助我们管理一个需要更多微妙方法的应用程序,输入CSS模块。

选项2:CSS模块

单个样式表中的一个相当大的问题是回归的风险。编写使用相当非特定选择器的CSS可能最终会改变应用程序中完全不同区域的另一个组件。这就是所谓的“作用域样式”派上用场的地方。

带作用域的样式允许我们以程序化的方式生成特定于组件的类名。因此,将这些样式限定到该特定组件,以确保其类名是唯一的。这将导致自动生成的类名,例如header__2lexd。最后一点是一个哈希值,它是唯一的,因此即使你有另一个名为header的组件,也可以对其应用标题类,并且我们的作用域样式将生成一个新的哈希后缀,如下所示:header__15qy_。

CSS模块提供了控制生成的类名的方法(具体取决于实现),但是我将把这个问题留给CSS模块文档来讨论。

所有这些都完成之后,我们仍然在生成一个CSS文件,该文件通过标头中的标记传递给浏览器。这带来了同样的潜在缺点(渲染阻塞、文件大小膨胀等),当然也有好处主要是缓存作用。但是,由于这种方法的作用域样式附带了另一个警告:删除全局作用域——至少在最初是这样。

假设你想使用.screen-reader-text全局类,该类可以应用于应用程序中的任何组件。如果使用CSS模块,则必须使用:global伪选择器,该选择器将其中的CSS明确定义为可被应用程序中其他组件全局访问的对象。只要将包含global声明块的样式表导入到组件的样式表中,就可以使用该全局选择器。这不是一个很大的缺点,但是需要逐渐适应。

这是一个:global伪选择器的示例:

101277f5b68e604d97b0bd466247d974.png

你可能会冒着将一堆用于字体,表格以及大多数站点的通用元素的全局选择器放到一个单独的global选择器中的风险。幸运的是,通过诸如PostCSSNested或Sass之类的魔术,你可以将部分代码直接导入选择器中,以使事情更简洁:

9bb5db09996dcb36d9597103a66dfa54.png

这样,你可以不使用:global选择器来编写局部文件,而直接将其直接导入到主样式表中。

需要习惯的另一点是如何在DOM节点中引用类名。我将在这里以Vue,React和Angular的各个文档为例。我还将为你提供一些示例,说明这些类引用在React组件中的使用方式:

4fd3a0eee8fde5513ec5ae76e42d30c4.png

同样,CSSModules方法具有一些很好的用例。对于希望利用范围样式,同时保持静态但已编译样式表的性能优势的应用程序,CSS模块可能是最适合你的选择!

在这里也要注意,CSS模块可以与你喜欢的CSS预处理功能结合使用。Sass,Less,PostCSS等都可以使用CSS模块集成到构建过程中。

但是,假设你的应用程序可以通过包含在JavaScript中而受益。也许获得对组件各种状态的访问权并根据不断变化的状态做出反应也将是有益的。如果你也想轻松地将关键CSS集成到的应用程序中去,那就输入CSS-in-JS吧。

选项3:CSS-in-JS

CSS-in-JS是一个相当广泛的主题。有几个包可以使CSS-in-JS的编写变得尽可能轻松。像JSS、Emotion和样式组件之类的框架只是构成本主题的众多包中的一小部分。

作为大多数这些框架的粗略解释,CSS-in-JS基本上以相同的方式运行。你编写与单个组件关联的CSS,并且构建过程将编译该应用程序。发生这种情况时,大多数CSS-in-JS框架只会输出在任何给定时间在页面上呈现的组件的关联CSS。CSS-in-JS框架通过在应用程序的

中的


我们还需要解决CSS-in-JS解决方案的潜在缺点——而且绝对不要试图引发更多的闹剧。使用这样的方法,我们很容易陷入一个陷阱,这会导致我们得到一个膨胀的JavaScript文件,其中可能包含数百行CSS——而这一切甚至在开发人员看到任何组件的方法或其HTML结构之前就已经出现了。


然而,我们可以将此视为一个机会,来非常仔细地检查我们是如何以及为什么以这种方式构建组件的。通过更深入地考虑这一点,我们可以潜在地利用它,并使用更多可重用组件编写更简洁的代码。


此外,此方法绝对模糊了业务逻辑和应用程序样式之间的界限。但是,有了一个有据可查且经过深思熟虑的体系结构,该项目中的其他开发人员可以轻松地采用这种想法,而不会感到不知所措。


写在最后


有多种方法可以处理任何项目上的CSS体系结构的难题,并且可以在使用任何框架时进行处理。作为开发人员,我们拥有如此众多的选择,这既令人兴奋,又令人难以置信。但是,我认为,最终我们会在超短的社交媒体对话中迷失的首要原因是——每种解决方案都有其优点和效率低下的弊病。这是关于我们如何谨慎,周到地实施使我们自己/或其他可能接触代码的开发人员的系统的感谢,感谢我们花时间建立该结构。

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

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

相关文章

小新pro13 重装注意_新款小新pro 13注意什么?买前必读

导读:看到这一款本本,你的感觉是什么呢?精巧、美丽,性能强劲还是高分辨的屏幕呢?一起看一看2020款的联想(Lenovo)小新Pro13,要注意哪些事项?请听小编简单跟你唠几句~1、买联想小新pro的&#xf…

服务禁止方法_Linux禁止ping以及开启ping的方法

今天浏览一个网站,本着好奇的心态ping一下,发现不管是ping域名和IP都是不通的。这就比较郁闷了,后来百度后知道原来服务器是可以设置禁止ping的,看来是我孤陋寡闻了,接下来给大家分享一下服务器如何禁止ping。Linux默认…

java 多态判断非空_Java核心技术(四):继承

本章目录:一、类、超类和子类1.多态2.动态绑定3.阻止继承:final类和方法4.抽象类5.访问修饰符总结二、Object类:所有类的父类1.equals方法2.hashcode方法3.toString方法三、对象包装器与自动装箱四、反射1.Class类2.捕获异常3.利用反射分析类…

互相引用 spring_听说你还不知道Spring是如何解决循环依赖问题的?

作者:Vt前言Spring如何解决的循环依赖,是近两年流行起来的一道Java面试题。其实笔者本人对这类框架源码题还是持一定的怀疑态度的。如果笔者作为面试官,可能会问一些诸如“如果注入的属性为null,你会从哪几个方向去排查”这些场景…

打印多页时两边取消留白_办公必备技巧:Word打印技巧大全

打印是每一位办公族都要掌握的一项最基础的技能。平常在用WORD写作、对文章进行排版等,最终我们都是需要将其打印到纸张上。在打印中有着众多的操作技巧,如果你还不会,那今天易老师就来给你科普一下。本文目录第一部分:基础打印操…

中raise抛出异常_Python 异常处理知识点汇总,五分钟就能学会 !

异常处理在任何一门编程语言里都是值得关注的一个话题,良好的异常处理可以让你的程序更加健壮,清晰的错误信息更能帮助你快速修复问题。在Python中,和不分高级语言一样,使用了try/except/finally语句块来处理异常,如果…

easyexcel多个sheet导入_Java中Easypoi实现excel多sheet表导入导出功能

Easypoi简化了开发中对文档的导入导出实现,并不像poi那样都要写大段工具类来搞定文档的读写。第一步引入Easypoi依赖cn.afterturneasypoi-spring-boot-starter4.2.0Easypoi的注解使用说明(存留查看即可)第二步定义对应表格头数据对象实体类(注解的使用可以查阅上面的…

mysql 严格模式_MySQL 开启/关闭 严格模式(Strict Mode)

[广告:最高 2000 红包]阿里云服务器、主机等产品通用,可叠加官网常规优惠使用 | 限时领取查看 Mysql 是否开启严格模式:打开 MySQL 配置文件 my.cnf(windows为my.ini)。搜索 sql-mode 如果搜索不到就代表 非严格模式 。搜索到了就代表开启了严…

mysql 导入日期 0000_解决Excel导入MySQL日期为0000-00-00

最近在为客户做一个库存升级改造的项目,之前客户的数据管理全部是在Excel中操作,估计以前也是没有意识到数据量变大以后,工作会变得如此困难,基本上处于一个无法操作的程度了。于是我们将旧版本的Excel表格格式化以后,…

关于mysql优化_关于MySQL优化的几点总结

前言现如今,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显。所以,我整理了MySQL优化的几点建议,希望这些优化技巧对您有用,总结不到的,欢迎大家补充。SQL执行慢的原因网络速度慢&am…

ubuntu忘记mysql密码_ubuntu 忘记mysql 密码解决方法

一段时间没有用mysql数据库,今天突然需要使用,结果忘记密码,google了下找到的解决方法,就顺便记录下,下次碰到就不需要这么麻烦了1、输入命令 cat /etc/mysql/debian.cnf2、使用账号 debian-sys-maint 账号登录mysql密…

navicat mysql创建表_Navicat for MySQL如何创建数据表

Navicat for MySQL是针对MySQL数据库管理而研发的管理工具,创建数据表是其最基本操作,本教程将详解Navicat for MySQL创建数据表的方法。 步骤一:新建连接 运行Navicat数据库管理工具,连接本地数据库。点击左上角“文件”或者工具栏“连接”图标,创建自己的数据库连接。Na…

mysql-5.1.73-8.el6_在centos中安装mysql详细步骤说明

Last login: Sun Dec 24 04:55:59 20171、安装依赖[rootnode001 ~]# yum install -y perlLoaded plugins: fastestmirrorLoading mirror speeds from cached hostfilebase | 3.7 kB 00:00extras | 3.4 kB 00:00updates | 3.4 kB 00:00Setting up Install ProcessPackage 4:perl…

lte盲重定向_LTE重选、切换、重定向的区别

【资料名称】:LTE重选、切换、重定向的区别【资料作者】:A【资料日期】:20150916【资料语言】:中文【资料格式】:DOC/DOCX【资料目录和简介】:这里主要简单阐述了LTE系统的小区重选、切换、重定向的区别小区…

冯乐乐 unity_Unity常用矩阵运算的推导补遗——切线空间

在上一篇文章中,我写了一些关于Unity中各个坐标空间及其转换矩阵是如何得到的,说实在的,我是那种“记忆需要依靠外部装置存储”类、如同《攻壳机动队》的电子脑一样的人,每次遇到问题了再去对着笔记慢慢翻找才是我的风格&#xff…

mysql 字段类型设计_Mysql字段类型设计相关问题!-阿里云开发者社区

Mysql是以文件存储在我们的系统的硬盘上面,那么(1)当我们读取写入的时候就会有磁盘IO的问题(2)当我们存储的数据是以页单位存储,而且每页的大小是16K,那么我们要尽可能的让我们的一页数据存放的更多。表结构宽度不要太大,也就是列…

mysql保存时乱码了_MySQL保存中文乱码的原因和解决办法

(3)MySQL的字符集设置。这个是重点了,一般都是在这里搞错而出现了mysql乱码。mysql编码设置可以分为三种设置:数据库的编码、表的编码、和字段的编码。a、数据库的编码:在sqlyog工具中操作把,右击数据库点击更改数据库&#xff0c…

python中convert函数用法_Python Pandas DataFrame.tz_convert用法及代码示例

Pandas DataFrame是带有标签轴(行和列)的二维大小可变的,可能是异构的表格数据结构。算术运算在行和列标签上对齐。可以将其视为Series对象的dict-like容器。这是 Pandas 的主要数据结构。Pandas DataFrame.tz_convert()用于将tz-aware轴转换为目标时区。用法&#…

python偶数个数_python基础

标识符命名规则开发中,通常约定俗称遵守如下规则:删除变量和垃圾回收机制可以通过del语句删除不在使用的变量a 123 del a #删除了栈,没有删除堆链式赋值xy123 相当于 x123;y123系列解包赋值系列数据赋值给对应相同…

keyshot怎么让物体发光_户外发光字的防水措施怎么做,不亮了怎么修。

户外发光字的防水措施与维修发光字大多是安装在户外的,因此会受到热晒、雨淋、寒冻等因素的影响,这些因素都会加速LED发光字的老化,从而使LED发光字进水老化。那么,该怎么防止这种情况呢?一、在每个广告字的笔画的最下方&#xf…