热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

手摸手带你学Raxjs

锵锵锵~小伙伴们,新出的会议室预约系统用着还顺手吗?快告诉我,系统响应快不快?预约网红会议室像不像淘宝双十一的

锵锵锵~
小伙伴们,新出的会议室预约系统用着还顺手吗?快告诉我,系统响应快不快?预约网红会议室像不像淘宝双十一的大抢购?悄悄告诉你,会议室预约系统采用的前端框架,就是淘宝双十一的 Rax。
那什么是 Rax,怎么用 Rax,什么时候用 Rax 涅。接下来,前端女同学就来聊聊会议室预约系统的前端技术使用。

在这里插入图片描述


What

什么是 Rax 呢,来看官方定义:Rax 是用于构建通用应用程序的渐进式 React 框架,其内部提供基础UI组件。目前,在阿里系公司展开使用,并在淘宝双十一购物节中独领风骚。
通过上面定义我们知道,Rax 是基于 React 标准,并支持在不同容器中渲染(当前最重要的容器即 Weex 和 Web )。
核心思想两个 “ React ” 标准和 “ 跨容器 ”。别问为什么,先记住,快,我知道你要问什么;因为接下来我要讲 Rax 和 React 的关系了,听完你就没有疑惑了。


Rax 和 React


  1. 我们可以把React 看作是一种标准,那么Rax 是对该标准的一个跨容器框架的实现。Rax 只是 React 的无线端的解决方案,与 React 并无冲突,可以把 Rax 看作是一种扩展;
  2. Rax 没有 createClass() 方法;
  3. Rax 可以返回多个结点,React 只能有一个结点;
  4. React 中的生命周期在 Rax 也同样可用,一些副作用和钩子函数也可使用。

说到这里,你一定会想到,state 状态的设计一定也一样,然而并不是。


setState不同

setState(),在 React 中是异步的,而 Rax 中是同步的。
先回顾一下 React 中怎么处理setState问题。


React 的 setState 机制

在 React 中,如果是由 React 事件引发的 setState(如 onClick ),调用 setState 是异步更新,除此之外的 setState 是同步执行(如 addEventListener 和定时器等)
在这里插入图片描述

React 会把每一次的 setState 操作放入一个队列里面,会先判断是否由 React 事件引发的 setState ,来判断是直接更新还是批量更新。


  1. 先对 React 的事件进行标记;
  2. 将 React 事件引发的 setState 更新放入异步队列中并 dirty 标记,需要批量更新 state,把 VDom 到 Dom 的操作降到最小;
  3. 非 React 事件引发的 setState ,进行同步执行直接更新;

Rax 的 setState 机制

Rax 的 setState 为同步更新。只要调用 setState 就会直接更新对应的状态。
然而 setState 是会引起视图的更新会引发重绘,会重新走一遍更新阶段的生命周期,势必会带来性能问题,开发者需要控制好更新时机。由此可见,Rax 对开发者的要求较高。


Rax 特点


  1. 设计上支持不同容器;
    Rax 在设计上尽量抹平各个端的差异性,这也使得开发者在开发中,差异性和兼容性方面再也不需要投入太多精力。
  2. 体积足够小;
    Rax 是一个面向无线端的解决方案,因此自身的体积对于性能来讲就显得非常重要。Rax 压缩 + gzip 后的体积是 8.0kb, 相比 React 的体积, 对于无线端很友好。
  3. 支持返回多个同级节点;
    这一特性可以有效减少页面的嵌套层级,从而减少应用因嵌套层级过多而出现的 crash 问题。
  4. 标准化;
    需要适配各个端,那么需要各个端的一致性,一致则必有规范可依,目前 Rax 遵循 W3C 标准,受限于各个端的差异,「更标准化」这也是 Rax 未来的重要目标之一。

多端运行

在这里插入图片描述
Rax 的跨容器特性是通过抽象出抽象 View 层的实现。
Rax 将 Vdom 与 Dom之间的转化定义为 Driver,依靠 Driver 来驱动实现跨端;Driver 定义了 VDOM 在具体容器下的渲染实现。比如在 Web 场景下,对应的 Driver 为 Driver-Dom,它描述了在浏览器中,如何将 VDOM 渲染为真实的 DOM。基于这种思路,同一套代码,经过不同的 Driver 就可以运行在不同的容器下。


how


创建

快速创建一个 Rax 多端应用

npm init rax todoList

初始化

初始化项目过程中, 按照项目的需要选择配置信息。
以下是简单 todolist 的 demo 演示所需要的配置项。
在这里插入图片描述


项目目录

初始化的项目后,得到如下项目结构

├── README.md # 项目说明
├── build.json # 项目构建配置
├── package.json
└── src # 源码目录├── app.js # 应用入口文件├── app.json # 应用配置,包括路由配置,小程序 window 配置等├── public # (可选)静态资源目录,会拷贝内容至 build 目录├── components # 应用的公共组件│ └── Logo # 组件│ ├── index.css # Logo 组件的样式文件│ └── index.jsx # Logo 组件 JSX 源码├── document # 页面的 HTML 模板│ └── index.jsx └── pages # 页面└── Home # home 页面└── index.jsx

路由配置

Rax 使用 rax-use-router 来管理多个页面,生成的 Rax App 是一个单页应用(可通过 build-plugin-rax-multi-pages 切换成多页应用)


  1. 配置:路由的配置如同小程序的配置,在 app.json 中直接写入;
  2. 使用:路由正常使用,动态路由和路由对参数,不能直接从 props.id 获取,路由信息需要自己解析,不能像 react-router 那样,。
    路由的配置信息如下图所示。
    在这里插入图片描述

状态管理

状态管理方面可以采用和 React 相同的状态管理库,大致分为两类:
第一类:搭配中间件 Redux 状态管理,为了简化开发关注点,对 Redux 进一步封装,例如:Dva等等;
第二类:采用 observerble 的方案,例如:MobX 等;
如果使用状态管理的业务场景较少,可以考虑 React 的 Context ,官网推荐的 hooks 中 useContext + useReducer 搭配使用。具体的使用方案还是要看具体的业务需求。


组件传参

父 => 子:父组件可以通过 props 给子组件传递数据;
子 => 父:子组件可以通过 callBack 的方式调用父组件;
兄 <&#61;> 弟&#xff1a;对于兄弟组件或者跨层组件&#xff0c;可以通过发事件的方式通信&#xff0c;也可以单独引入状态管理框架来处理。
当然了&#xff0c;也可以拿到组件的实例&#xff0c;使用 ref 直接调用相应的方法。


UI 组件库

Rax 的社区不够活跃&#xff0c;几乎没有可用的第三方 UI 组件库&#xff0c;仅有官方提供的一些常用功能组件&#xff0c;三大类组件库如下&#xff1a;


  1. 基础组件&#xff1a;如 View 视图组件&#xff0c;默认 Flexbox 布局&#xff0c;可任意嵌套&#xff1b;
  2. 基础容器&#xff1a;如 ScrollView 滚动容器&#xff0c;设置确定的高度展示列表内容&#xff1b;
  3. 功能组件&#xff1a;Embed 内嵌内容容器&#xff0c;在 Weex 容器中通过 实现&#xff0c;在 Web 容器中通过 实现&#xff1b;

打包


  1. 在 build.json 中选择一个或多个需要投放的端&#xff0c;目前可供选择的有 Web、 Weex、Alibaba Miniapp、WeChat MiniProgram、Kraken (Flutter)&#xff1b;
    在这里插入图片描述
  2. 运行npm run build 命令即可按需生成 build 打包文件。
    在这里插入图片描述
    miniapp &#61;> 阿里系小程序&#xff08;支付宝小程序、天猫精灵小程序&#xff09;
    web &#61;> web 页面
    weex &#61;> weex 容器
    wechat-miprogram &#61;> 微信小程序
    kraken &#61;> 一款轻量级的面向前端网络开发人员的框架

踩坑

&#xff08;1&#xff09;需要利用 PureComponent&#xff0c;StatelessComponent 优化组件渲染
Rax 把很多处理性能优化的工作交给了开发者来处理&#xff0c;这也是 Rax 对开发人员要求更高的一个原因。PureComponent 在更新触发时会比较 props 和 state&#xff0c;如果没变化就不更新。StatelessComponent 在组件渲染时不会生成 Component 实例&#xff0c;能减少一定性能开销&#xff1b;
&#xff08;2&#xff09;尽量自己来控制 Dom 的更新时机&#xff1b;
Rax 的 setState 是同步的&#xff0c;要避免频繁调用&#xff0c;最好是数据都统一更新&#xff0c;自己手动调用 forceUpdate 更新 Dom&#xff1b;
&#xff08;3&#xff09;子组件适当提供 Key&#xff0c;尽量保持组件 Dom 结构的稳定&#xff1b;
子组件设置 Key 和 Vue 原理类似的&#xff0c;保持 Dom 结构稳定&#xff0c;也和虚拟 Dom 的 Diff 有关&#xff0c;可以避免频繁的 Dom 操作&#xff1b;
&#xff08;4&#xff09;Rax 无单位与 rem 单位等价&#xff0c;页面宽度默认是 750rem&#xff0c;各端兼容&#xff1b;
&#xff08;5&#xff09;路由传参&#xff0c;很遗憾&#xff0c;不支持 props.id 直接获取&#xff0c;路由信息需要自己解析&#xff1b;


when

Rax 优点 跨容器、高性能、轻量。

但是Rax本质上还只是属于UI层模式&#xff0c;在接入时应该注意和自己的底层框架解耦。并且Rax对开发者的要求较搞&#xff0c;如果没有一定的经验和规范约束&#xff0c;容易导致项目臃肿、结构混乱的问题。

目前在移动端React和Vue都有很高的占比&#xff0c;社区生态也都比较活跃。具体的选型可以结合团队的实际情况。

无论选择哪个框架&#xff0c;都需要认真研究框架原理&#xff0c;对框架的优缺点和潜在问题做到心里有数&#xff0c;如果能够掌握其运行机制就更棒了&#xff0c;这样在应对一些复杂需求和重大变化时才能游刃有余。


推荐阅读
  • 人人租机作为国内领先的信用免押租赁平台,为企业和个人提供全方位的新租赁服务。通过接入支付宝小程序功能,该平台实现了从零到百的迅猛增长,成为全国首家推出“新租赁小程序”开发服务的阿里巴巴小程序服务商(ISV)。这一创新举措不仅提升了用户体验,还显著增强了平台的市场竞争力。 ... [详细]
  • 微信小程序详解:概念、功能与优势
    微信公众平台近期向200位开发者发送了小程序的内测邀请。许多人对微信小程序的概念还不是很清楚。本文将详细介绍微信小程序的定义、功能及其独特优势。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 大家好,我是梅巴哥er。本文将深入探讨Redux框架中的第三个实战案例,具体实现每两秒自动点击按钮以触发颜色变化的功能。该案例中,一个关键点在于是否需要使用异步操作来处理定时任务,我们将详细分析其必要性和实现方式。通过这一实例,读者可以更好地理解Redux在实际项目中的应用及其异步处理机制。 ... [详细]
  • 经过半年的精心整理,我们汇总了当前市场上最全面的Android面试题解析,为移动开发人员的晋升和加薪提供了宝贵的参考资料。本书详细涵盖了从基础到高级的各类面试题,帮助读者全面提升技术实力和面试表现。章节目录包括:- 第一章:Android基础面试题- 第二章:... ... [详细]
  • 深入解析Tomcat:开发者的实用指南
    深入解析Tomcat:开发者的实用指南 ... [详细]
  • 对于众多创业公司而言,选择小程序或小视频的发展方向至关重要。本文将深入分析小程序和小视频的特点、优势及局限,帮助创业者做出更明智的选择。 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • NFT市场热度持续攀升,波卡能否抓住机遇迎来NFT夏季热潮?
    NFT市场热度持续攀升,波卡能否抓住机遇迎来NFT夏季热潮? ... [详细]
  • 为开发者提供了一系列实用的参考网站和资源链接,包括HTML速查手册( 和 ),帮助开发者快速查找和学习相关技术知识。此外,还涵盖了其他重要的开发工具和文档,为编程工作提供全面支持。 ... [详细]
  • 提升 Kubernetes 集群管理效率的七大专业工具
    Kubernetes 在云原生环境中的应用日益广泛,然而集群管理的复杂性也随之增加。为了提高管理效率,本文推荐了七款专业工具,这些工具不仅能够简化日常操作,还能提升系统的稳定性和安全性。从自动化部署到监控和故障排查,这些工具覆盖了集群管理的各个方面,帮助管理员更好地应对挑战。 ... [详细]
  • 每日前端实战:148# 视频教程展示纯 CSS 实现按钮两侧滑入装饰元素的悬停效果
    通过点击页面右侧的“预览”按钮,您可以直接在当前页面查看效果,或点击链接进入全屏预览模式。该视频教程展示了如何使用纯 CSS 实现按钮两侧滑入装饰元素的悬停效果。视频内容具有互动性,观众可以实时调整代码并观察变化。访问以下链接体验完整效果:https://codepen.io/comehope/pen/yRyOZr。 ... [详细]
  • 尽管我们尽最大努力,任何软件开发过程中都难免会出现缺陷。为了更有效地提升对支持部门的协助与支撑,本文探讨了多种策略和最佳实践,旨在通过改进沟通、增强培训和支持流程来减少这些缺陷的影响,并提高整体服务质量和客户满意度。 ... [详细]
  • 2012年9月12日优酷土豆校园招聘笔试题目解析与备考指南
    2012年9月12日,优酷土豆校园招聘笔试题目解析与备考指南。在选择题部分,有一道题目涉及中国人的血型分布情况,具体为A型30%、B型20%、O型40%、AB型10%。若需确保在随机选取的样本中,至少有一人为B型血的概率不低于90%,则需要选取的最少人数是多少?该问题不仅考察了概率统计的基本知识,还要求考生具备一定的逻辑推理能力。 ... [详细]
  • 经过短暂的休整,我们再次推出新的小程序功能,进一步提升用户体验。现在,小程序页面不仅支持放置转发按钮,还新增了长按快速转发的功能,让用户能够更加便捷地分享页面内容。这一更新将为开发者提供更多创意空间,同时也大幅提升了用户的互动性和使用便利性。 ... [详细]
author-avatar
mobiledu2502910181
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有