11 月 19 - 20 日 Apache Pulsar 社区年度盛会来啦,立即报名! 了解详情
写点什么

Emotion 10 发布:支持更灵活的样式和全局样式以及服务器端渲染

  • 2019-04-13
  • 本文字数:2527 字

    阅读完需:约 8 分钟

Emotion 10发布:支持更灵活的样式和全局样式以及服务器端渲染

CSS-in-JS 库 Emotion 最近发布了一个主要版本,这是一个备受期待的大版本,带来了很多新特性、改进和缺陷修复,其中有很多很突出的特性。现在可以使用 css 属性给组件添加样式,可以通过更自然的语法来访问主题属性。新增了一个新的 Global 组件,用于动态添加全局样式。这些变更促进了零配置的服务器端渲染。


Emotion 10.0 现在不需要通过 Babel 插件在组件中使用 css 属性,因此,使用 Emotion 库的开发人员可以禁止在项目中使用自定义 Babel 配置(Create React App、codesandbox.io,等等)。现在可以在使用了 css 属性的源文件头部加入 Emotion 的 jsx pragma:


/** @jsx jsx */import { jsx } from '@emotion/core'
复制代码


Emotion 10.0 确定了样式优先规则,并提供了文档。在选择了优先规则之后,通过 css 属性定义的组件样式可以通过父组件传递过来的 className 属性进行自定义。文档对优先规则进行了概括:


包含来自 className 属性指定的 Emotion 样式将覆盖 css 属性指定的样式。

不是来自 Emotion 的类名将被忽略,并被追加到计算好的 Emotion 类名中。


文档中还提供了清晰的示例。组件 ArticleText 覆盖了组件 P 的默认样式,但 P 与 SmallArticleText(覆盖了 ArticleText)有相同的颜色。


/** @jsx jsx */import { jsx } from '@emotion/core'

const P = props => ( <p css={{ margin: 0, fontSize: 12, lineHeight: '1.5', fontFamily: 'sans-serif', color: 'black' }} {...props} // <- props contains the `className` prop />)

const ArticleText = props => ( <P css={{ fontSize: 14, fontFamily: 'Georgia, serif', color: 'darkgray' }} {...props} // <- props contains the `className` prop />)

const SmallArticleText = props => ( <ArticleText css={{ fontSize: 10 }} {...props} // <- props contains the `className` prop />
复制代码


与 CSS 规范当中的出现次序规则一样,后面通过+定义的属性值将覆盖前面通过-定义的属性值。


.css-result{+ margin: 0;- font-size: 12px;+ line-height: 1.5;- font-family: 'sans-serif';- color: black;- font-size: 14px,+ font-family: Georgia, serif,+ color: darkgray;+ font-size: 10px;}
复制代码


SmallArticleText 的样式将包含来自 P 的“margin: 0”和来自 ArticleText 的“color: ‘darkgray’”。不过,为 SmallArticleText 定义的字体大小“font-size: 10px”将覆盖上层组件定义的字体大小。类似的,在 ArticleText 中定义的颜色样式将覆盖在 P 中定义的颜色样式(color: ‘black’)。


正如上述的第二条优先规则所提到的,不是来自 Emotion 的类名对优先规则不会有任何影响。


Emotion 10.0 现在支持组件同时具有 css 属性和通过对象延展语法传递进来的其他属性。css 属性还可以支持用于暴露主题属性的函数式语法,如下所示:


/** @jsx jsx */import { jsx } from "@emotion/core";import { ThemeProvider } from "emotion-theming";import { render } from "react-dom";

function Header(props) { return ( <h1 css={theme => ({ fontSize: 48, fontWeight: 600, color: theme.colors.header })} {...props} /> );}

function BodyText(props) { return ( <p css={theme => ({ color: theme.colors.primary, fontFamily: "sans-serif", fontSize: 18, "&:hover": { color: theme.colors.hover } })} {...props} /> );}

function App() { return ( <ThemeProvider theme={{ colors: { primary: "hotpink", hover: "crimson", header: "dimgray" } }} > <div> <Header>Header Title</Header> <BodyText>Hello Emotion 10!!!</BodyText> </div> </ThemeProvider> );}

render(<App />, document.getElementById("root"
复制代码


上面的例子展示了 css 属性函数式语法(css = { theme => ({…)以及对象延展语法和 css 属性(<p css = {theme => (…) {…props}/>)并存。


新的 Global 组件可用于动态更新或移除全局样式,具体请参考相关的特性文档


import { Global, css } from '@emotion/core'

render( <div> <Global styles={css` * { color: hotpink !important; } `} /> <Global styles={{ '.some-class': { fontSize: 50, textAlign: 'center' } }} /> <div className="some-class"> Everything is hotpink now! </div> </div>)
复制代码


用于显示内容的 div 将会显示一个居中的粉色文本。在样式发生改变或 Global 组件被卸载时,全局样式会被更新或移除。


通过上述的这些变更可以实现零配置的服务器端渲染,发布公告中写道:


如果你使用的是新的 css 属性或 styled,只需要调用 React 的 renderToString(或 renderToNodeStream),其他什么都不用做。这对于组件来说是非常友好的,因为用户不需要做特别的事情就可以使用组件。

你现在可以将带有样式的组件发布到 NPM,用户不需要做额外的事情就可以在服务器端渲染它们。


Emotion 10.0 还包含了很多其他变更、改进和缺陷修复。官网为增量升级到新的 API 提供了一个迁移指南,并且可以借助ESLint插件来自动化部分迁移过程。


CSS-in-JS 是一种 CSS 编排模式,即通过 JavaScript 编排 CSS,而不是把它们定义在外部的 CSS 文件中。Emotion 是一个运行时 CSS-in-JS 库,可以通过对象或 CSS 风格的字符串样式来定义组件样式。运行时 CSS-in-JS 库(如 Emotion 或Styled-components)可以在运行时修改样式,比如在运行时将样式标签注入到文档中。零运行时 CSS-in-JS 库(如LinariaAstroturf)则在构建时抽取所有的 CSS。


Emotion 是一个基于 MIT 许可的开源项目,开发者可以通过Emotion GitHub项目参与贡献,不过需要遵循 Emotion 项目的行为准则和贡献指南。


查看英文原文Emotion 10: CSS-in-JS with Flexible Scoped and Global Styling, and Server-Side Rendering


2019-04-13 08:003650
用户头像

发布了 731 篇内容, 共 405.8 次阅读, 收获喜欢 1966 次。

关注

评论

发布
暂无评论
发现更多内容

甲方日常 65

句子

工作 随笔杂谈 日常

关于Kubernetes和Docker关系的八个问题

杨明越

只需三步!慢日志去无踪

数据君

数据库

关于Redis分布式锁这一篇应该是讲的最好的了,赶紧收藏起来

比伯

Java 编程 架构 面试 技术宅

业务中台建设-数据

孝鹏

架构 中台 数据 赋能

话题讨论 | 立一个近期的flag,你会想到什么?

xcbeyond

话题讨论

operator-sdk & kubebuilder

QiLab

k8s operator-sdk kubebuilder crd

安装MySQL后,需要调整的10个性能配置项

Simon

MySQL percona server

全球熵ETV系统APP软件开发

系统开发

一文教你看懂缓存穿透、击穿、雪崩、降级等异常

鄙人薛某

Java 缓存 后端 缓存击穿 缓存雪崩

开发实践丨用小熊派STM32开发板模拟自动售货机

华为云开发者联盟

物联网 小熊派 开发板

电信新报告 | 数字化转型:搁置还是加速?

VoltDB

5G安全 通信 电子信息

使用JPA实现DDD持久化-O/R映射元数据-特殊属性映射:ID、Version和Transient

编程道与术

Java hibernate 编程 mybatis jpa

企业面临大危机,CRM崩溃告急,程序员竟用特殊手段化解危机!

Learun

敏捷开发 CRM

数据库面试要点:关于MySQL数据库千万级数据查询和存储

华为云开发者联盟

数据库 sql 存储

终于拿到蚂蚁金服Offer!!!分享一下全程面试题和面试经验!

小Q

Java 学习 编程 架构 面试

原创 | 使用JPA实现DDD持久化-O/R映射元数据:映射注解分组

编程道与术

Java hibernate 编程 mybatis jpa

没有它你的DevOps是玩不转的,你信不?

华为云开发者联盟

容器 DevOps 微服务

了不起!靠技术脱贫,他们只用了短短两年!

华为云开发者联盟

人工智能 华为 技术

区块链司法存证应用落地应用解决方案

t13823115967

区块链落地开发

时序数据库DolphinDB与Druid的对比测试

DolphinDB

数据分析 时序数据库 Druid 数据库选择 DolphinDB

P8架构挑战:七大专题1425页考点,你能成功吗?

小Q

Java 学习 程序员 架构 面试

英特尔携手德晟达、游密,发布云会议终端解决方案,打造视听新体验

新闻科技资讯

Java架构速成笔记:七大专题,1425页考点,挑战P8岗

Java架构追梦

Java 学习 面试 java架构

不满意社区的轮子,我们自创了一套 React Hooks 风格的数据加载方案

LeanCloud

API React Hooks

网咯请求中的 connectTimeout 和 soTimeout

不在调上

原创 | 使用JPA实现DDD持久化-领域模型:对象的世界

编程道与术

Java hibernate 编程 mybatis jpa

原创 | 使用JPA实现DDD持久化-O/R映射元数据:类级映射-实体和值对象

编程道与术

Java hibernate 编程 mybatis jpa

JVM调优不知道怎么回答,阿里总结四大模块,学不会就背过来

小Q

Java 学习 架构 面试 JVM

得不到提升的开发老鸟,试试这3个方法,让你事半功倍!

Linux服务器开发

程序员 后端 互联网人 底层应用开发 Linux服务器开发

Emotion 10发布:支持更灵活的样式和全局样式以及服务器端渲染_前端_Bruno Couriol_InfoQ精选文章