JSX-比-StyleX-更强大的前端渲染引擎 (JSX比JX区别)
简介
Meta最近开源了一款"CSS-in-JS库"——StyleX。正如其命名所示,StyleX与JSX(一种"用JS描述"的语法规范,广泛用于React、SolidJS等前端框架)有着密切的关系。Meta设想,StyleX是一种"用JS描述CSS"的语法规范。 早在2019年ReactConf,Meta工程师"Frank"就介绍了Meta内部使用的这种"CSS-in-JS库"。从Meta内部使用到大会对外宣传,其间肯定经历了大量内部项目的洗礼。从做完宣传到最终开源,又经历了近5年时间。那么,这款Meta出品、打磨这么长时间的"CSS-in-JS库"到底有什么特点呢?本文将带你一探究竟。![比](https://tyye.cn/zb_users/theme/tpure/style/images/lazyload.png)
为什么需要CSS解决方案
市面上有许多"CSS解决方案",例如: css .blue { color: blue; } .red { color: red; } HTML: html我是什么颜色?
请问p标签是什么颜色的?从class来看,blue在red后面,p应该是蓝色的吗?实际上,样式取决于它们在样式表中定义的顺序,.red的定义在.blue后面,所以p应该是红色的。 是否已经有点晕了?再增加点难度。如果.red和.blue分别在两个文件中定义呢? css // css文件1 .blue { color: blue; } // css文件2 .red { color: red; } 那么p的样式就取决于最终打包代码中样式文件的加载顺序。 上述只是原生CSS中"选择器优先级相关的一个缺陷"(此外还有其他缺陷,比如"作用域缺失")。随着项目体积增大、项目维护时间变长、项目维护人员更迭,这些缺陷会被逐渐放大。正是由于这些原因,才出现了各种"CSS解决方案"。StyleX的基本使用
StyleX的API非常精简,掌握以下两个即可上手使用: javascript import as stylex from stylex; // 创建样式 const styles = stylex.create({ red: { color: 'red', }, }); // 定义props const redStyleProps = stylex.props(styles.red); 使用时: html相比其他CSS-in-JS的优势
首先要明确,stylex虽然以CSS-in-JS的形式存在,但本质上他是一种"用JS描述CSS的规范"。文章开头也提到,他的定位类似JSX。既然是规范,那么他就不是对CSS的简单封装、增强,而是一套"自定义的样式编写规范",只不过这套规范最终会被编译为CSS。 那么,stylex都有哪些规范呢? 鼓励将样式与组件写在同一个文件,类似Vue的SFC(单文件组件)。这么做除了让组件的样式与逻辑更方便维护,也减少了stylex编译的实现难度。 限制CSS中各种选择器的复杂组合,增强了选择器的灵活性。但同时也会带来上下文限制,使得某些高级CSS技术难以实现。 stylex是一套"规范第一"的CSS-in-JS解决方案,注重样式编写规范的统一和简洁性。与其他CSS-in-JS库的对比
下表对比了StyleX与其他流行的CSS-in-JS库: | 特性 | StyleX | Styled Components | Emotion | CSS Modules | |---|---|---|---|---| | 规范性 | 是 | 否 | 否 | 否 | | 样式与组件分离 | 否 | 是 | 是 | 是 | | 选择器限制 | 是 | 否 | 否 | 否 | | 运行时开销 | 低 | 高 | 低 | 低 | | 兼容性 | 高 | 低 | 高 | 高 |结语
StyleX是一款由Meta开源的"CSS-in-JS库",旨在提供一种"规范第一"的CSS编写方式。它通过限制CSS选择器的复杂组合,鼓励将样式与组件写在同一个文件,从而增强了样式编写规范的统一性和简洁性。虽然StyleX的运行时开销较低,兼容性较高,但在高级CSS技术支持方面存在一定限制。相比其他CSS-in-JS库,StyleX更适合注重规范性和简洁性的项目。 StyleX的开源表明Meta对前端开发的持续关注和投入。我们期待这款"CSS-in-JS库"在未来为前端开发带来更多便利和创新。Blender的渲染引擎
目前 Blender 能支持的渲染器有如下几个,至于它们之间的对比,可以看具体测评。 最新版的 Blender 内置以下两种渲染器:Blender 内部引擎默认内置的渲染引擎,简称 BI(Blender Internal)。 使用 CPU 进行渲染计算,能渲染毛发,支持自由式(Freestyle)卡通描边等,达到一些 Cycles 无法渲染的效果,材质支持完善,支持贴图烘焙。 该引擎的缺点:自发光 Emit:不支持贴图颜色,只支持强度。 自发光颜色只能获取自漫反射,间接照明甚至无法识别通过材质节点混合后的自发光颜色(此 BUG 直到 2.72 时才被修正)。 所以你无法使用彩色贴图,定义发光颜色,另外一个内置渲染引擎 Cycles 则无此问题。 凹凸 Bump:不支持节点系统,例如:将一张 位图 + 噪波(用节点正片叠底混合),或者 程序贴图-砖墙(颜色输入一张位图)。 甚至只是单纯开启节点功能,并只输出一张位图或棋盘格(程序贴图),然后同时用于凹凸和漫反射,漫反射能正常显示,但凹凸无法正常工作,原因在于,纹理一旦通过节点合成后,凹凸贴图的映射方法,将只支持“原始”(其他项都无效),所以无法达到直接使用位图(映射方法为最高质量)的效果。 虽然还未完善,但这个引擎不会再更新了,官方将全部精力用于开发替代品,即 Cycles 渲染器。 Cycles默认自带的渲染引擎,简称 CY。 2011 年发布 2.60 版时新加入的渲染引擎,能使用 CPU 或 GPU 进行渲染计算,并且支持 OSL(CPU 模式)。 使用显卡渲染和较弱的 CPU 相比,能大大减少渲染时间。 刚发布时 GPU 渲染对 CUDA 的最低要求是 SM_1.3(低于此版本的可通过加入额外的 LIB 库文件获得支持。 例如 SM_1.0 的 9800GT,此方法仅对 2.61 有效),但 2.67 及以上版本 GPU 只能使用 CUDA 2.0 以上 (NVIDIA 需要 4xx 系列及以上)和 OpenCL(ATI 需要 7xxx 系列及以上)的显卡进行。 相对来说 GPU 渲染 CUDA 支持更好些,OpenCL 有部分材质尚未支持。 使用的光线算法为路径追踪(Path tracing),该算法的优点是设置参数简单,结果准确。 但缺点是噪点多,且容易产生萤火虫(白色光点)。 成倍提高参数或消减射线数量能消除,但渲染时间会大大增加或导致渲染结果失真。 该引擎的缺点:没有内置渲染器的灯光组功能。 能渲染的材质和对象有限制。 在很长的一段时间内,只能渲染网格物体。 一直到 2013 年才刚刚开始逐步完善支持,毛发 Hair(2.66 版),次表面散射 SSS(2.67 版),体积 Volume(2.70 版),烟雾 Smoke 与火焰 Fire(2.71 版),但都只能使用 CPU 模式。 而贴图烘焙是 2.71 版、卡通描边则在 2.72 版才得以支持。 可以说这些限制在 2.72 版时均已消除(CPU 渲染)。 而 CUDA 的 GPU 渲染则在 2016 年发布的 2.77 版才完成对所有材质类型的支持。 但 OpenCL 的 GPU 渲染依然只实现了部分功能。 置换细分(Displacement / Subdivision)功能属于试验特性,并未正式支持。 程序纹理支持不全,数量不如内置渲染器多,而且除了棋盘格和砖墙外,颜色没有输入端口。 总的来说,这是一个还在完善中的半成品。 Blender 官方推荐的(开源免费)第三方渲染器有以下几种: LuxRender一款基于物理渲染引擎、真实的开源渲染器。 根据渲染方程来模拟光的传输,生成物理真实的图像。 它是一个基于 PBRT 项目,但不同之处在于它关注的是产品渲染和艺术效果,而非学术和科学目的。 它同时支持无偏差(MLT/[双向] 路径追踪)和偏差技术(直接照明,光子映射),物理正确光源,高级程序纹理、光谱灯光运算、动态模糊、灯光组混合。 自 0.8 版本开始还提供 OpenCL 加速渲染功能。 LuxRender 基于 GPL 许可证发布。 对多种主流 3D 软件提供了支持插件,其中就包括 Blender。 YafaRay一个免费开源的光线追踪引擎,追求高品质、照片级真实感的渲染。 Cycles 出现以前 Blender 自带的渲染引擎,使用的光线算法为光子映射(Photon Mapping)、最终聚集(Final Gather)。 和其他的相比,特点在于玻璃材质设置简单,有默认的模板可以选择,并且能够直接支持使用 IES 光域网文件,适合做一些室内场景,非常简单方便。 但不支持渲染 Blender 融球物体。 Blender 是 Yafaray 主要依托的 3D 软件,基于 LGPL 2.1 许可证发布。 Mitsuba一个学术项目,主要用途是作为测试平台,用于计算机图形学的算法开发。 相较于其它的开源渲染器,带有很多实验性的渲染算法。 支持的光线追踪算法更多,这意味着您可以创建场景和渲染不同的方法,看看哪种适合最好。 渲染器的图形 UI 支持交互方式,能实时反馈查看渲染过程。 Mitsuba 的代码使用了可移植的 C++,实现了无偏差和偏差技术,并且有针对性的对 CPU 架构重优化。 可以运行在 Linux,MacOS X 和 Windows,以及使用 SSE2 优化的 x86 和 x86_64 平台。 基于 GNU 通用公共许可证(GPL 第3版)发布。 POV-Ray全名 Persistence of Vision Raytracer,发展始于 80 年代,是一个历史悠久的自由开源渲染引擎。 它使用基础文本(POV 脚本语言)描述场景生成图像,POV 脚本具备图灵完备性,可以编写宏以及循环程序。 支持次表面散射(SSS)和透明度、大气影响,如大雾和媒介(烟,云)、光子映射、暂停和渲染后重启或关机、实时渲染模式等。 从 3.7 版本开始,POV-Ray 基于 AGPL3(或更高版本)的许可证发布。 Aqsis一个符合 RenderMan 规范的跨平台 3D 渲染引擎,注重稳定性和生产使用。 功能包括:构造实体几何(Constructive solid geometry 缩写:CSG)、景深(三维深度场)、可扩展着色引擎(DSOs)、实例化、细节层次(Level-of-detail 缩写:LOD)、运动模糊、NURBS 曲面、程序插件、可编程着色、细分曲面、子像素置换等等。 第三方商业渲染器官方正式支持的如下:VrayVRay 是由 chaosgroup 和 asgvis 公司出品,中国由曼恒公司负责推广的一款高质量渲染软件。 VRay 是目前业界最受欢迎的渲染引擎。 基于V-Ray 内核开发的有 VRay for 3ds max、Maya、Sketchup、Rhino 等诸多版本,为不同领域的优秀 3D 建模软件提供了高质量的图片和动画渲染,方便使用者渲染各种图片。 OctaneOctane 是世界上第一个真正意义上的完全基于 GPU、全能、基于物理渲染的渲染器。 这意味着什么?只使用你计算机上的显卡,就可以获得更快、更逼真的渲染结果…相比传统的基于 CPU 渲染,它可以使得用户可以花费更少的时间就可以获得十分出色的作品。 然而,其它软件就不能像 Octane 这样做到。 你可以仅凭借一块当下的 GPU,就可以期待相比传统的基于 CPU 渲染,达到 10 到 50 倍的速度提升。 Octane 不仅快速,而且完全交互,允许你以过去想都不敢想的工作方式去工作,例如,编辑灯光、材质、摄像机设置、景深等等,你还可以实时获得渲染结果。 它也允许超乎你的想象的速度去工作。 在新的渲染方式下,你将更像是一个摄影师一样去探索你的场景。 Octane 让渲染再次变成了一件有趣的事情。 Octane 是开发 Cycles 的开发人员开发的商业版本渲染器,所以两者十分类似。 这也是第一款支持 Blender 的商业化渲染器。 RendermanRenderMan 是一个计算机图像渲染体系,准确地说是一套基于著名的 REYES 渲染引擎开发的计算机图像渲染规范,所有符合这个规范的渲染器都称为 RenderMan 兼容渲染器。 这其中最著名的有 3delight 和 Pixar 公司的 PhotorealisticRenderMan,同时在业界还有一些其它的免费版开源的 RenderMan 兼容渲染器。 皮克斯的著名渲染工具 Renderman 从 2014 年开始向用户免费提供非商业版本,而用户对 Renderman 的一个请求是支持开源 3D 图形编辑和渲染软件 Blender。 皮克斯满足了这一要求,Renderman 20 加入了对 Blender 的支持。 PRMan for Blender 扩展由 Brian Savery 领导的一个团队开发,当前还是 Alpha 版本,源代码托管在 Gtihub 上。 Maxwell RenderMaxwell 是一款可以不依附其他三维软件可以独立运行的渲染软件,它是基于真实光线物理特性的全新渲染引擎,按照完全精确的算法和公式来重现光线的行为。 采用了光谱的计算原理,打破了长久以来光能传递等渲染技术,使结果更逼真。 Maxwell 中所有的元素,比如灯光发射器,材质,灯光等等,都是完全依靠精确的物理模型产生的。 可以记录场景内所有元素之间相互影响的信息,所有的光线计算都是使用光谱信息和高动态区域数据来执行的。
Meta 新开源的 StyleX 全面解析
Meta的创新之作,StyleX:CSS-in-JS的未来潮流
Meta的新开源库StyleX,引领了多应用CSS开发的新范式,无需依赖传统CSS处理器,为开发者带来了前所未有的便利。让我们一起深入探索这款强大的库,看看它是如何颠覆传统CSS编写的。首先,让我们在React组件中领略StyleX的风采。在文件中(ext类型多样,如, 等),如,定义的变量会被编译为CSS变量,为动态设计提供了可能。
React组件实战
- 引入stylex: 在组件中导入stylex,开启组件的样式之旅。- 多样化的样式: 无论是静态样式,如使用({ ... })和props(styles)(ESM模式下需明确导出),还是动态样式,如create({ dynamic: (r, g, b) => ({ ... }) }),StyleX都支持灵活的动态属性定义。- 主题与动画: defineVars用于创建和管理全局主题,keyframes则支持创建流畅的动画帧,提升用户体验。- 组件样式扩展: 伪元素和伪类如create({ button: { ... }, input: { ... } }),让样式更具针对性。而要将StyleX融入实际项目,只需在Remix Vite环境中安装@stylexjs/stylex和vite-plugin-stylex插件。定义指令并引入,启动你的开发旅程。
工程实践
- JS核心: ()是StyleX的灵魂,它能生成CSS对象,props则整合了className和style属性,实现组件样式的一站式管理。- vite-plugin-stylex是关键,基于trubo和Babel转换器,无缝集成Vite、eslint、nextjs等工具,确保了跨平台的兼容性。StyleX的核心源码位于packages/vite-plugin-stylex,内部巧妙地整合了Flow、jsx和typescript的支持。Vite借助处理代码,引入了特定的插件,实现了高效开发。此外,StyleX的第三方支持丰富多样,包括运行时开发工具、eslint插件、nextjs插件,甚至rollup和webpack的集成,使得StyleX的适用范围更加广泛。最后,open-props模块是StyleX的一大亮点,它内置了众多变量和动画,让经验丰富的开发者能快速上手,实现高效的开发和维护。总结来说,StyleX以其简洁、灵活的API和强大的工程化支持,为开发者打造了一个全新的CSS开发平台。它不仅提升了开发效率,还为设计与开发的协作带来了前所未有的便利。现在,是时候拥抱StyleX,探索CSS-in-JS的无限可能了。免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。