正版微信小程序开发之一:语言,生命周期与数据渲染

小程序上线至今已有1年多时间了,我跟大家一样,目睹了小程序生态的演进,和API的变化。时下,打开某度搜索小程序开发,可谓是海量结果,然而真正理解了小程序,有质量的开发教程可谓“凤毛麟角”。我在这个开篇里想跟大家先探讨一下小程序的运行原理,做到知己知彼,再对症下药,用比较正确的开发姿势和工具去开发小程序。

语言与渲染环境

小程序的开发语言是JavaScript(不知道的请举手),小程序早期Runtime并不支持ES5+的语法,现在你可以看到的较新版本的DevTools里有个“ES6转ES5”,这个内置的预处理极大的方便了编码,tips:小程序ES6代码转译也是用的Babel,对API的支持情况可以看看这篇文档https://developers.weixin.qq.com/miniprogram/dev/devtools/details.html#客户端es6-api-支持情况

在这里照顾一下新同学,简单说说关于Javascript和ES的概念,老同学请略过这一段。

准确地说,ES(ECMAScript)并不是什么语言级别的东西,它的Level可比语言要高,一般称为“Specification(规范)”。JavaScript只是对这个规范的具体实现和扩展,玩过AdobeFlash的同学(暴露年龄~~),肯定知道ActionScript,它也是ECMAScript的实现。世上本没有ES5,只是因为有了ES6(版本号:ES-2015),然后是ES7(ES-2016)。

那么这些ESx有什么样差异呢?这得分阶段来看了:

在ES2015规范问世后相当长的一段时间内,大概是JavascriptCore/V8等这些解释器还没准备好拥抱它,在这段时间里,需要把新的语法转换成旧的写法,解释器才能正确的解释执行。因此就出现了Babel这样的转译器以及各种Polyfill模块;后来,Mozilla/Google/Apple这些大厂开始升级解释器,陆续内建地支持ES新语法。(不能再写这个了,不然我得把文章标题改为JavaScript的前世今生啦~~)

回到微信小程序里来,就语言环境来说,有三种:

  • iOS:JavaScriptCore/JsCore
  • Android:X5,基于webkit(WebCore + JsCore)
  • 开发工具:nwjs(原名是node-webkit),基于 Chromium和 Node.js运行

总体上说来,这三个语言环境没什么太大的差异,无非是各自的各个版本对ES语法及新特性的支持情况有稍许不同。对开发来说,无需过多关心这个,打包上传时“ES6转ES5”就OK啦,有坑再填。

生命周期

小程序管理生命周期的对象有三个,App,Page和Component,其中Page和Component都属于UI层面。每个对象都有自己的生命周期,并且这些对象的生命周期函数在运行时也是穿插在一起的,因此不能孤立地看待不同对象的生命周期。

我们先来看看这三个对象的具体情况:

App生命周期

App lifecycle

App只会初始化一次,也就是说 app.onLaunch 回调只会call一次,紧接着就call app.onShow,进入本次启动后要显示的Page的生命周期。

当退出小程序时,call 当前页面的 page.onHide,最后调用 app.onHide,show和hide循环往复。

Page生命周期

Page lifecycle

当页面被请求时,页面初始化(包括内部引用组件的创建),然后调用 page.onLoad,页面加载完毕后, page.onShow

当离开页面时,有两种情况:

  • 如果页面出栈(如:导航的redirect/reLaunch),则调用 page.onUnload

  • 如果页面不出栈(如:导航的navigate),则调用page.onHide

Component生命周期

Component生命周期

组件从创建到渲染前,依次调用 component.createdcomponent.attached 回调,渲染树创建完成后,开始首次渲染,调用 component.ready 回调。

当组件节点在DOM Tree上移动后,调用 component.moved;

当组件被卸载(通常是条件渲染或者Page被卸载)时,调用 component.detached,组件的生命周期结束。

App与Page的生命周期关系

App与Page的生命周期关系

当App完成启动阶段后,开始进入本次启动的首个页面的生命周期,依次调用 page.onLoadpage.onShow

当App退出(切到后台)时,会先调用当前显示页面的 page.onHide,然后调用 app.onHide

当App唤醒(切回前台)时,会依次调用 app.onShow 和 本次启动的首个页面的 page.onShow

Page与Component的生命周期关系

Page与Component的生命周期关系

)

小程序组件在引用页面初始化时创建(未渲染),依次调用 createdattached,当所有关联组件节点被加入DOM Tree时,引用页面上触发 page.onLoad。同时,组件节点开始进行渲染树合并,主要是混入CSSTree。

当组件节点首次渲染完成后,组件内调用 ready

当全部关联组件 ready 后,引用页面上触发 page.onReady

视图/数据渲染

在讲渲染前,先来看一下大家耳熟能详的两种模式(早期靠手的时代这里就略过不说了):双向绑定和单向数据流。

双向绑定

通过代码逻辑,把Model和View binding在一起,更新Model时,View就会自动更新,反过来,如果更新了View,Model的数据也自动被更新了,这种情况就是双向绑定。

典型框架:Vue。

单向数据流(单向绑定)

单向数据流模式主要是加入了一个Store做状态管理,View上触发动作,动作改变Store,Store变化引起View更新(单向数据绑定)。

典型框架:React。

我们这里重点不是去讨论单向和双向的问题,因此不做更多展开描述,主要来看看小程序的数据渲染方式。

微信小程序使用的是单向绑定,有经验的同学可能从 setData 这个函数就猜想出来了。一起来一段简单的例子:

// page.js
Page({
  onLoad(){
     wx.request({
       url: 'https://api.server.com/data',
       success: this.setData.bind(this)
     })
  }
})
<block wx:if="{{data.sample}}">
  <view>{{data.sample}}</view>
</block>

<block wx:else>
LOADING...
</block>

上面这个简单的例子中,一开始page会显示“LOADING...”,当HTTP请求完成后,页面会显示API服务器响应的数据。

这就是小程序数据渲染的大致过程了。

setData之后?

setData之后,到view被更新之前,发生了什么样的细节呢?欢迎在留言区表达你的看法。

公众号 前栈笔记

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容