小程序技术全解 | 青训营笔记

111 阅读5分钟

这是我参与「第四届青训营」笔记创作活动的第9天

本堂课重点内容:

  • 发展历程: 发展历程、 核心数据、小程序生态
  • 业务价值: 与web区别、三大价值
  • 技术解析: 小程序原理、小程序语法、实现番茄时钟案例
  • 相关拓展: 跨端框架介绍、跨端框架原理

详细知识点介绍:

发展历程

让我们先来看一组数据 image.png

image.png

image.png (数据来源自阿拉丁)

2017年1月9日,微信正式发布的小程序。在这一点上,微信团队花了一年多的时间终于出现了。选举于1月9日公布,因为10年前的今天( 2007年1月9日),苹果公司发布了iPhone。iphone的发布标志着智能手机的诞生,而applet的发布标志着移动开发的又一片蓝海。

2017年3月27日,一个小程序增加了7个新功能:个人开发者开放、公众号自定义菜单跳小程序、公众号模板消息可打开相关小程序、模板消息跳小程序、绑定时可发送模板消息、兼容线下二维码、App分享用小程序打开。这些能力的更新扩展了小程序的使用,扩大了小程序的使用,并标记了小程序,这些程序已经成为水和电的移动开发领域以及公众。每件新事物的发展都需要团队的努力,小程序的发展也不例外。

2017年4月20日,公众号可以关联不同主体的小程序,这将更利于小程序的营销导流,将公众号和小程序引相引流得以失现。

2017年5月10日,微信发布新版本,支持附近小程序,用户可搜索附近5公里范围内的小程序。此举迈出了线上+线下流量整合的重要一步。

2017年5月19日,小程序页面支持“转发"功能,可转发小程序页面给好友或群。

2017年6月21日,小程序之间可以互相跳转;

......

核心数据

image.png (数据来源自阿拉丁)

可以看出,到2019年直至2020年,全网小程序数量已经远远超过了全网APP数量,一年之内小程序数量暴增,可见小程序在平日常使用中的依赖度是很高的。

小程序生态

image.png (数据来源自阿拉丁)

小程序自得到大多数人们的认可后,市场处于猛增式发展,多数厂家也逐渐推出了属于自己的小程序开发体系如QQ小程序、支付宝小程序、头条小程序等等。

业务价值

与WEB的区别

  • 有着固定的语法以及统一的版本管理,平台可以更方便的进行审核
  • 平台能够控制各个入口,如二维码,文章内嵌,端内分享。入口上也能带来更好的用户体验
  • 小程序基于特殊的架构,在流畅度上比WEB更好,有更优秀的跳转体验

三大价值

  • 渠道价值
    • 由于小程序的便捷性,依托于超级平台,小程序能够充分为很多场景导流,如美团和美团优选微信小程序带来的流量占比分别是40%和80%
  • 业务探索价值
    • 相比原生APP来说,小程序的开发难度和成本都降低的很多,这就创造了很多场景开发者能够用小程序来快速试错,不断探索新的业务价值
  • 数字升级价值
    • 线下到线上如何做?从轻消费类的快餐、茶饮到地产汽车等大宗消费,小程序都展示了良好的容错空间。我们线下场景的小程序覆盖范围很广。

技术解析

小程序原理

  • 第三方开发应用最简单最方便的方式(WebView + JSBridge)
  • 开发门槛低(HTML + JS + CSS)
  • 接近原生的使用体验(资源加载 + 渲染 + 页面切换)
  • 能够保证安全可控(独立 JS 沙箱)

image.png

小程序语法(以微信小程序为例)

<view
    wx:for="{{list}}"
    wx:if="isOpen"
    bindtap="onTap"
/>
Page({
    data:{
        list: ["a","b","c"],
        isOpen: true
    }
    onTap: function() {
        console.log('tap me!')
    }
})
view {
    background-color: "red";
    width: 750rpx;
}

实现番茄时钟案例(以微信小程序为例)

image.png

<view class="container">
    <view class="clock">
        {{ timeText }}
    </view>
    <button wx:if="{{ running }}" class="button" bindtap="onReset">重置</button>
    <button wx:else class="button" bindtap="onStart">开始</button>
</view>
const DEFAULT_TIME = 25 * 60;

function formatTime (time) {
    const minutes = Math.floor( time / 60);
    const seconds = time % 60;
    const mText = `0${minutes}`.slice(-2)
    const sText = `0${seconds}`.slice(-2)
    return `${mText} : ${sText}`
}

Page({
    data:{
        timeText: formatTime(DEFAULT_TIME),
        running: false,
    },
    setTime: function () {
        this.timer = setInterval(() => {
            this.time = this.time - 1;
            if (this.time < 0) {
                clearInterval(this.timer);
                return;
            }
            this.setData({
                timeText: formateTime(this.time),
            })
        },1000)
    },
    onStart: function () {
        if (!this.timer) {
            this.time = DEFAULT_TIME
            this.setTime()
            this.setData({
                running: true
            })
        }
    },
    onReset: function () {
        clearInterval(this.timer)
        this.timer = null
        this.time = DEFAULT_TIME
        this.setData({
            timeText: formatTime(this.time),
            running: false
        })
    }
})

image.png

(无法展示视频演示效果,截图代替)

相关拓展

跨端框架

  • 复杂应用构建
  • 一次开发可以跨多端

image.png

跨端框架原理

  • 编译时
  • 运行时

compiletime编译时的跨端框架,主要的工作量在编译阶段。他们框架约定了一套自己的DSL ,在编译打包的过程中,利用 babel 工具通过 AST 进行转译,生成符合小程序规则的代码。

image.png 这种方式容易出现 BUG ,而且开发限制过多。早期的Taro 1.0 和2.0的版本就是采用的这种方案。

举个栗子

// 框架
<View>{ foo ? <View /> : <Text /> }</View>

// 转义为小程序后
<view> <block wx:if={foo}><view /></block> <block wx:else><text /></block> </view>

无法完全抹平差异

而另外一种runtime 运行时模式, 跨端框架真正的在小程序的逻辑层中运行起来 React 或者是 Vue 的运行时,然后通过适配层,通过虚拟DOM及Template组件实现自定义渲染器。这种方式比静态编译有天然的优势,所以 Taro 的最新 Next 版本和 Remax 采用的是这种方案。

IMG_20220819_121207.png

在一些场景下相比小程序原生语法性能会更差

课后个人总结:

如今小程序已经遍布我们日常生活,给我们带来了极大地便利性,且现在的小程序开发市场仍在持续扩张,所以我认为在掌握前端的基础学习外,编写小程序技术也是个不错的学习之路,在一些跨端框架上,也集成了像Vue语法或React语法等,极大地减少了开发者的额外学习成本,我们也可以打造一个属于自己的专属小程序平台,让我们一起动起来吧!