| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> 比较小程序 和 Web 应用,解析小程序原理 -> 正文阅读 |
|
[移动开发]比较小程序 和 Web 应用,解析小程序原理 |
小程序实际的运行环境是在托管平台(也称为托管环境)。 托管平台可以是本机应用程序(类似于 Web 浏览器),也可以是(嵌入的引擎)操作系统。
另外,小程序的运行环境分为视图层和逻辑层。 视图层只处理渲染并监听发生的事件,逻辑层只处理数据和逻辑。 逻辑层通常用 JavaScript 编写。 **它用于处理数据并将其发送到视图层,并接收来自视图层的反馈。**虽然使用了 Web 技术,但 小程序 通常不运行在浏览器中,因此 Web 中的 JavaScript 的某些功能不可用,例如文档和窗口。 在 Web 应用中,渲染和脚本会相互阻塞,这就是为什么长时间运行脚本可能会导致页面变得无响应的原因,但在 小程序 中,两者是分开的,并且运行在不同的线程中。 开发人员可以使用浏览器公开的 DOM API 来进行 DOM 操作。 但是由于小程序的逻辑层和视图层是分开的,所以逻辑层(例如运行在 JavaScriptCore 中)不包含文档或窗口对象,并且不能使用某些 Web API。** 因此,像 jQuery 这样的一些库不能在小程序中运行**。** 此外,由于 JavaScriptCore 环境与 Node.js 不同,一些 npm 包也无法在 小程序 中运行。** 在视图层中,托管平台会将布局语言(例如 WXML)转换为 JavaScript 对象。 当逻辑层数据发生变化时,通过宿主平台提供的方法将数据从逻辑层传递到视图层,然后生成前后DOM的diff。 之后,差异将应用于原始 DOM 树并呈现更改后的 UI。 视图层小程序页面的视图层通常有一种带有模板机制的标记语言(如WXML、swan、AXML、TTML等),类似于Web开发中的HTML。** 小程序 运行时将标记语言翻译成 HTML**(每个页面在不同的 WebView 中呈现,但所有 WebView 共享图像缓存)或原生代码。 在为 小程序 页面设置样式时,通常会使用 CSS,有时还会使用响应式像素(也称为与密度无关的像素)等扩展。 视图层中使用的元素在 [[[#components]]] 部分中描述。例如下面这些例子:
用户代理将数据中的名称与视图层中的名称绑定,所以当页面加载时,会显示“你好微信!”。 当按钮被点击时,视图层会向逻辑层触发changeName事件,逻辑层会找到并执行相应的事件处理程序。 回调函数触发后,逻辑层将数据中的名称从微信改成小程序。 因为数据和视图层已经绑定,所以视图层会自动变为“Hello MiniApp!”。
Pages小程序中的页面代表小程序的一个页面,负责页面展示和交互。 每个页面通常对应小程序结构中的一个目录。 每个小程序页面通常包含一个用于逻辑层的 JavaScript 文件、一个用于展示视图的模板文件,以及用于页面样式和元数据的可选 CSS 和 JSON 文件。 对于小程序中的每个页面,开发者都需要在页面对应的 JavaScript 文件中进行注册,并在 Page 构造函数中指定页面的初始数据、生命周期回调、事件处理器等。
Behavior(类似于 Vue 中的 mixin )可用于使多个页面具有相同的数据字段和方法。
页面路由小程序中所有页面的路由由托管平台管理。托管平台会以堆栈的形式维护所有当前页面,同时小程序托管平台通常会提供获取当前页面堆栈的功能。 比如微信小程序(以及其他一些实现)中的getCurrentPages()函数返回一个数组,数组的每个元素都是一个代表一个页面的对象。 组件因为应用商店审核机制的原因,小程序通常会禁止使用一些 HTML 元素,当然也允许添加一些新的组件(元素),例如滑动条、常用图标(警告、搜索、设置、加载等)、地图、富文本编辑器、广告等。你也可以自定义组件。 自定义组件小程序开发人员还可以创建自定义组件。 这是百度智能程序中带有自定义组件的示例目录结构:
组件也有自己的。 例如,在自定义组件的 JavaScript 文件中,开发人员可以:
ManifestMiniApp 使用基于 JSON 的 manifest 文件,让开发者可以设置小程序的基本信息、窗口样式、页面路径等信息。
下表主要对比了 MiniApp 和 Web App 中的 manifest 属性。 表中的“-”字符表示相应清单中不存在此类属性。(参考:https://github.com/w3c/miniapp-manifest/blob/main/docs/explainer.md) 这么做为希望部署同一应用到 Web 应用和 小程序的开发人员提供了方便,因为:
打包小程序本身没有“域”,也不存在“跨域”,它下载到用户本地设备后会以包的形式运行。 开发者可以将小程序分成几个子包,用户代理可以在小程序使用时根据需要加载子包。 根据业务特点对小程序进行合理的分包,可以提高小程序的加载速度,优化用户体验。 Tips: 这篇文章解释了小程序打包的规范。https://github.com/w3c/miniapp-packaging/blob/main/docs/explainer.md 运行时多进程/线程架构小程序的具体进程模型与操作系统有关。 小程序托管平台尽可能确保 小程序在单独的进程中运行。 这样做的好处是更高的性能和更好的安全性。 但是,不同的小程序实现有不同的运行环境。例如下面几个类型的小程序: 微信小程序:微信小程序运行在多个平台上:iOS、Android、Windows、macOS,以及微信开发者调试工具。 这些平台中用于渲染非原生组件的脚本执行环境和环境都是不同的。 ISO: Andriod: 开发者工具: 百度智能程序:百度智能程序运行在三个平台上:iOS、Android,以及百度的开发者调试工具。 这三个平台的脚本执行环境和渲染非原生组件的环境是不同的。 IOS: Andriod: 开发者工具: 360 小程序360 小程序运行在 Windows 的360安全浏览器中。 生命周期小程序提供了一些生命周期事件和流程来管理整个 小程序 和每个页面的生命周期。详细部分可以参阅 小程序 生命周期规范(https://w3c.github.io/miniapp-lifecycle/)。
小程序冷启动时,托管平台会使用本地包加载小程序,同时会自动检测云端是否有新的包版本并异步下载。 下载完成后,下次用户触发冷启动时会使用新版本的包。 详细分析在小程序中,应用程序、页面和组件都有自己的生命周期。 本节主要将小程序应用/页面的生命周期状态与相关Web技术进行对比。 小程序页面通常使用 Page 构造函数注册到 JavaScript 文件中,并接受一个对象来指定初始数据、生命周期回调、事件处理程序等。 以下是一个基本的 Page 构造函数示例:
小程序由一个视图线程和一个或多个逻辑线程(也称为工作线程)管理。** 当用户第一次打开小程序时,视图线程和逻辑线程会同时启动初始化。** 逻辑线程初始化后,**运行小程序全局生命周期回调函数 app.onLaunch 和 app.onShow 创建小程序实例。 “launched”状态表示小程序初始化完成,只触发一次。 **触发该事件后,开发者可以获取小程序的基本信息,如URI等。 “Shown”是小程序在前台运行的生命周期状态。 一旦小程序启动完成,或者小程序从后台切换到前台,就会触发它。 全局应用初始化后,逻辑线程运行小程序页面生命周期回调函数page.onLoad,创建小程序页面实例。 “Loaded”表示小程序页面初始化完成。 通过该事件,开发者可以获得页面的基本信息,如页面的路径、查询等。 页面初始化后,逻辑线程等待视图线程初始化完成的通知。 当视图线程初始化完成并通知逻辑线程后,逻辑线程将初始化数据发送给视图线程进行渲染。 此时,视图线程开始第一次数据渲染。 第一次渲染完成后,视图线程进入“就绪”状态并通知逻辑线程。 逻辑线程调用 **page.onReady **函数,页面现在可用。 **页面准备好后,每次修改数据时,逻辑线程都会通知视图线程,视图线程会进行渲染。 当页面切换到后台时,逻辑线程调用 page.onHide **函数。 当页面回到前台时,会调用 **page.onShow 函数。 当小程序遇到脚本错误时,会调用 app.onError **函数。 当页面被销毁时,在页面被销毁之前调用 **page.onUnload **函数。 在 Web 应用中,“页面”通常是指顶层浏览上下文的文档,并没有(严格的)“应用”概念,因此小程序中的一些生命周期状态在 Web 应用中没有对应状态。 例如,当小程序进入后台时,逻辑线程调用 app.onHide 函数,而在 Web 应用中,visibilityState 属性和 onvisibilitychange 事件处理函数仅在网页隐藏时才有用。 和大多数原生应用一样,一个小程序只能有一个实例,但是一个网页应用可以同时出现在多个浏览器标签页中,所以网页应用中的 app.onHide 是没有对应关系的。 导航要在同一个托管平台上从一个小程序跳转到另一个小程序,通常会使用平台特定的 API 或组件。 例如,微信小程序有一个 **wx.navigateToMiniProgram(Object object) **方法和一个导航器组件:
有的小程序也支持 HTML 中的 a 元素用于导航。 离线体验在 Web 应用中,Service Worker 为离线体验提供了技术基础。** 它是浏览器在后台运行的脚本,可以拦截和处理网络请求,包括以编程方式管理响应缓存。** APIs小程序平台通常会提供自己的 API,有的有对应的 Web API,有的没有。 (可以在此处查看比较https://w3c.github.io/miniapp/white-paper/comparison.html)。 快照一些小程序的实现,比如快应用,可以在云端的一些页面上进行预渲染,生成渲染中间格式,称为快照。 压缩后的快照格式非常小。 例如,一个 50K 的 JavaScript 文件会生成一个约 3K 的快照。 虚拟DOM小程序的页面渲染经常使用虚拟 DOM 来保证页面更新时只更新变化的数据。 在 Web 应用中,虚拟 DOM 通常使用 JavaScript 实现,消耗大量 CPU,效率不高。 安全和隐私由于小程序运行在托管平台,在原生应用中人们只关心应用程序本身是否存在漏洞,在小程序中人们还需要知道托管平台是否安全。
|
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 1:42:22- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |