热门标签 | 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;这样在应对一些复杂需求和重大变化时才能游刃有余。


推荐阅读
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了响应式页面的概念和实现方式,包括针对不同终端制作特定页面和制作一个页面适应不同终端的显示。分析了两种实现方式的优缺点,提出了选择方案的建议。同时,对于响应式页面的需求和背景进行了讨论,解释了为什么需要响应式页面。 ... [详细]
  • 本文介绍了OkHttp3的基本使用和特性,包括支持HTTP/2、连接池、GZIP压缩、缓存等功能。同时还提到了OkHttp3的适用平台和源码阅读计划。文章还介绍了OkHttp3的请求/响应API的设计和使用方式,包括阻塞式的同步请求和带回调的异步请求。 ... [详细]
  • Jquery 跨域问题
    为什么80%的码农都做不了架构师?JQuery1.2后getJSON方法支持跨域读取json数据,原理是利用一个叫做jsonp的概念。当然 ... [详细]
  • 本文总结了在编写JS代码时,不同浏览器间的兼容性差异,并提供了相应的解决方法。其中包括阻止默认事件的代码示例和猎取兄弟节点的函数。这些方法可以帮助开发者在不同浏览器上实现一致的功能。 ... [详细]
  • 本文介绍了在Linux系统下进行文件压缩与解压的常用命令,包括tar命令的基本使用和参数,以及gzip、bz2、compress、rar和zip等不同格式的压缩与解压方法。同时还提供了常见的压缩文件后缀名及对应的解压命令,方便用户进行文件的压缩和解压操作。 ... [详细]
  • 本文介绍了Python字典视图对象的示例和用法。通过对示例代码的解释,展示了字典视图对象的基本操作和特点。字典视图对象可以通过迭代或转换为列表来获取字典的键或值。同时,字典视图对象也是动态的,可以反映字典的变化。通过学习字典视图对象的用法,可以更好地理解和处理字典数据。 ... [详细]
  • 第8章 使用外部和内部链接
    8.1使用web地址LearnAboutafricanelephants. ... [详细]
  • mapreduce原理_MapReduce原理及WordCount实践
    参考链接:https:www.cnblogs.comlaowangcp8961946.html一、MapReduce流程1.1Mapreduce整体流程: ... [详细]
  • 初级_vue.js初级教程01.简介
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了vue.js初级教程--01.简介相关的知识,希望对你有一定的参考价值。Vue特点 ... [详细]
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社区 版权所有