百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Weex在内涵发现页中的工程实践(weex在内涵发现页中的工程实践研究)

myzbx 2025-07-27 22:30 4 浏览

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模块

MethodDescriptionParametersCallback
getCommonNetworkParameters获取网络请求通用参数commonNetworkParams: Object

event模块

MethodDescriptionParametersCallback
openURL页面跳转url:String

tracker模块

MethodDescriptionParametersCallback
logEvent友盟打点event:String,parameters:Object

(2) 客户端事件

EventTypeParameters
主题切换themetheme:0-白天模式,1-夜间模式
消息红点事件badgesubscribedBadge:false-不显示红点,true-显示红点
订阅/取消订阅subscribetype:false-取消订阅,true-订阅id:相关吧id
登录状态切换loginstatusloginstatus: 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/

相关推荐

别让水 “跑” 出卫生间!下沉设计打造滴水不漏的家

你是否遭遇过卫生间的水“偷偷溜”进客厅,导致木地板鼓起、墙角发霉的糟心事?又是否为卫生间门口反复渗漏,不得不一次次返工维修而头疼不已?在家庭装修中,卫生间防水堪称“兵家必争之地”,而卫生间门口下...

歼-10CE vs 阵风:谁才是空中霸主?全面性能对比解析

歼10CE与法国阵风战斗机性能深度对比分析一、总体定位与设计哲学歼10CE:单发中型多用途战斗机,侧重于空优(制空权争夺)和对地对海打击,具有较高的性价比和较强的多任务能力。法国阵风战斗机:双发中型多...

知名移植工作室肯定Switch2的图形性能,却被CPU拖了后腿

虽然Switch2发售多日,但没入手的玩家对其性能还是有顾虑。近日,知名移植工作室Virtuos的技术总监在接受采访时讨论了Switch2的性能,并给出了他们工作室的评价。简单来说,Switch2在D...

虹科实测 | CAN XL vs CAN FD传输性能深度对比:速率翻倍,抖动锐减!

导读在汽车电子与工业通信领域,CAN协议持续进化,推动着数据传输效率的提升。本次实测基于虹科PCAN-USBXL与虹科PCAN-USBProFD硬件,在同等严苛条件下对比CANXL与CANF...

1J117合金材料优异的耐腐蚀性、机械性能

1J117合金材料概述定义:1J117是一种不锈软磁精密合金,属于铁铬基合金,其圆棒产品具有特定的形状和尺寸,可满足各种工业应用中的特定需求。标准:技术条件标准为GB/T14986,品种规格标准...

据高管所称,Switch2能轻松移植XSS平台60帧游戏

任天堂,作为主机游戏界的御三家之一,一直注重游戏性而不注重更新升级硬件设备是其最大的特点。各位任豚们,忍受着任天堂早已落后硬件设备,真想感叹一句,天下苦任久矣!但Switch2的出现或许正在渐渐的改变...

FJK-110LED-HXJSN磁传感器有哪应用

作为一名从事电子技术相关工作的自媒体人,我经常会遇到各种传感器的应用问题。其中,FJK-110LED-HXJSN磁传感器是一款在工业自动化、智能设备等领域比较常见的磁场检测元件。今天我想和大家聊一聊这...

浅谈欧标方管200x200x5-12mm质S275JRH的优势与劣势

欧标方管200x200x5-12mm材质S275JRH是一种常见的结构用钢材,广泛应用于建筑、机械制造、桥梁、钢结构等领域。本文将对这种方管的优势与劣势进行浅谈,以帮助读者更好地了解其特性和适用场景。...

宽带拨号错误 651 全解析:故障定位与修复方案

在使用PPPoE拨号连接互联网时,错误651提示「调制解调器或其他连接设备报告错误」,通常表明从用户终端到运营商机房的链路中存在异常。以下从硬件、系统、网络三层维度展开排查:一、故障成因分类图...

模型微调:从理论到实践的深度解析

在人工智能领域,模型微调已成为提升模型性能、使其适应特定任务的关键技术。本文将全面系统地介绍模型微调的各个方面,帮助读者深入理解这一重要技术。一、什么是模型微调模型微调是指在已经训练好的预训练模型基础...

汉语拼音 z、c、s图文讲解(拼音字母表zcs教学视频)

以下是汉语拼音z、c、s的图文讲解,结合发音要领、书写规范及教学技巧:一、发音方法与口诀1.z的发音发音要领:舌尖轻抵上齿背,形成阻碍后稍放松,气流从窄缝中挤出,声带不振动(轻短音)。口诀:“写字写...

吴姗儒惹怒刘宇宁粉丝!吴宗宪护航「是综艺梗」叮咛女儿对话曝光

记者孟育民/台北报道Sandy吴姗儒在《小姐不熙娣》因为节目效果,将男星刘宇宁的头像踩在地上,引起粉丝怒火,节目发声明道歉后仍未平息,她也亲自发文郑重道歉:「我对刘宇宁本人完全没有任何恶意,却在综艺表...

苹果错误地发布了macOS Tahoe公开测试版 现已将其撤下

一些Beta测试人员下载了他们以为是macOSSequoia15.6RC的版本,但却错误地下载了macOSTahoe26公开测试版,后来苹果修复了该问题。苹果预计将于7月25...

make的多种用法!(make 的用法总结)

一、make的用法美make[meik]①V.制造;制定,拟定;使变得,使处于;造成,引起;整理(床铺);做,作出;强迫;挑选,任命…②n.(机器、设备等的)品牌,型号;结构,构造;通电,接电⑤[...

北顿尖刀哗变?俄第20近卫集团军损失惨重,拒绝执行指挥官命令?

【军武次位面】作者:太白近日,外国社交媒体“电报”上传出了一些消息,称俄罗斯在北顿涅兹克战场上的“尖刀”部队之一,俄第20近卫集团军因为损失惨重,已经出现了部分部队拒绝执行指挥官命令,甚至哗变的情况。...