首页
学习
活动
专区
圈层
工具
发布

CSS-in-JS,向Web组件化再迈一大步 | 洞见

(图片来自:http://t.cn/R6njCiV) 在介绍这个概念之前,先来回顾一下在日常编写CSS代码时都有哪些痛点: 全局污染 - CSS的选择器是全局生效的,所以在class名称比较简单时,容易引起全局选择器冲突...命名混乱 - 因为怕全局污染,所以日常起class名称时会尽量加长,这样不容易重复,但当项目由多人维护时,很容易导致命名风格不统一。...BEM (.block__element--modifier) - 比较流行的class命名规则,部分解决了命名混乱和全局污染的问题,但class定义起来还是不太方便,比较冗长,而且和第三方库的命名还是有可能冲突...此段代码产生的html dom如下图所示: 可以看到section和h1上分别生成了唯一的class名称,样式也对应的定义在生成的class上了。 这样就可以解决命名混乱和全局污染的问题。...但它的优点也很多,确确实实解决了很多痛点,而且与web组件化的方向高度一致,希望大家在条件合适的情况下多多尝试,多多反馈,这样也能促进整个CSS编码体验的继续进化~

1.1K80

TypeScript 中命名空间与模块的理解及区别

/export'; 二、命名空间(Namespaces) 命名空间是 TypeScript 中的一个组织代码的方式,主要用于解决全局作用域下的命名冲突问题。...通过命名空间,我们可以将相关的代码组织在一起,并且避免了全局污染。...在大型项目中可能导致全局命名空间污染,难以识别组件间的依赖关系。 通常用于通过 .d.ts 文件为 JavaScript 库定义类型。 模块: 可以包含代码和声明,并且可以声明其依赖关系。...模块内的代码具有局部作用域,不会污染全局作用域。 在 TypeScript 中是组织代码的首选方式,尤其是在大型应用中。...命名空间虽然仍然可用,但在新的 TypeScript 项目中通常不推荐使用,除非是在定义 JavaScript 库的类型时。

53710
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    腾讯 Web UI 解决方案 QMUI Web : 探索与沉淀

    因此,我们需要一套具有如下特点的 Class-name 命名规范: 命名有迹可循,容易编写。 避免命名冲突,包括内部多人协作命名冲突,以及外部库引入时的被动污染。...因此,最终 QMUI Web 制定了一套以命名空间为核心的命名方式,这个命名方式主要由“命名空间”,“业务与组件的拆分”,“精确表达 View”三个部分构成。...命名空间 一个 QMUI Web Class-name 应该包含一个命名空间,也是 Class-name 的开头,如果是业务,则以业务内容为命名空间,如果是公共组件,则全局使用项目的名字(或缩写)为命名空间...业务与组件的拆分 接着,QMUI Web 中把项目的代码划分为通用组件(跨项目的组件),项目全局组件(适用于某个具体项目),业务组件(适用于某个业务),以及业务逻辑代码,这样区分出4个颗粒度可以使得代码更容易被组织和复用...的元素,在经历多次迭代后实际在代码中却充当了页脚,这样的命名在多人协作时很容易给后面的开发者造成困扰,而精准表达 View 则要求我们明确一个 UI 元素的含义,并在命名时准确地表达。

    2.2K30

    React 进阶 - 模块化 CSS

    # 模块化 CSS 的作用 随着 React 项目日益复杂化、繁重化,React 中 css 面临很多问题,比如样式类名全局污染、命名混乱、样式覆盖等。这时, css 模块化就显得格外重要。...css 模块化的几个重要作用: 防止全局污染,样式被覆盖 如果不规范 css 的话,这种情况在实际开发中会变得更加棘手,有时候甚至不得不用 !...important 或者 行内样式 来解决 Web Components 标准中的 Shadow DOM 能彻底解决这个问题,但它的做法有点极端,样式彻底局部化,造成外部无法重写样式,损失了灵活性 解决命名混乱...js 模块一样加载 css ,本质上通过一定自定义的命名规则生成唯一性的 css 类名,从根本上解决 css 全局污染,样式覆盖的问题。...css 样式注入到组件中,项目中应用的已经是含有样式的组件。

    2.2K10

    9.java web的发展 javaweb是什么 J2EE发展历史 规范 J2EE是什么 发展背景 组件标准 J2EE好处作用 Servlet 含义 本质 发展 java在web中的发展 servl

    ,是基于组件的,具有平台无关性的 J2EE使用多层的分布式应用模型 应用逻辑按功能划分为组件,各个应用组件根据他们所在的层分布在不同的机器上。...在性能优化方面,Servlet 也比 CGI 有着更多的选择。 广义上是:基于Java技术的Web组件,被容器托管,用于生成动态内容。...从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。...而且是非常不直观的在Servlet中写前端代码,这使得实现各种页面效果和风格非常困难。...javaBean对象有其特别定义的,规范的命名规则 通常用于封装数据,对于遵循以上写法的JavaBean组件,其它程序可以通过反射技术实例化JavaBean对象,并且通过反射那些遵守命名规范的方法,从而获知

    1.8K10

    React——前端开发中模块与组件【四】

    而编程语言中的导入模块会在当前作用域导入命名空间、符号等,比简单的include要复杂许多。 有关“CSS模块”的问题,我们后面还会讨论。...比如,传统的JS代码组织方法之一,是挂在global上的层级命名空间。此严格上不好称之为“模块”。原因是namespace只提供逻辑划分,不解决代码本身的划分。...在JS这边因为我们已经有很成熟的CommonJS / AMD / ES6 module了,更应避免模糊用法。 组件(对应英文“component”) 另一个概念是“组件”。...第一,实践中的组件方案不止Web Components一种。(现在的情况实际是大多数人还没有用上Web Components。)...JS依赖CSS的情况也是类似的。 另一方面,这导出的class及其样式声明,也未被限定于只能被声明依赖者使用,其效果仍然是全局性的。 所以不建议管这样的东西叫“CSS模块”,这在沟通中很容易造成误解。

    23910

    大型项目中的结构化CSS

    写持续可维护的CSS则很难。 你也许听说过不下100 次了。因为在CSS中默认都是全局的申明。如果你是个C的程序员你知道全局变量是糟糕的。...原因是无前缀的类名最终将会导致和引入的样式冲突。例如你需要一个选色器datepicker - 你绝对不希望胡乱拼凑的去造轮子构建它(至少我不希望如此!),所以一般你会引用这个组件。...当你写它的时候,你也许会想这里仅有一个.profile-description的列表命名,但一两个月后, 你必须要增改另一个列表时,混乱的结构已经超出你能想到的范围。...同样,可以在父元素内的子元素中独立定义样式 - 这并不会受到你在前一阶段Sass这层已经定义好的样式的影响。...规则3: 构建组件时用边界元法(BEM)命名 尽可能试着用BEM命名去创建独立的组件,我们不必完全按照BEM的规范 - 只是用命名组合,这意味着类名以如下的方式命名: .block__element--

    1.3K40

    React组件设计实践总结03 - 样式的管理

    至从那之后出现了很多 CSS-in-js 解决方案. 1️⃣ 全局性 CSS 的选择器是没有隔离性的, 不管是使用命名空间还是 BEM 模式组织, 最终都会污染全局命名空间....尤其是大型团队合作的项目, 很难确定某个特定的类或者元素是否已经赋过样式. 所以在大部分情况下我们都会绞尽脑汁新创建一个类名, 而不是复用已有的类型....important 声明属性, 这无疑是进入了另一个坑. 解决方向:避免使用全局样式,组件样式隔离;样式加载和组件生命周期绑定 ---- 2....一些开发规范 避免无意义的组件名. 避免类似Div, Span这类直接照搬元素名的无意义的组件命名 在一个文件中定义 styled-components 组件....对于比较简单的组件, 一般会在同一个文件中定义 styled-components 组件就行了.

    7.7K20

    封装与隔离:自执行函数在 JavaScript 开发中的重要意义

    这样既能在全局环境中留下尽量少的痕迹,也能让使用者通过指定的接口来访问需要的功能。在进一步讨论中,匿名自执行函数还能避免命名冲突给项目带来难以追踪的错误。...通过自执行函数实现的作用域隔离能够预防命名冲突、减少全局污染、保障关键信息不被随意改写,让项目在不断扩张的过程中依然保持可控、可理解。...有些人也会好奇,为什么不直接写一个普通的函数,然后在需要时调用就行。答案在于匿名自执行函数可以在文件被加载时自动执行,而且不会在全局留下多余的函数名。...当你在管理一支百人团队的大型 Web 前端项目时,设想每个人都可能自定义各式各样的全局变量和函数,如果没有采用自执行函数或其他方式进行模块化,随着时间的推移,全局命名空间就会变得庞大而又混乱。...综上所述,把业务逻辑写进匿名自执行函数里,能够在团队协作和模块化管理方面提供可观的优势,避免全局作用域污染、保护敏感变量、减少命名冲突、提升代码可读性。

    17200

    openwrt外网web管理_OpenAPI

    应用程序也将需要更多的时间来加载,但你能进 行调试开发了。 在前面的章节中,我们解释了 JavaScript 缺少命名空间机制,来分割在不同的 JavaScript 文件中声明的变量。...在 instance 对象内创建与 addon 模块名称一致的新命名空间是个惯例。这就是为什么我们在 instance.oepetstore 设置一个空 dictionary。...$(“input.my_input”) 说明:我们强烈建议你也不要使用,全局 jQuery函数()。这种全局选择器满足简单应用,但在真正的大型 web 应用程序中不好。...例如,通用类名的前缀应该是他们属于的组件的名称(就像在C或Objective-C语言,创建“非正式”命名空间)。 3)应避免用全局选择器。...本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    6.8K10

    css模块化及CSS Modules使用详解

    Facebook 工程师 Vjeux 首先抛出了 React 开发中遇到的一系列 CSS 相关问题。加上我个人的看法,总结如下: 全局污染 CSS 使用全局选择器机制来设置样式,优点是方便重写样式。...命名混乱 由于全局污染的问题,多人协同开发时为了避免样式冲突,选择器越来越复杂,容易形成不同的命名风格,很难统一。样式变多后,命名将更加混乱。...依赖管理不彻底 组件应该相互独立,引入一个组件时,应该只引入它所需要的 CSS 样式。...结合 Webpack 的 css-loader 后,就可以在 CSS 中定义样式,在 JS 中导入。 启用 CSS Modules // webpack.config.js css?...通过这些简单的处理,CSS Modules 实现了以下几点: 所有样式都是 local 的,解决了命名冲突和全局污染问题 class 名生成规则配置灵活,可以此来压缩 class 名 只需引用组件的 JS

    7.2K100

    CSS闯关指南:从手写地狱到“类”积木之旅|得物技术

    一、背景在Web开发网页设计中,CSS(层叠样式表)扮演着至关重要的角色,它用于控制网页的布局、外观和视觉效果。CSS不仅可以美化网页的视觉表现,还可以提高网页的可访问性、可维护性和响应式设计。...上下文割裂的开发体验在传统开发前端页面时,一般在 .html 文件中定义页面结构, .css 文件中定义页面的样式,所以开发时需要频繁在 HTML 模板文件和 CSS 文件之间切换,特别是在现代组件化框架中...※ 作用域污染无解// 编译后的CSS仍是全局样式 .navbar__item--active { ... } // 其他组件可能定义相同类名导致冲突 Sass仅提供语法糖,未改变CSS底层作用域模型...,全局样式污染的问题存在。...CSS模块化方案在CSS模块化中,CSS模块化是一个CSS文件在JavaScript中的一种使用方式,它允许你使用本地作用域的CSS类名,从而避免了全局命名空间污染的问题。

    26710

    TypeScript 中命名空间与模块的区别

    声明,那么它的内容被视为全局可见的 例如我们在在一个 TypeScript 工程下建立一个文件 1.ts,声明一个变量a,如下: const a = 1 然后在另一个文件同样声明一个变量a,这时候会出现错误信息.../export'; 二、命名空间 命名空间一个最明确的目的就是解决重名问题 命名空间定义了标识符的可见范围,一个标识符可在多个名字空间中定义,它在不同名字空间中的含义是互不相干的 这样,在一个新的名字空间中可定义任何标识符...,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其他名字空间中 TypeScript 中命名空间使用 namespace 来定义,语法格式如下: namespace SomeNameSpaceName...但就像其它的全局命名空间污染一样,它很难去识别组件之间的依赖关系,尤其是在大型的应用中 像命名空间一样,模块可以包含代码和声明。...不同的是模块可以声明它的依赖 在正常的TS项目开发过程中并不建议用命名空间,但通常在通过 d.ts 文件标记 js 库类型的时候使用命名空间,主要作用是给编译器编写代码的时候参考使用 参考文献

    58110

    Web Components 初探

    我们继承HTMLElement类来创建自定义节点。在我们的自定义类中,可以定义模板和我们想要的任何行为。...类引用和我们将在HTML中引用的节点的名称。在命名我们的节点时,名称中必须至少有一个破折号。Custom Elements 命名规定至少需要一个破折号,以防止命名与现有HTML节点发生冲突。...Shadow DOM为我们的组件创造一个高度封装的且隔离的DOM环境。 Shadow DOM会保护我们的HTML不被全局CSS或外部JavaScript污染。...例如,在我们上面的模板中,我们有以下CSS: button, p {    display: inline-block;} 在我们的Shadow DOM template中定义样式时,我们的Web组件中的按钮和段落标记将使用内联样式进行设置...Events 就像任何HTML节点一样,我们的自定义节点可以发出自定义事件供我们监听。在我们例子中,我们想知道用户何时更新了计数器组件的值。我们来看看组件值的更新。

    2.8K40

    1、深入浅出React(一)

    样式 通过style属性定义,单属性值不能是字符串只能是对象,且属性名需要使用驼峰命名法(font-size变为fontSize)。 注释 标签内注意需要写在{}中。...事件挂载 JSX中可以通过onClick(HTML原生为onclick) HTML直接使用onclick缺点: onclick添加的事件处理函数是在全局环境下执行,污染全局环境,容易产生意想不到的后果...JSX中的onClick事件(不存在以上问题) onClick挂载的每个函数都可以控制在组件中,不会污染全局空间; JSX中onClick没有产生直接使用onclick的HTML,而是使用了 事件委托...构造函数的工作之一; 如果一个组件需要定义自己的构造函数,一定要在构造函数的第一行super调用父类也就是React.Component的构造函数; 如果没有在构造函数中调用super(props),那么组件实例被构造之后...()); 要使用的子组件中通过声明contextTypes(需要和父组件一致)就可以通过组件实例的context属性访问接收到的数据; 无状态的组件可以在函数参数中获取context;而又状态的组件可以通过

    1.9K10

    TDesign 更新周报(2022年8月第1周)

    组件库Vue2 for Web 发布 0.45.1❗ Breaking Changes调整全局 border-radius 样式 token,@border-radius 改名为 @border-radius-default...使用 esm 包修改 less token 的业务需要注意,组件库中各组件实现圆角也做了统一调整,详情参见 #158 ,存在不兼容更新。...使用 esm 包修改 less token 的业务需要注意,组件库中各组件实现圆角也做了统一调整,详情参见 #158 ,存在不兼容更新 FeaturesSelectInput:SelectInput及相关的...,表尾列显示异常Table: 吸顶线的多级表头,左侧边线缺失问题Cascader: 修复在异步获取 option 的情况下,参数校验导致用户行为异常Popup: 修复 content 为纯英文时无法自动换行...组件支持跨层级响应 gutter 配置 Bug FixesCascader: 修复在异步获取 option 的情况下,参数校验导致用户行为异常Select: 修复回删空字符串不触发 onSearch 的缺陷

    3.8K10

    TypeScript 接口合并, 你不知道的妙用

    JavaScript 模块化开发中的类型定义问题。...早期的 JavaScript 库基本都使用全局的命名空间,比如 jQuery 使用 , lodash 使用 _。...Typescript 通过类型合并这种机制,支持将分散到不同的文件中的命名空间的类型定义合并起来,避免编译错误。 现在是 ES Module 当道, 命名空间的模式已经不再流行。...JSX 内置组件声明 Typescript 下,内置的组件(Host Components) 都挂载在 JSX 命名空间下的 IntrinsicElements 接口中。...现在 Typescript 也支持 JSX 定义的局部化,配合 jsxImportSource 选项来开启, 参考 Vue 的实现 Vue 全局组件声明 和 JSX 类似, Vue 全局组件、全局属性等声明也通过接口合并来实现

    1.4K40

    Vue-Element-Admin使用

    router-view 不同的路由使用统一个component在业务中十分常见,默认情况下,我们切换两个页面并不能触发页面内相同组件的created 或者 mounted 钩子,但我们可以在router-view...,每一个页面的样式就写在当前 views下面,请记住加上scoped 或者命名空间,避免造成全局的样式污染。...样式 样式上存在两个问题: 全局污染 —— CSS 文件中的选择器是全局生效的,不同文件中的同名选择器,根据 build 后生成文件中的先后顺序,后面的样式会将前面的覆盖; 选择器复杂 —...由于 element-ui 的样式我们是在全局引入的,所以你想在某个页面里面覆盖它的样式就不能加 scoped,但你又想只覆盖这个页面的 element 样式,你就可在它的父级加一个 class,用命名空间来解决问题...(如果不写入完整地址,则会默认使用当前运行地址) requestURL为api接口方法下定义,一般为具体的api的具体地址 我们可以通过环境变量设置多个baseURL,从而请求不同的 api 地址。

    1.5K10

    QQ音乐商业化Web团队前端工程化实践总结

    BEM是块(block)、元素(element)、修饰符(modifier)的简写,我们常用这三个实体开发组件。 块(block):一种布局或者设计上的抽象,每一个块拥有一个命名空间(前缀)。...解决全局命名污染的问题; 更贴近Web组件化的思想; 可以在一些无法解析CSS的运行环境下执行,比如React Native等; JS赋予CSS更多的编程能力,实现了CSS和JS间的变量共享; 支持CSS...解决全局命名污染的问题; 默认是局部的,可以用:global声明全局样式; 受CSS的限制,只能一层嵌套,和JS无法共享变量; 能支持现在所有的CSS技术。...slot,它是定义在宿主和template中的一个插槽,用来“占位”。...在web开发过程中的Webhook,是一种通过通常的callback,去增加或者改变web page或者web app行为的方法。

    4.6K112
    领券