微信公众号投票看谁投的 微信小程序的编程模式2022-09-22

、标签都完全被抛弃了。和Facebook的React类似,小程序引入了自己的HTML标签,它和 这样的语义标签不同,小程序中的标签更像是传统客户端开发中的组件(或者叫控件),每个组件都有自己背后的职能和使用方式。比如:如果需要展示图片,就只能用标签,其他的都无法承载。而如果需要提供可选的文本,则只能使用标签等。
这样的方式带来最大的问题就是传统的HTML页面都无法在小程序中呈现(而小程序正好微信公众号投票看谁投的,没提供类似WebView的客户端控件)。比如有大量的内容网站,其文章内容都是存储为一个HTML片段,无法直接呈现在小程序中。如果需要展示,一个思路是构建中间服务,将HTML转译成一种更简单利于渲染的中间格式数据,然后,在小程序端把中间格式的数据转换成小程序的标签进行呈现。我们在做“轻芒生活”的时候,正好设计并实现了一个转义服务,将任意一个HTML页面转换成中间格式(内部名是RAML),解决了内容性HTML页在小程序上的呈现问题,如图1所示。
图1在小程序中呈现HTML内容页
和HTML相比,小程序的WXSS算是比较完整地保留了CSS的特征,这一点还蛮出乎意料。WXSS在语义上最大的不同,一是在于它支持了相对尺寸单位rpx(responsivepixel),每750rpx等价于当前设备的屏幕宽度,它的引入,把那种繁复的屏幕尺寸适配变得简单了不少。而和CSS的另一个不同是它更像传统控件样式用法,不支持CSS3那么多的选择器,使用中更多的是一个控件一个class。
小程序中虽然支持ES6标准的JavaScript,但窗口级的JavaScript却完全被废弃掉了,开发者无法用JavaScript去调用window、document对象来修改界面元素完成逻辑。小程序中的JavaScript其实直接对应Node.js的用法,用来完成后台业务逻辑,而不是直接控制交互。小程序的这个设计,使其可以用到VirtualDom的方式来渲染界面,让界面数据更新时的性能优化成为可能,但付出的代价就是少了窗口级JavaScript的那层胶水黏合,使得很多功能的开发变得极其呆板和繁复。
交互如何传导所谓交互的传导,是当用户和界面发生交互时,平台框架通过何种方式告诉业务层,并将处理后的变化呈现回交互界面上。如果把WXSS+WXML绘制的页面看成“前端”,把JavaScript撰写的业务逻辑看成“后端”,你会发现,小程序的前后端交互特别像Web1.0的模式,前端把交互行为封装成事件(event)发送到后端,后端处理完成后,通过setData方法将数据回传到前端,如图2所示。
图2小程序的交互传导
小程序提供的Events,基础的有类似单击、长按、触摸、滑动等,对于视频播放器等控件,还有监听播放、暂停等。这些事件比较基础,没有更高级的手势、多点触控等相关事件,但也还足够让开发者具体了解用户的输入,进而做出响应。而小程序给界面响应的wei一方式,是通过Page中的setDataAPI对界面上的数据进行更新,小程序会比较两次调用期间数据的变化,来决策需要更新哪部分的交互界面。
举个实际的例子,假设开发者需要做一个滑动切换页面的效果,在小程序中该如何实现?首先,是将变量数据引入渲染页面:
可以看到,distance是一个模版参数,它初始值为0,表示移动的距离。通过bindtouchstart等函数绑定上JavaScript的方法微信公众号投票看谁投的,将事件回传。
movePage:function(event){ varstatus={ needUpdate:false, distance:0 } //处理各种事件,计算是否需要刷新,和移动方向 if("touchstart"===event.type){ //开始计算移动 ... }elseif("touchend"===event.type){ //判定移动的距离是否足够. ... }elseif("touchcancel"===event.type){ //被打断就算了. ... }elseif("touchmove"===event.type){ //计算移动距离 ... } //根据移动的距离,来更新界面 if(status.needUpdate){ this.setData({ distance:status.distance }) }}而在JavaScript一端,则捕获事件、计算偏移量,然后将新的偏移量送到前端界面。
从这里可以看到,小程序的交互是典型的单向模式,前端回传事件,数据单向地推到前端,而不是通过类似“变量”、“状态”等方式来告知。这样的模式下,开发者对界面变化的控制往往不可能太精准,整个核心都依赖于小程序对两次数据变化的diff计算,这将会最终影响整个交互的性能。
小程序开发模式的特点至此,我们可以来总结一下小程序开发的一些特点了。整体来看,小程序是借了HTML5的技术栈,行了传统客户端开发的模式,这一点和React等平台会比较相近,可以视为HTML5的一个新分支。
从设计思路看,小程序做了大量的“限制”,最大的限制是开发者其实无法通过JavaScript这样的编程语言直接对界面进行控制,而是通过数据驱动来间接实现。这对于缺少开发经验的人而言,是有益的事情,因为降低了理解的门槛,但对于复杂的应用来说,这个模式开发起来比较呆板,往往是一个变化多处修改,增加了理解代码的成本。
开发小程序的坑开发小程序的日子,也是一个踩坑的历程。简单总结,小程序中的坑大概来自这几个方面:
Web兼容性。小程序引入了HTML/CSS作为技术栈,并在其基础上进行了定制。很多开发中的问题都来自于“定制”,因为你并不知道哪部分是被定制,哪部分是被继承了。比如,你用了一个CSS语法,发现并不生效,或者效果和浏览器中的不一样,于是,只能换一个写法,结果很有可能又会继续发现,这个新的写法可能效果也不对,于是只能继续尝试,如此反复,可能会消耗大量的时间。
开发环境不稳定。小程序的开发,是基于微信自制的IDE,但当下,IDE的稳定性、易用性都非常差,时常出现Bug,你以为是程序写错了,但其实,是IDE的Bug,重启一下IDE,一切都迎刃而解了。于是,当你日后开发小程序时出现某种异样,先重启IDE,再看问题还在不在,也许是种更节省时间的方式。
缺少真机调试环境。小程序的运行时其实就是微信,微信几乎没提供任何真机上的调试工具(也不能说完全没有,有一个只能在真机上瞪着眼睛看的日志框)。在模拟器中调试好的程序,可能在真机上运行起来并不如预期。比如,我们碰到过真机上白屏、位置错乱、动画效果不对,以及Android上至今还不能运行等问题。这对于稍微复杂的程序而言,颇为梦魇,想做一些细粒度的调整和优化,基本只能靠猜。
闭源且缺少学习资料。小程序整体上是闭源状态(虽然模拟器和IDE部分可以通过反编译来看),且缺少足够的学习资料。如果一旦碰到控件如何使用、为什么这么用不对之类的问题,就只能靠不停地试来解决,也需要耗费大量时间。
简而言之,作为一个新的开发平台,微信小程序从本身的稳定性,以及配套的工具链上都不算完善。对于早期开发者而言,需要耗费额外的精力去尝试和探索,但这也许就是一个新平台的价值和代价吧。
订阅2020年程序员(含iOS、Android及印刷版)请访问 http://dingyue.programmer.com.cn
【订阅咨询】QQ:2251809102电话:010-64351436