Skip to content
<

微信小程序的开发与原理

小程序的诞生

小程序并非凭空冒出来的一个概念. 当微信中的 WebView 逐渐成为移动 Web 的一个重要入口时, 微信就有相关的 JS-SDK 了. JS-SDK 解决了移动网页能力不足的问题, 通过暴露微信的接口使得 Web 开发者能够拥有更多的能力, 然而在更多的能力之外, JS-SDK 的模式并没有解决使用移动网页遇到的体验不良的问题.

微信面临的问题是如何设计一个比较好的系统, 使得所有开发者在微信中都能获得比较好的体验. 这个问题是之前的 JS-SDK 所处理不了的, 需要一个全新的系统来完成, 它需要使得所有的开发者都能做到:

  • 快速的加载

  • 更强大的能力

  • 原生的体验

  • 易用且安全的微信数据开放

  • 高效和简单的开发

这就是小程序的由来.

小程序与普通网页开发的区别

小程序的主要开发语言是 JavaScript, 小程序的开发同普通的网页开发相比有很大的相似性. 对于前端开发者而言, 从网页开发迁移到小程序的开发成本并不高, 但是二者还是有些许区别的.

网页开发渲染线程和脚本线程是互斥的, 这也是为什么长时间的脚本运行可能会导致页面失去响应, 而在小程序中, 二者是分开的, 分别运行在不同的线程中. 网页开发者可以使用到各种浏览器暴露出来的 DOM API, 进行 DOM 选中和操作. 而如上文所述, 小程序的逻辑层和渲染层是分开的, 逻辑层运行在 JSCore 中, 并没有一个完整浏览器对象, 因而缺少相关的 DOM API 和 BOM API. 这一区别导致了前端开发非常熟悉的一些库, 例如 jQuery、Zepto 等, 在小程序中是无法运行的. 同时 JSCore 的环境同 NodeJS 环境也是不尽相同, 所以一些 NPM 的包在小程序中也是无法运行的.

网页开发者需要面对的环境是各式各样的浏览器, PC 端需要面对 IE、Chrome、QQ浏览器等, 在移动端需要面对 Safari、Chrome 以及 iOS、Android 系统中的各式 WebView. 而小程序开发过程中需要面对的是两大操作系统 iOS 和 Android 的微信客户端, 以及用于辅助开发的小程序开发者工具, 小程序中三大运行环境也是有所区别的.

小程序配置

小程序开发目录结构

|-- app.js
|-- app.json
|-- app.wxss
|-- project.config.json
|-- sitemap.json
|-- pages
|   |-- index
|   |   |-- index.wxml
|   |   |-- index.js
|   |   |-- index.json
|   |   |-- index.wxss
|   |-- logs
|   |   |-- logs.wxml
|   |   |-- logs.js
|-- utils

JSON 语法

这里说一下小程序里 JSON 配置的一些注意事项.

JSON 文件都是被包裹在一个大括号中 {}, 通过 key-value 的方式来表达数据. JSON 的 Key 必须包裹在一个双引号中, 在实践中, 编写 JSON 的时候, 忘了给 Key 值加双引号或者是把双引号写成单引号是常见错误.

JSON 的值只能是以下几种数据格式, 其他任何格式都会触发报错, 例如 JavaScript 中的 undefined.

  • 数字, 包含浮点数和整数

  • 字符串, 需要包裹在双引号中

  • Bool值, true 或者 false

  • 数组, 需要包裹在方括号中 []

  • 对象, 需要包裹在大括号中 {}

  • Null

还需要注意的是 JSON 文件中无法使用注释, 视图添加注释会引发报错.(JSON5可以)

app.json 配置

app.json 是当前小程序的全局配置, 包括了小程序的所有页面路径、界面表现、网络超时时间、底部 tab 等.

举个栗子

json
{
    "pages": [
        "pages/index/index",
        "pages/logs/logs"
    ],
    "window": {
        "backgroundTextStyle": "light",
        "navigationBarBackgroundColor": "#fff",
        "navigationBarTitleText": "WeChat",
        "navigationBarTextStyle": "black"
    }
}

我们简单说一下这个配置各个项的含义:

  • pages 字段 -- 用于描述当前小程序所有页面路径, 这是为了让微信客户端知道当前你的小程序页面定义在哪个目录.

  • window 字段 -- 定义小程序所有页面的顶部背景颜色, 文字颜色定义等.

页面配置

每一个小程序页面也可以使用同名 .json 文件来对本页面的窗口表现进行配置, 页面中配置项会覆盖 app.json 的 window 中相同的配置项.

举个栗子

json
{
    "navigationBarBackgroundColor": "#ffffff",
    "navigationBarTextStyle": "black",
    "navigationBarTitleText": "微信接口功能演示",
    "backgroundColor": "#eeeeee",
    "backgroundTextStyle": "light"
}

小程序的运行时

渲染层和逻辑层

首先, 我们来简单了解下小程序的运行环境. 小程序的运行环境分成渲染层和逻辑层, 其中 WXML 模板和 WXSS 样式工作在渲染层, JS 脚本工作在逻辑层.

小程序的渲染层和逻辑层分别由2个线程管理: 渲染层的界面使用了 WebView 进行渲染; 逻辑层采用 JsCore 线程运行 JS 脚本. 一个小程序存在多个界面, 所以渲染层存在多个 WebView 线程, 这两个线程的通信会经由微信客户端(下文中也会采用 Native 来代指微信客户端) 做中转, 逻辑层发送网络请求也经由 Native 转发.

...先放一放