1. 微信小程序没有windowdocument,它更像是一个类似 Node.js 的宿主环境。因此在小程序内部不能使用 document.querySelector 这样的选择器,也不支持 XMLHttpRequestlocationlocalStorage 等浏览器 API,只能使用小程序自己提供的 API;
  2. 小程序不是直接 URL 访问的,而是通过信道服务进行通信和会话管理。所以不支持 Cookie!使用 wx.request 时不存在跨域问题;
  3. 和 Node 一样,小程序的 js 模块化加载采用 CommonJS 规范,通过 require 加载;
  4. 小程序是基于“数据驱动”模式的,但是它是“单向数据流”的绑定方式;

小程序架构

微信小程序分为“视图层”和“逻辑层”。视图层是在 webview 中渲染,逻辑层则用 JavaScriptCore 来渲染。其中视图层可以有多个,但逻辑层则只有一个。

小程序中视图层负责页面渲染,逻辑层负责逻辑处理、状态管理、请求和接口调用。逻辑层和视图层的通信是通过微信的 JSBridge 实现的。

Native 中有一个 WeixinJSBridge 模块。所以也可以说是通过 Native 通信的。

逻辑层数据变化通过 JSB 通知到视图层,触发视图层更新;当视图层触发事件则继续通过 JSB 将事件通知到逻辑层做处理。
WeixinJSB 在开发者工具、IOS 和 Android 的实现机制不同。在调用 Native 能力时主要使用 invokeHandler、在消息分发时使用 publishHandler —— 实际和 原生的 Webview 一样,就是通过微信的X5内核提供了互相调用函数的能力。

因为在一个小程序中可以打开多个视图层,要保证发送的消息准确送到每个具体的 webview 中,需要通过每个 webview 唯一标识 webviewId 来实现。发送消息时,携带 webviewId,然后逻辑层处理完对应的逻辑,如果需要通知或者执行对应 webview 代码,则可以通过 webviewId 找到对应的 webview ,下发通知。

小程序是单线程的吗?

不是。单线程不足以支撑这么“快”的小程序。
小程序启动时,会同时启动两个线程,一个负责页面渲染的 webview(实际不止一个),一个负责逻辑的 jSCore。逻辑层初始化后会将初始化数据通过 JSB 传递给渲染层进行渲染。渲染层 webview 页面渲染完后又会跟逻辑层通信。

页面渲染的 webview 不止一个?

小程序页面跳转会比普通的 HTML5 快很多。这是因为小程序的视图层做了预加载处理。实际的 webview 页面总是比真实打开的页面要多一个,这个多出来的隐藏 webview 就是提前初始化预热的,方便打开下一个页面使用。

小程序项目如何优化

通常我们会进行代码层面的优化。比如:

  1. 合理使用 setData,并不需要把所有数据都放在data中;
  2. 合理使用小程序事件,比如 onPageScroll
  3. 使用默认数据减少白屏时间;

等等。
但是还有一点:
小程序的逻辑层代码在小程序执行的生命周期内会常驻内存,并不会因为切换页面而释放资源!
利用这个特点,可以在逻辑层空闲时间对比页面流程进行一些优化 —— 比如提前获取下一个页面的数据并存入 app.js 的 globalData 中。当用户进入下一个页面时可以减少等待时间。

let prefetchTimer
const app = getApp()Page({onHide(){//记得清理定时器clearTimeout(prefetchTimer)},onShow(){//...this._setPrefetchData()},_setPrefetchData(){if(!app.globalData.xxx && 其他条件){prefetchTimer = setTimeout(() =>{//请求}, 10e3)}},//...
})

笔者的开源小程序功能组件集,github地址:yunUI。添加新组件了!功能更强大的图片上传与排序组件,希望能帮到各位。
目前为止已经有九个真正好用的组件和两个js工具,再添加几个就要开始着手改造、发到npm上了。欢迎大家star!欢迎提issue!

微信小程序内部那些事相关推荐

  1. 微信小程序内部视频流出 上手体验如何呢?

    前晚微信小程序内测邀请函发出,首批只开放给200名拥有微信服务号的开发者进行内测,现在网上曝光了一段疑似内部流出的微信应用号测试视频.看过效果演示之后,网友表示,好多App可以卸载了! 从视频可以看出 ...

  2. 微信小程序蓝牙ibeacon_微信小程序iBeacon测距及稳定程序的实现解析

    前言 iBeacon是苹果公司推出的一项低耗能蓝牙技术,由蓝牙设备发射包含指定信息的信号,再由移动设备接收信号,从而实现近场通信.微信小程序2017年开始支持iBeacon,摇一摇附近就是基于iBea ...

  3. 微信小程序iBeacon测距及稳定程序的实现

    iBeacon是苹果公司推出的一项低耗能蓝牙技术,由蓝牙设备发射包含指定信息的信号,再由移动设备接收信号,从而实现近场通信.微信小程序2017年开始支持iBeacon,摇一摇附近就是基于iBeacon ...

  4. 小程序内嵌h5页面分享_微信小程序webview内页面分享

    因为项目原因,之前在微信小程序内部使用 webview 嵌套了 h5 页面,现在要添加一个新的功能,用户在哪个页面进行了分享,被分享的用户从链接进来就跳转到哪个分享页面. 先了解一下 web-view ...

  5. 微信小程序内链微信公众号的方法

    最近接了一个需求,要求在微信小程序内部添加关注微信公众号的方式并给出解决方案,经过几天的翻官网文档,查周边资料,问资深技术员,初步给出两个解决方案: 题外话: 搬砖容易,建设难,搬砖的小伙伴请注明文章 ...

  6. 微信小程序全面开放近一年,姗姗来迟的阿里还有胜局吗?| 畅言

    微信的小程序全面开放将近一年了,阿里姗姗来迟却也没有缺席,微信与支付宝的战火在小程序领域继续蔓延.支付宝在上周全面开放了小程序,"小程序收藏"添加成为首屏默认应用. 微信似乎还没有 ...

  7. 微信小程序webview内页面分享

    因为项目原因,之前在微信小程序内部使用 webview 嵌套了 h5 页面,现在要添加一个新的功能,用户在哪个页面进行了分享,被分享的用户从链接进来就跳转到哪个分享页面. 先了解一下 web-view ...

  8. 微信小程序推流拉流live-pusher/live-player示例,使用本地搭建RTMP服务

    适用读者: 对微信小程序已经有基本的了解. 例如:小程序账号申请. 常用组件.小程序开发工具 对nodejs已经有基本的了解. 对微信小程序流媒体/实时音视频组件感兴趣的童鞋. 对小鱼易联/小鱼在家, ...

  9. 微信小程序下载文件wx.saveFile

    //*注:wx.saveFile下载的文件只可以微信小程序内部访问,不可做外部访问 downloadFile: function(e) {wx.showLoading({title: '下载中...' ...

最新文章

  1. Pycharm上传Gitlab
  2. Ruby系统中的AJAX开发技术简析
  3. 文本转声音,TTS语音实现
  4. 蜘蛛纸牌java注释_自己摸索的纸牌游戏代码,感觉还有很多知识不懂,任重道远啊!...
  5. kali 更新源_kali安装避坑
  6. MySQL官方备份_Mysqlbackup 备份详解(mysql官方备份工具)
  7. 下午进行就业前的一次培训
  8. Java_GUI创建单机版QQ聊天小程序并实现简单的小功能(附所有源码)
  9. Jquery 查看DOM上绑定的事件列表
  10. 98.set_include_path()
  11. java运行环境安装步骤_安装JAVA运行环境步骤
  12. watir_WatirMaker简介-录制基于Ruby的Watir
  13. 比湿和相对湿度的转换、体感温度的计算
  14. 利用python制作拼图_用python做一个三阶拼图
  15. 一个数据分析报告的框架,主要包含哪几项?
  16. OCR:通用数码管图像识别训练和使用
  17. 如何使用redis做一个定时任务?
  18. Spring Boot 学习[一] 介绍与入门
  19. 眼光毒辣!这家投资团队让 “鸡蛋森” 马克安德森投了都说好
  20. 头指针,头结点,首元结点的区别,头结点的优点

热门文章

  1. 联想卡在logo界面_联想电脑卡在载入界面如何修复 联想电脑卡在logo界面
  2. python二级用的是什么软件_考计算机二级用啥软件练
  3. bzoj 1671: [Usaco2005 Dec]Knights of Ni 骑士
  4. 人工智能-高等数学之微积分篇
  5. 剑指Offer-12:矩阵中的路径
  6. 近来学习的一些东西和思考(2)
  7. 如何用Graphpad Prism 8作折线图
  8. PIM协议原理与配置
  9. mongodb慢日志
  10. python pyqt5图片(QPixmap)和opencv图片数据结构相互转换