Rax

跨容器的渲染引擎
授权协议 BSD-3-Clause
开发语言 JavaScript HTML/CSS
所属分类 手机/移动开发、 React 开源项目
软件类型 开源软件
地区 国产
投 递 者 魏康安
操作系统 跨平台
开源组织 阿里巴巴
适用人群 未知
 软件概览

Rax 是一个超轻量,高性能,易上手的前端解决方案。一次开发多端运行,解放重复工作,专注产品逻辑,提升开发效率。

特性:

  • 超轻量:Gzipped 之后仅 6.7K

  • 高性能:快速的虚拟 DOM

  • 易上手:兼容 React API

快速开始:

基于 npm init rax 命令,可以快速创建一个 Rax 多端应用(注意:npm 版本需 >= 6.1.0):

$ npm init rax <YourProjectName>

初始化项目过程中, 您可以根据提示选择一个或多个需要投放的端,目前可供选择的有 Web、 Weex、Alibaba Miniapp、WeChat MiniProgram、Kraken (Flutter):

使用方向键导航到具体项目,使用空格选中或者取消选中。

Choose targets your project want to run? (Press <space> to select, <a> to toggle all, <i> to invert selection)
❯ ◉ Web
   ◯ Weex
   ◯ Alibaba MiniApp
   ◯ WeChat MiniProgram
   ◯ Kraken (Flutter)

面向 Web 端,您还可以选择性的开启 SSR(服务器端渲染) 能力来增强应用体验。

? Do you want to enable these features?
❯◉ server sider rendering (ssr)

Rax 的多端项目遵循同一套工程结构和开发规范,一次开发,便可同时被投放于 Web、Weex、小程序等多个容器,从而避免了业务在多端投放需求下的重复开发工作。

关于 Rax 的介绍

2015 年双十一,Weex 的方案开始逐步使用,经过这次试水,证明了这套方案未来的场景及可行性,接着 2016 年 Weex 开始进入快速发展的阶段。但是使用 Weex 就意味着必须用 Vue 的语法,这对于整个团队来说是一个不小的挑战:PC 场景下的项目,小伙伴们普遍基于 React 开发,已经有了相当多的经验与沉淀。如果无线的项目要采用一个不同方案(Vue)去做,强推未必会不奏效,但是小伙伴们大概会伤心吧。

于是我们尝试将 React 与 Weex 结合起来,但是由于方案太过 hack 导致各种问题,遂无奈放弃。接着 Rax 的方案应运而生:「Rax 基于 React 的标准,支持在不同容器中渲染,当前最重要的容器即 Weex 和 Web」。

Rax 与 React

React 是一种标准,Rax 是对该标准的一个实现。Rax 只是无线端的解决方案,与 React 并无冲突。事实上淘宝 PC 端的新项目,依然主要是基于 React。当然,Rax 跟 Preact 之类的方案也有本质区别,前者偏向于解决多端问题,后者偏向于解决性能问题,具体可参考下文「Rax 的特点」。

Rax 的特点

1、设计上支持不同容器

Rax 在设计上抽象出 Driver 的概念,用来支持在不同容器中渲染,比如目前所支持的:Web, 小程序(支付宝、微信等)、Weex, Node.js(SSR), Flutter(Kraken). 基于 Driver 的概念,未来即使出现更多的容器(如 VR 等),Rax 也可以从容应对。Rax 在设计上尽量抹平各个端的差异性,这也使得开发者在差异性和兼容性方面再也不需要投入太多精力了。

2、体积足够小

如上文所述,Rax 是一个面向无线端的解决方案,因此自身的体积对于性能来讲就显得非常重要。Rax 压缩 + Gzip 后的体积是 6.7kb, 相比 React 的 43.7kb, 对于无线端友好了很多。

3、支持返回多个同级节点

任何用过 React 的同学大概都踩过同一个坑:方法返回了多个同级节点导致报错。在设计上 React 只能返回单个节点,因此页面上或多或少会产生一些冗余的节点,这在 PC 端并没有太多问题,然而在无线 Android 端嵌套层级越多,应用的 Crash 率会不断提高,这一点在低端 Android 机上表现尤其明显。因此 Rax 支持了返回多个同级节点的功能,如:

import {createElement, Component, render} from 'rax';

class Test extends Component {
  render() {
    return [1, 2, 3].map((item) => {
      return <p>{item}</p>;
    });
  }
}

这一特性可以有效减少页面的嵌套层级,从而减少应用因嵌套层级过多而出现的 Crash 问题。

4、标准化

在上文里,我们不断的提各个端的一致性,一致则必有规范可依,Rax 遵循 W3C 标准,比如在 Weex 容器中已经可以直接调用 navigator, document, location, alert 等 W3C 的标准 API.

当然,受限于各个端的差异,标准化的道路还很长,「更标准化」这也是 Rax 未来的重要目标之一。

未来

Write once, run everywhere. 这是口号,亦是目标。Rax 未来会在更多的端上不断探索,比如 VR/AR, 甚至之前微博上有同学提出的是否可以用 Rax 写微信小程序,也是一个蛮有意思的想法。

对于开发者来说,当越来越多的端不断出现在眼前时,我们应该如何应对?是通过不断的踩坑来整理一份长长的 checklist, 然后做项目时一一对照? 或者让我们一起来探索 Rax?

了解更多 Rax 相关内容,欢迎访问 https://rax.js.org

  • |63..32|31..16|15-8|7-0| |AH.|AL.| |AX.....| |EAX............| |RAX...................| 一般寄存器:AX、BX、CX、DX AX:累积暂存器,BX:基底暂存器,CX:计数暂存器,DX:资料暂存器 索引暂存器:SI、DI SI:来源索引暂

  • 前言 本文参考源码版本为 redis6.2 前缀树是字符串查找时,经常使用的一种数据结构,能够在一个字符串集合中快速查找到某个字符串,如下图所示: (f) "" \ (o) "f" \ (o) "fo"

  • 刷机须知 1:请刷机的朋友认真阅读本帖!!!刷机带来的风险请自行承担!!! 2:将网件路由器刷成梅林固件可能会让你的路由器失去售后质保!!! 3:欢迎转载本帖,但是请一定尊重开发组的成果,注明本帖来源!!! 操作步骤 刷机须知 请仔细阅读本部分的刷机步骤!建议刷机前对下载的固件的md5进行校验,以确保固件文件的完整性。 .img后缀固件用于网件刷梅林,称为过渡固件,.trx后缀固件用于梅林刷梅林。

 相关资料
  • 渲染引擎用于渲染内容。 概要 hexo.extend.renderer.register(name, output, function(data, options){ }, sync); 参数 描述 name 输入的扩展名(小写,不含开头的 .) output 输出的扩展名(小写,不含开头的 .) sync 同步模式 渲染函数中会传入两个参数: 参数 描述 data 包含两个属性:文件路径 pat

  • 字体渲染引擎的工作主要是字体文件操作和文字渲染,LCUI 将其抽象成了 LCUI_FontEngine 接口,使得 LCUI 的字体渲染引擎可被切换和扩展。 目前基于该接口实现的引擎有内置引擎和 FreeType 引擎,接下来我们再深入了解它们。 内置引擎 内置引擎是 LCUI 初始化的第一个引擎,它主要用于在无其它可用引擎的情况下加载预置的字体位图数据,以确保界面中的文字能够被渲染出来。 内置引

  • 使用步骤 下载 小程序内容渲染包 wxParser 把 wxParser 目录放到小程序项目的根目录下 在需要富文本解析的的 WXML 内引入 wxParser/index.wxml 在页面 JS 文件内使用 wxParser.parse(options) 方法解析 HTML 内容 在需要展示富文本内容的页面的 wxss 文件内引入 wxParser 的默认样式库 wxParser/index.w

  • 如果你调研服务器端渲染(SSR)只是用来改善少数营销页面(例如/,/about,/contact等)的 SEO,那么你可能需要预渲染。无需使用 web 服务器实时动态编译 HTML,而是使用预渲染方式,在构建时(build time)简单地生成针对特定路由的静态 HTML 文件。优点是设置预渲染更简单,并可以将你的前端作为一个完全静态的站点。 如果你使用 webpack,你可以使用prerende

  • 我试图使我的头的背景具有渐变。 这可以很好地使用代码: 然而,由于某种原因,我看不到我的边框和文本,似乎文本也应用了渐变? 我希望文本为黑色,各栏之间有彩色边框。有什么想法吗?

  • SVGRenderer被用于使用SVG来渲染几何数据,所产生的矢量图形在以下几个方面十分有用: 动画标志(logo)或者图标(icon) 可交互的2D或3D图表或图形 交互式地图 复杂的或包含动画的用户界面 SVGRenderer具有很多优势。它产生清晰并且锐利的图像输出,它和实际视口分辨率无关。 SVG元素可以通过CSS来控制样式;并且由于它可以添加诸如标题或者描述文字之类的元数据(对于搜索引擎

  • 由于 Electron 使用 Chromium 显示网页,那么,Chromium 的多进程架构也被使用。Electron 中的每个网页都在自己的进程中运行,称为渲染器进程 (renderer process)。 在正常的浏览器中,网页通常运行在沙盒封装化的环境中,并且不允许访问本机资源。然而,Electron 用户有权在网页中使用 Node.js 的 API,从而允许较低级别的操作系统交互。 选自

  • BK.Render 渲染器 方法 clear(red,green,blue,alpha) 清除颜色缓冲区 参数 类型 名称 备注 red number 红色 green number 绿色 blue number 蓝色 alpha number 透明度 例子: BK.Render.clear(1,1,1,1); //r,g,b,a render(node,duration) 渲染单个节点 参数