banner
cos

cos

愿热情永存,愿热爱不灭,愿生活无憾
github
tg_channel
bilibili

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

终于到了我超期待的一门课~~

课程目标:

  • 认识和了解小程序的业务产品价值
  • 学习和掌握小程序相关技术原理

小程序的发展历程#

发展历程#

image.png

image.png

核心数据#

image.png

小程序生态#

image.png

业务价值#

与 WEB 的区别#

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

三大价值#

渠道价值#

  • 便捷导流

由于小程序的便捷性,依托于超级平台,小程序能够充分为很多场景导流,如美团和美团优选微信小程序带来的流量占比分别是 40% 和 80%

业务探索价值#

  • 快速试错

相比原生 APP 来说,小程序的开发难度和成本都降低的很多,这就创造了很多场景开发者能够用小程序来快速试错,不断探索新的业务价值

数字升级价值#

  • 容错空间大,覆盖范围广

线下到线上如何做?从轻消费类的快餐、茶饮到地产汽车等大宗消费,小程序都展示了良好的容错空间。线下场景的小程序覆盖范围很广。

小程序技术解析#

小程序原理#

第三方开发应用最简单最方便的方式?

  • WebView + JSBridge
    • WebView:移动端提供的运行 JavaScript 的环境,相当于 App 内的浏览器页面
    • JSBridge:顾名思义,作为桥梁开发者可以调用 App 本身的一些 api

几个问题:

  • 无网络的情况体验不佳
  • 网页切换体验不佳
  • 如何管控保证安全

而小程序通过以下方式,解决了这些问题:

  • 开发门槛低 ——HTML+JS+CSS
  • 接近原生的使用体验 —— 资源加载 + 渲染 + 页面切换
  • 安全管控 —— 独立 JS 沙箱:隔绝操作 dom 的方式
    • 不操作 DOM 如何控制页面渲染?
    • Data -> 根据数据处理 DOM -> 页面

image.png

小程序语法#

image.png

如图:比如字节小程序是 TTML/JS/TTSS,而微信小程序则是 WXML/JS/WXSS,对应 HTML/JS/CSS

实现简易番茄时钟#

下面试一试在微信小程序上实现如图一个番茄钟~(不同的小程序语法上大同小异)

代码片段

番茄钟.gif

编写 tomatoClock.wxml(html)#

简单的用 html 写个界面先~

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

{{timeText}} 实现页面与 js 中数据的双向绑定(该数据更新时页面也会进行渲染~)

编写 tomatoClock.js#

编写 js 进行事件函数、该页面数据的绑定

// pages/apply/tomatoClock/tomatoClock.js
const DEFAULT_TIME = 25*60;	// 25分钟
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}`;
}

从后往前截断实现前导 0 补全,就可以展示两位数时间(学到了!)

然后是事件的处理,setTimer 函数设置一个间隔 1s 的定时器,设置初始 time 为默认时间,每隔 1s 使得当前 time-1 (同时页面也会刷新),onStart 事件在开始时设置定时器并置 running 为 true,onReset 事件在重置时时清除定时器,设置 running 为 false 并将 timeText 设置为默认时间

Page({
  /**
   * 页面的初始数据
   */
  data: {
    timeText: formatTime(DEFAULT_TIME),
    running: false
  },
  setTimer:function() {
    this.timer = setInterval(() => {
      this.time = this.time - 1;
      if(this.time < 0) {
        clearInterval(this.timer);
        return;
      }
      this.setData({
        timeText: formatTime(this.time)
      })
    }, 1000);
  },
  // 事件函数 开始时设置定时器并置running为true
  onStart: function() {
    if(!this.timer) {
      this.time = DEFAULT_TIME;
      this.setTimer();
      this.setData({
        running: true
      })
    }
  },
  // 事件函数 重置时清除定时器,设置running为false并将timeText设置为默认时间
  onReset: function() {
    clearInterval(this.timer);
    this.timer = null;
    this.time = DEFAULT_TIME;
    this.setData({
      timeText: formatTime(DEFAULT_TIME),
      running: false
    });
  },
  // else 生命周期函数(监听页面加载、渲染等)
})

编写一点点 wxss(css)#

可以在 app.wxss 中,实现全局通用的 css 如 container 等

/**app.wxss**/
page { background-color: #97ABFF; }
.container {
  height: 100%;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  padding: 200rpx 0;
  box-sizing: border-box;
  background-color: #97ABFF;  
} 

在页面自己的 css 里 (index.wxss),写该页面所需的 css~

/**index.wxss**/
.clock {
  line-height: 400rpx;
  width: 400rpx;
  text-align: center;
  border-radius: 50%;
  border: 5px solid white;

  color: white;
  font-size: 50px;
  font-weight: bold;
}

.button {
  margin-top: 200rpx;
  text-align: center;
  border-radius: 10px;
  border: 3px solid white; 
  background-color: transparent;

  font-size: 25px;
  color: white;
  padding: 5px 10px;
}

相关拓展#

什么是跨端框架?

  • 复杂应用构建
  • 一次开发可以跨多端(微信小程序、各系小程序等等)

跨端框架介绍#

image.png

跨端框架原理#

编译时#

AST 语法树#

抽象语法树 - 维基百科

计算机科学中,抽象语法树Abstract Syntax Tree,AST),或简称语法树(Syntax tree),是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。之所以说语法是 “抽象” 的,是因为这里的语法并不会表示出真实语法中出现的每个细节。比如,嵌套括号被隐含在树的结构中,并没有以节点的形式呈现;而类似于 if-condition-then 这样的条件跳转语句,可以使用带有三个分支的节点来表示。

和抽象语法树相对的是具体语法树(通常称作分析树)。一般的,在源代码的翻译和编译过程中,语法分析器创建出分析树,然后从分析树生成 AST。一旦 AST 被创建出来,在后续的处理过程中,比如语义分析阶段,会添加一些信息。

image.png

解析 -> 生成 AST 语法树 -> 生成页面

image.png

如:

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

-> 转化为字节小程序的语法

<view><block tt: if={foo}><view /></block><block tt:else><text /></block></view>

天然缺陷:无法完全抹平差异

  • 小程序本身是有很多限制的
  • 所以大部分方案都是运行时方案

运行时#

虚拟 DOM#

本质为 js 中的一个对象,有很多 dom 中的属性值标签等,通过这个对象可以生成我们的实际 DOM

Template 组件#

小程序中提供的动态生成的模板。

image.png

运行时结构#

image.png

  • 运行时的方案也不是完美的
  • 在一些场景下相比原生小程序的语法性能会更差
  • 大部分场景下都可!

总结感想#

这节课大致讲解了小程序的发展历程和技术解析,实现了一个简易的番茄钟小程序~

本文引用的大部分内容来自张晓伟老师的课

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。