Rax 介绍
Rax 在 DSL 层面与框架设计方面借鉴了 React 的部分思想,但是舍弃了 React 部分传统的 API,所以体积上更加轻量,渲染更快,可以无缝把 React 项目转换为 Rax 项目。在做 2C 业务时,比较关注页面渲染性能以及对应的秒开率,业务折损率,到达率以及参与率。除了不可控因素外,JS 大小也会严重影响页面白屏和首屏时间(JS加载和JS解析),这个已经在实际业务中得到验证。所以想在 Size 大小方面进行一些实践。经过调研,社区有提供了对应的轻量级兼容 React 的解决方案 PReact 和 Rax。为了更贴近本职周边技术体系, 这里暂先研究 Rax 解决方案。
Rax vs React
- Size 大小 Rax 相比 React 有非常明显的优势, 这个非常适合 2C 注重性能的业务。
- SSR 渲染耗时用相同的功能初步对比了一下,初步看 Rax 要比 React 快(页面逻辑不够复杂, 不太明显)。
模块 | 大小(压缩) | SSR 渲染耗时 |
---|---|---|
Rax | 17KB | render: 6.794ms render: 1.439ms render: 3.877ms render: 2.353ms render: 3.455ms render: 1.704ms render: 5.495ms render: 1.680ms render: 1.208ms render: 2.751ms render: 1.784ms render: 1.820ms render: 1.850ms render: 1.320ms render: 1.760ms render: 0.872ms |
React | 128KB | render: 8.283ms render: 5.603ms render: 2.629ms render: 2.747ms render: 4.049ms render: 7.660ms render: 4.906ms render: 4.475ms render: 1.115ms render: 1.626ms render: 1.476ms render: 1.557ms render: 2.519ms render: 1.248ms render: 1.934ms |
前端渲染 React 项目转换为 Rax 项目
按如下操作即可实现 React 项目转换为 Rax 项目
- 安装 rax 和 rax-dom 依赖
- 在
webpack.config.js
module.exports= {
'''
resolve: {
alias: {
'react': 'rax/lib/compat',
'react-dom': 'rax-dom'
}
}
'''
}
Egg React SSR 项目转换为 Egg Rax 项目
SSR 渲染转换相对复杂一些,这个涉及 Node Server Render 部分逻辑改造,但总体上 Rax 与 React 在设计上保持一致。因 easy 整个体系可解耦,可扩展,可组合的特点,所以可以很方面的的实现 Egg Rax SSR 解决方案(Preact 也一样)。
首先按照上面前端渲染配置 webpack alias, 然后安装以下两个插件即可实现 Egg React SSR 项目转换为 Egg Rax SSR 项目:
使用上面与 Egg React 工程体系方案一致, 只需要把 Egg React 工程体系方案 涉及的对应插件和配置改成上面的插件方式即可。 骨架代码见 egg-react-webpack-boilerplate 项目的 rax 分支。
目前整个方案可正常运行,更多实现待挖掘和完善。