Weex在内涵发现页中的工程实践(weex在内涵发现页中的工程实践研究)
myzbx 2025-07-27 22:30 14 浏览
React-Native和Weex是目前最为火热的两个客户端跨平台解决方案。从去年2016年9月份开始,IES在抖音产品中应用了React Native,中途遇到了很多的问题,尤其是长列表的性能问题一直没能从根本上得到解决。
鉴于Weex在性能方面做过一些针对性的优化并且已在阿里的业务线上得到了规模性的应用,我们决定在内涵段子这个具备800万日活的产品中尝试应用Weex。这样做的主要目的是为了深化对Weex的认识,与React Native进行对比分析,确立IES客户端跨平台方案的下一步研究方向。
一、工程实践
1.1 准备工作
开发环境搭建:
https://weex.incubator.apache.org/cn/guide/set-up-env.html集成Weex SDK到已有应用:
https://weex.incubator.apache.org/cn/guide/integrate-to-your-app.html下载Weex Playground APP:
https://weex.apache.org/cn/playground.html Weex Playground APP集成了Weex SDK,它内置了用于展示Weex组件功能的Demo。通过它的扫码功能,还可以加载自己本地Server的Weex代码进行调试(前提是手机和电脑在同一个局域网内)。
1.2 调试
1.2.1 调试环境
在Weex项目中,调试代码的环境有三种:浏览器、Weex Playground APP、自己的应用内。
因为Weex的代码可以同时兼容浏览器、iOS和安卓三种运行环境,因此可以在浏览器环境中调试Weex项目代码。在Weex工程中运行npm run dev和npm run serve命令并在浏览器中访问http://localhost:8080即可预览Weex项目效果,如下图所示。但是就目前的状况来讲,Weex对三端的兼容性支持还不是很完善,在浏览器中调试好的代码再放到客户端环境中运行还是有极大的可能会出问题,因此如果最终目标只是想在客户端中运行Weex代码,并不建议通过浏览器来调试。
Weex Playground APP集成了Weex SDK,可以通过它的扫码功能来调试自己的Weex项目代码。项目开始时,如果客户端Weex集成工作还没完成且调试环境还没有准备好,可以使用Weex Playground APP来辅助调试,因为此时项目的主要工作还是编写界面,并不需要客户端扩展功能模块的支持。
项目界面开发完成后,后面阶段的调试工作就需要在自己的应用内进行了,因为此时一般需要客户端扩展的功能模块或组件的支持。例如,获取网络请求通用参数、打点、接收客户端事件消息等。应用内集成了Weex SDK后,在需要调试Weex代码的页面,建议客户端在DEBUG模式下提供刷新页面按钮以方便调试。
1.2.2 DEBUG
在React Native的开发中,可以通过点击开发者菜单中的“Debug JS Remotely”选项来开启JS代码的远程调试。然而在Weex的开发中,开启JS代码远程调试功能的步骤要麻烦一些,需要在应用内集成Weex DevTools工具。由于Weex Playground APP已经集成了Weex DevTools工具,可以使用Weex Playground APP来试验一下如何使用weex-toolkit里面提供的调试工具。
首先,在命令行中运行weex debug命令,该命令会启动一个调试服务器,并同时唤起Chrome浏览器打开调试主页,如下图所示。
然后,打开Weex Playground APP扫描调试主页下方的二维码,即可在应用与调试服务器之间建立socket连接并向调试服务器注册应用信息,如下图所示。
此时,点击上图中的Debugger按钮可以开启JavaScript代码的远程调试功能,在ChromeDevTools里面对Weex工程的JavaScript代码进行调试;点击Inspector按钮可以查看Weex页面的element属性结构。
如果想使用weex-toolkit提供的调试工具对自己应用内的Weex页面进行调试,必须先在应用内集成Weex DevTools。具体集成方法请参考:集成 DevTools 到 iOS和集成 DevTools 到 Android。
1.3 开发
此次Weex应用于内涵的发现页,发现页的UI如下面三张图所示。发现页有以下特征:
由热吧和订阅两个列表页组成,通过顶TAB进行切换;
热吧和订阅数据一次性加载完毕,无loadmore逻辑,热吧数据大概在200~300条;
用户可切换主题:白天模式和夜间模式。
1.3.1 组件划分及布局
发现页的页面组成元素比较简单,组件分为轮播图组件、热吧Cell组件以及订阅吧Cell组件。
发现页的文档结构大致如下:
其中值得一提的是实现TAB切换的方式。一般来讲,很容易想到使用vue的条件渲染来实现TAB的切换,如下:
但是这样做会造成TAB切换时列表渲染卡顿,因为热吧列表有200~300条数据,每次切换都重新渲染一次会造成较大的性能消耗。因此,在实现的时候对list采用了绝对定位的布局方式,在TAB切换的时候,将已经渲染好的列表结构在DOM树中保留,只改变列表节点的visibility属性。如下:
1.3.2 客户端支持
(1) 客户端模块
device模块
Method | Description | Parameters | Callback |
---|---|---|---|
getCommonNetworkParameters | 获取网络请求通用参数 | 无 | commonNetworkParams: Object |
event模块
Method | Description | Parameters | Callback |
---|---|---|---|
openURL | 页面跳转 | url:String | 无 |
tracker模块
Method | Description | Parameters | Callback |
---|---|---|---|
logEvent | 友盟打点 | event:String,parameters:Object | 无 |
(2) 客户端事件
Event | Type | Parameters |
---|---|---|
主题切换 | theme | theme:0-白天模式,1-夜间模式 |
消息红点事件 | badge | subscribedBadge:false-不显示红点,true-显示红点 |
订阅/取消订阅 | subscribe | type:false-取消订阅,true-订阅id:相关吧id |
登录状态切换 | loginstatus | loginstatus: true-登录,false -退出登录 |
1.3.3 Weex使用问题总结
如何处理本地图片资源?
Weex image组件不支持本地图片,然而在项目开发过程中经常需要引入一些本地图标文件,例如:
此时,可以在webpack配置文件里面配置url-loader,将图片资源输出到构建目录。然后,通过output.publicPath配置项来配置资源的访问路径,在DEBUG模式下,将output.publicPath配置为本机server地址,在Production模式下,将output.publicPath配置为线上域名。由于图标文件一般比较小,为了避免在无网络状态下渲染Weex页面拉取不到线上图标资源的情况,项目中将图标文件直接用Base64编码。url-loader的配置如下所示:
关于适配
Weex代码中的高度和宽度的单位均为px,但是所设置的宽高并不是实际呈现出来的宽高,Weex框架在底层做了针对不同屏幕的适配工作,具体计算公式为 实际高宽 = 代码高宽 * (屏幕宽度 / 750)。所以,在编写界面的时候,最好以宽度为750的设计稿最为标准,否则需要根据计算公式对设计稿上标明的宽高做转换。当需要设置元素的绝对宽高时,需要自行计算。计算时,需要获取以下参数:
cell组件的appear事件和disappear事件在安卓端引发的性能问题
在热吧列表,有一个打点需求,就是统计每一个吧Cell的展示时间。为了实现这个打点需求,对每一个吧Cell都监听了appear事件和disappear事件。通过测试发现,当监听了吧Cell的appear事件和disappear事件时,安卓端列表滚动不流畅,会出现明显的卡顿现象。
slider组件的点击事件在安卓端不触发
由于Weex提供的slider组件无法满足使用要求,所以基于slider重新封装了一个轮播图组件,结构如下:
轮播图组件需要监听点击事件,当在slider组件或slider组件的父组件div上监听点击事件时,在安卓端点击轮播图并不触发点击事件。因此,需要在slider组件的子组件上监听点击事件。 在没有设置loadmoreoffset时,list组件的loadmore事件在安卓端不触发 虽然发现页没有loadmore逻辑,但是在使用weex的过程中对list组件进行了性能测试,使用到了list组件的loadmore功能,因此发现了list组件的loadmore事件在默认情况下不触发的问题。只有显示设置了loadmoreoffset且loadmoreoffset的值大于0时,list组件的loadmore事件才会触发。
cell组件的scope属性
使list组件的时候,建议为同种类的cell设置相同的scope属性。Weex内部会缓冲cell,每种类型的cell最多缓冲9个。如果不设置cell的scope属性,weex会认为所有的cell的类型都不一样,会缓冲所有的cell,导致内存占用大。
1.3.4 Weex实现效果
Weex实现的页面操作体验基本上接近原声应用,列表滚动、TAB切换、页面跳转等都十分流畅。效果如下图所示:
二、实践总结
Weex可以选择使用Vue作为开发框架,开发与调试体验都比较好,接近Web开发体验,但是使用上仍然存在一些问题,例如:
CSS支持不够完善,有些地方CSS样式的在客户端中的表现与WEB中的不太一致,甚至iOS和安卓端都会存在样式表现的不一致。而且CSS不支持继承,定义CSS样式的时候无法引入变量,这样在实现一些效果的时候十分不方便,例如白天模式和夜间模式;
文档资料不够完善;
某些内建组件存在使用上的BUG,例如slider组件在安卓手机上无法监听click事件、list组件在没有设置loadmoreoffset的情况下在安卓手机上不触发loadmore事件;
当然,这些使用上的问题都可以解决或通过一定办法去规避。Weex更值得我们关注的问题可能还是list组件的性能问题。在React Native的实践中,我们深受长列表性能问题的困扰,而Weex号称是一套可以构建高性能原声应用的跨平台方案,它在长列表的性能表现上如何呢?我们对此进行了测试和评估,发现Weex在长列表的性能表现上也并不乐观。在列表长度不断增长的时候,Weex的内存占用也是不断增长的,在安卓和iOS上皆是如此。在iOS上,列表在不断向下滚动的过程中,CPU使用率的表现也十分堪忧。以下两张图分别是在列表cell定高和变高下的测试结果【详细测试结果请前往:RN & Weex ListView性能对比评估】:
因此,Weex目前可能更适用于非长列表的场景。由于其体验接近原生应用,比H5要好,可以用于替换端内的一些H5页面或一些需要频繁变动的客户端页面。在这些方面Weex是否可规模投入使用尚待验证,此次在内涵发现页的使用正好可以观察其稳定性。
更多技术干货:
https://techblog.toutiao.com/
相关推荐
- OPPO Find X9手机曝料:6.6英寸屏幕、天玑9500芯片
-
IT之家8月27日消息,科技媒体xpertpick今天(8月27日)发布博文,报道称OPPO计划于今年10月推出FindX9系列旗舰手机,其中包括FindX9和...
- OPPO Find X9系列搭载影像新硬件,支持Ultra级画质和色彩还原
-
IT之家8月27日消息,OPPOFindX9系列手机发布时间逐渐临近,目前官方已开启新机的前瞻预热。OPPOFind系列产品负责人周意保今日发文解释了厂商为什么现在都喜欢跨界合作这一...
- 我回来了!聊聊屏幕对续航的影响_屏幕耗电吗
-
时隔一周终于回国,让大家久等了本来上周日就能到家,结果在旧金山转机的时候把护照弄丢了…幸好后来被一位黑人大姐找到了,才能顺利回国,感谢勤劳朴实的美利坚人民。出差途中笔记本的续航是很重要的,刚好联想的产...
- J人福音、P人救星,Lumix Flow如何重塑专业视频拍摄工作流
-
“等一下,刚才那个中景拍了没有?”“A机位的素材是哪一场的?”“完了,我忘了记哪一条是最好的了!”“今晚加个班,先把能用的素材挑出来……”作为经常一个人拍视频的内容创作者,这种崩溃称得上习以为常。如果...
- realme史上最窄边框和下巴 realme GT Neo3正式发布
-
中关村在线消息:今天下午14点,realme召开真我GTNeo3发布会。realmeGTNeo3搭载6.7英寸2412×1080OLED直屏,其支持120Hz刷新率,360Hz触控采样率,智能...
- 用酒精擦屏幕,对屏幕的伤害有多大?
-
天府新青年你触手可及的朋友圈附录:1.不是所有电脑的屏幕都不能用酒精来擦,通常来说只有镜面屏屏幕才有涂层,这种不能用酒精擦;而雾面屏用的是另外一种抗反射技术,这种一般擦了没事。镜面屏和雾面屏特别好认...
- windows11截屏快捷键是哪个?windows11快捷键设置大全
-
windows11键盘快捷方式就是键盘快捷方式就是按键或按键组合,可提供一种替代方式来执行通常使用鼠标执行的操作。下面就来分享下windows11截屏快捷键是哪个和windows11快捷键设置大全。一...
- 三星Galaxy S25 Slim配置曝光 6.7英寸屏幕搭配2亿像素主摄
-
【CNMO科技新闻】三星GalaxyS25系列将于北京时间1月23日正式发布,CNMO注意到有博主爆出了即将亮相GalaxyS25Slim的配置信息。据悉,GalaxyS25Slim将配备一...
- 两种手机屏幕到底有什么不一样?哪种手机屏幕更好?
-
一般来说,我们的手机屏幕只分为两种OLED和LCD,LCD是大火的一种手机屏幕,是千元机以及高端机的标配,OLED算是后起之秀,是近几年才渐渐兴起的一种类型的手机屏幕,那么这两种手机屏幕到底有什么不一...
- 有强芯才好用 这三款高性价比旗舰芯热机最低仅需1799元
-
在选购手机时,相信大家肯定都会把性能作为考虑的重点之一。而如果希望拥有出色的性能表现,一颗旗舰处理器是必不可少的。今天我就为大家汇总了几款采用旗舰处理器的底价新机,感兴趣的朋友千万不要错过。moto...
- 一文搞定FastDFS的搭建和使用_fastdfs怎么样
-
1.FastDFS概述FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文...
- 涨姿势!超级计算机用啥文件系统呢?
-
2015-10-1705:58:00作者:赵为民在计算机中,文件系统(filesystem)是一个非常重要的组件,你可以将他看做是操作系统的子系统,其实质就是一种软件的组件,通过文件系统我们可以...
- Window as a VM:Chrome OS 现可窗口化运行其它 Linux 分支
-
这世上纵然有多种办法可以在Chromebook上安装运行ChromeOS和其它Linux分支多系统,但如果无需重启通过引导切换,确实是个很酷的改进。Google布道师Francois...
- Win10新预览版19577开始推送:新图标+多项新功能
-
今日凌晨,微软正式向Windows10Insider快速通道用户推送了全新版本Windows10——Windows10InsiderPreviewBuild19577。19577版本是...
- 微软Windows升级密钥(例如家庭版升级为企业版)
-
下面的密钥,是微软官方提供的,仅能用于Windows10系统版本的升级,比如从家庭版升级为专业版、专业版升级为企业版等。升级密钥不能用于激活系统,激活需要KMS或者数字权利,由于涉及到版权问题,在此不...
- 一周热门
- 最近发表
-
- OPPO Find X9手机曝料:6.6英寸屏幕、天玑9500芯片
- OPPO Find X9系列搭载影像新硬件,支持Ultra级画质和色彩还原
- 我回来了!聊聊屏幕对续航的影响_屏幕耗电吗
- J人福音、P人救星,Lumix Flow如何重塑专业视频拍摄工作流
- realme史上最窄边框和下巴 realme GT Neo3正式发布
- 用酒精擦屏幕,对屏幕的伤害有多大?
- windows11截屏快捷键是哪个?windows11快捷键设置大全
- 三星Galaxy S25 Slim配置曝光 6.7英寸屏幕搭配2亿像素主摄
- 两种手机屏幕到底有什么不一样?哪种手机屏幕更好?
- 有强芯才好用 这三款高性价比旗舰芯热机最低仅需1799元
- 标签列表
-
- HTML 简介 (30)
- HTML 响应式设计 (31)
- HTML URL 编码 (32)
- HTML Web 服务器 (31)
- HTML 表单属性 (32)
- HTML 音频 (31)
- HTML5 支持 (33)
- HTML API (36)
- HTML 总结 (32)
- HTML 全局属性 (32)
- HTML 事件 (31)
- HTML 画布 (32)
- HTTP 方法 (30)
- 键盘快捷键 (30)
- CSS 语法 (35)
- CSS 轮廓宽度 (31)
- CSS 谷歌字体 (33)
- CSS 链接 (31)
- CSS 定位 (31)
- CSS 图片库 (32)
- CSS 图像精灵 (31)
- SVG 文本 (32)
- 时钟启动 (33)
- HTML 游戏 (34)
- JS Loop For (32)