初识weex与rax

简介:

背景

weex目前在集团乃至全球发展的如火如荼,最近也正在了解相关的资料,目前只是一些初步的了解,在这里分享一下。weex是跨端渲染框架,就是说一套代码,可以在web、ios和android跑,而且在后两者中,是以native方式跑的,因此在渲染效率和交互流畅度上,均有上乘的表现。weex于2016年开始在淘系双11、双12大促大规模使用,稳定可靠,可以看鬼道的介绍:《Weex 在双十一会场的大规模应用:业务支撑、稳定性保障和秒开实战》

那么为什么要做weex,相信做过web移动端页面的开发非常清楚,主要原因就是web在渲染和操作体验上的表现,相对于native来说又慢又卡,但是native虽然好,但开发却远比h5麻烦,不但开发环境麻烦、部署麻烦,还需适配android和ios两大平台,甚至需要招不同的程序员,h5尽管也有平台浏览器内核的兼容性问题,但开发容易上手,相对于native的开发成本,这些处理兼容性问题的代价基本上算是可以忽略了。

react-native、react-web与weapp

如何即让学习成本低、代码写的少,部署简单,又尽可能地在三端都能跑流畅,是全球各大互联网公司都在较劲脑汁思考的问题,比如facebook的react-native,实现了“learn once,run anywhere”,但因为其还是不能实现h5的渲染降级,因此说的是learn once,即web端还是需要再写一遍,react-web做了一个能让react-native代码跑在web的事情,为什么react-native能实现一份代码跑两端,react-web又能扩展其web渲染呢?其实是因为无论是web、ios还是android,尽管其底层实现的api或控件不同,但都能实现相同功能的布局和界面,因此要实现一份代码跑三端,最关键的是把三端的布局细节封装并对上层屏蔽,上层UI描述使用一样的DSL,在native渲染的时候,再根据不同平台走不同的renderer。

再说集团,在3年前,集团的weapp也做了这个事情,它使用json或xml描述界面,包含界面的布局、样式、事件甚至联动,然后能实现三端渲染:

{
    "type":"label",
    "dataBinding":{"value":"$phone_number"},
    "styleBinding":{"align":4,"fontSize":28,"fontStyle":1,"gravity":4,"height":80,"lines":1,"marginLeft":86,"textColor":"#3d3f45","width":-1}
    "events":[
        {
            "type":"click",
            "actions":[
                {
                    "type":"userTrack",
                    "param":{"utName":"TelPhone","utParams":{"wp_app":"weapp","wp_m":"phone_7","wp_pk":"$wp_pk"},"utType":"Button"}}
                {
                    "type":"phoneCall",
                    "param":{"phoneNumber":"$phone_number"}
                }
            ]
        }]
}

weapp的想法是很好的,也有很多应用场景,1688早期的roc,就是使用weapp搭建native页面,在后期,很多无线团队也在研究weapp与react-native的融合,但weapp由于是基于json的,因此编写逻辑不灵活,也不方便编写和引用模块,还有很多私有的语法增加了学习成本,落地情况不是很理想,因此在后来react-native出来以后,看到这么耀眼的东西一个存在,基本上就在思考新的方式了。

weex与rax

这个新的思路就是weex,weex吸取了集团在跨端方面的很多沉淀,抛弃了一些缺陷,主要有这么一些优势:

  1. 使用web的方式写代码,通过与vue的结合,深得社区人心,尤其是h5移动页面开发者,学习成本实在太低了,首先解决了一个使用难的问题
  2. 实现了跨三端的高性能渲染,比native要慢,但比react-native要快
  3. 成熟配套的工具支持,weex sdk、weex toolkit、weex playground等,比起react-native,更容易上手
  4. 开放了native dom api,因此上层可以开发自己的js框架,后来的rax就是基于此实现的

我们来看下weex的架构:

在DSL层,使用vue的方式编写界面和交互,打包编译成js bundler自执行文件,js bundle通过url协议被客户端识别,这个过程可通过离线缓存,或者直接请求的方式实现,客户端要执行这个js,那么必须有一个js引擎,目前用的是google v8,js本身是不可能渲染native控件的,因此需要一个jsbridge,jsbridge去callnative实现native控件的生成,不同端的native渲染是不一样的,值得一提的是,如果是web端,那么就不需要jsbridge去callNative了,直接走dom渲染。

weex架构的有一个好处就是,开放了vdom这一层,即操作nativeDom的这一层,这意味着你可以自己手写代码渲染native界面,或者自行封装框架,比如这段代码,即没用vue,也没用jsx,直接手写,也一样能在native运行:

var m = __weex_require__('@weex-module/modal');
m.alert({
    message: "你好吗?"
});
document.open();
var body = document.createBody();

document.documentElement.appendChild(body);
var x = document.createElement("text");
x.attr.value = "hello faxin";
x.style = {
    color: "green",
    fontSize: 100
};
document.body.appendChild(x);
document.close();

//隐藏菊花
sendTasks(document.id, [{module: 'dom', method: 'createFinish', args: []}]);

把这个js放到本地http服务器,然后手机连上公司wifi,用weex的playground扫描即可渲染出结果:

如果没装,可以使用mds模拟,值得一提的是,mds还提供了weex js的断点调试能力,非常推荐:

可以看到,这些api和dom的太像了,事实上,无论是weex jsframework,还是rax,都是对vdom的上层封装而已,有点类似无论是angular、jquery,其实最终都是操作浏览器的dom api来驱动渲染html,在这点上看,我们可以把weex底层看成一个dom level提供者。

接下来再说一下rax,rax是跨容器渲染框架,写法与react基本兼容,rax的前身应该就是react-web,只是现在直接驱动weex容器作为native渲染了,rax的架构有许多值得学习的地方,他的界面写法使用jsx,接下来编译成js,有virtual dom的机制在里面,在最终的渲染端,是通过驱动的机制来实现,也就是说,它能在哪里渲染,取决于你写的驱动,目前在native的渲染,直接对接了weex的native dom api,在web的渲染,使用自己的封装,还有服务器的渲染,你如果后面要写在其他设备的渲染,理论上可以自己编写驱动来实现。

表面上看,rax是提供了另外一种阵营的选择,即vue体系意外的react体系,但它还做了很多事情:

  1. rax ui库,封装了很多集团内的库和组件,如slider、tab、spm打点等等,大部分业务都可以稍微封装即可使用
  2. 兼容的处理,比weex在h5渲染还原度更高
  3. 支持返回一批元素,了解react的同学知道,react必须返回一个带根root的元素

结语

跨三端是多少移动开发人员的梦想,如今在weex体系下已经得到几乎完美的解决,尽管在h5降级上仍有细微的缺陷,目前weex已经捐到了apache基金会,预计未来会得到持续的发展,也欢迎更多的同学加入其研发或者接入。

目录
相关文章
|
6月前
|
人工智能 前端开发 数据可视化
前端组件库——shadcn/ui知识点大全(二)
教程来源 http://vbzcj.cn/ shadcn/ui核心组件深度解析:Form(集成React Hook Form+Zod,类型安全表单)、DataTable(基于TanStack Table,支持排序/过滤/分页)、Button/Dialog等可定制原子组件;主题通过CSS变量实现运行时切换与暗色模式,支持可视化编辑与AI生成,真正“代码即所有权”。
|
4月前
|
人工智能 自然语言处理 算法
阿里云百炼Qwen 3.7 Plus与Max实测全解:性价比与多模态能力、成本深度对比
2026年,阿里云百炼平台推出的Qwen 3.7系列成为企业与开发者落地AI应用的核心选择,其中Qwen 3.7 Max与Plus作为两大旗舰版本,定位差异显著:Max是纯文本推理旗舰,专注高强度智能体与复杂逻辑任务;Plus则是多模态全能版,在保留强大文本能力的同时,补齐图像、视频理解能力,且价格大幅降低。本文基于2026年最新实测数据,从核心参数、文本能力、多模态能力、智能体表现、性价比与场景选型六大维度,全面解析两款模型的差异,为用户提供精准选型参考。
2099 0
|
存储 人工智能 自然语言处理
从“代码补全”到“知识对齐”:Qoder Repo Wiki 迎来重磅升级
随着大模型发展,AI Coding正从辅助编码迈向自主编程。Qoder通过显性化知识、增强上下文、Spec驱动与智能体协作,提升研发效率与透明度,应对软件复杂性挑战,推动人与AI高效协同。
从“代码补全”到“知识对齐”:Qoder Repo Wiki 迎来重磅升级
|
Python
使用Python实现multipart/form-data文件接收的http服务器
至此,使用Python实现一个可以接收 'multipart/form-data' 文件的HTTP服务器的步骤就讲解完毕了。希望通过我的讲解,你可以更好地理解其中的逻辑,另外,你也可以尝试在实际项目中运用这方面的知识。
784 69
|
算法 安全 数据安全/隐私保护
Python随机数函数全解析:5个核心工具的实战指南
Python的random模块不仅包含基础的随机数生成函数,还提供了如randint()、choice()、shuffle()和sample()等实用工具,适用于游戏开发、密码学、统计模拟等多个领域。本文深入解析这些函数的用法、底层原理及最佳实践,帮助开发者高效利用随机数,提升代码质量与安全性。
1501 0
|
缓存 前端开发 JavaScript
React 视频弹幕组件 Video Danmaku
本文介绍了如何在React中构建视频弹幕组件,提升用户观看体验和互动性。首先通过Create React App初始化项目,并集成`react-player`作为视频播放器。接着实现基本弹幕功能,包括评论的接收与显示,使用CSS动画实现滚动效果。针对常见问题如弹幕重叠、性能下降及同步问题,提供了随机化位置、分批加载和监听播放进度等解决方案。最后探讨了弹幕分类和特效等高级技巧,确保弹幕系统的高性能和良好用户体验。
763 23
|
JavaScript 前端开发 数据建模
探索未来编程新范式:响应式编程的崛起与实践
本文将深入探讨响应式编程的核心概念、技术优势及其在现代软件开发中的应用。通过实例解析,揭示这一新兴编程范式如何简化异步数据处理,提高代码的可维护性和效率,为读者提供从传统命令式编程向声明式编程转型的新视角。 ####
|
缓存 JavaScript 前端开发
WebView完全解读
WebView完全解读
1548 133
|
弹性计算 安全 API
HTTP 405 Method Not Allowed:解析与解决
本文详细解析了HTTP 405 "Method Not Allowed" 错误,包括其定义、常见原因、示例代码及解决方案。通过检查API文档、修改请求方法或更新服务器配置,可有效解决此错误,提升Web开发效率。
11089 2