小程序开发基础
2021.1.18 星期二 :
基础
配置
navigationStyle
navigationStyle: custom
可以做顶部沉浸式体验,但是web-view不支持。
iOS/Android 客户端 6.7.2 版本开始,navigationStyle: custom 对 web-view 组件无效
全局变量
- app.js 文件中设置,globalData对象就是存储全局变量的。
this.globalData.hasLogin
和getApp().globalData.hasLogin
taro,uniapp 等多端框架,还会有其他方式。如果taro混合开发或者异步设置,上面方式可能并不合适。在taro中 getApp()只能取到一开始定义的值,并不能取到改变后的值
<!–
uni-app 全局变量实现的4种方式
一、公用模块
定义一个专用的模块,用来组织和管理这些全局的变量,在需要的页面引入。
注意:这种方式只支持多个vue页面或多个nvue页面之间公用,vue和nvue之间不公用。
二、挂载 Vue.prototype
将一些使用频率较高的常量或者方法,直接扩展到 Vue.prototype 上,每个 Vue 对象都会“继承”下来。
注意:这种方式只支持多个vue页面或多个nvue页面之间公用,vue和nvue之间不公用。
三、globalData
小程序中可以在 App 上声明全局变量,但在 Vue 中没有,uni-app 中在 App.vue 可以定义在 globalData 属性上,也可以使用 API 读写这个值。
这个方式支持vue和nvue共享数据。是目前nvue和vue共享数据的一种比较好的方式。
四、Vuex
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。
注意:这种方式只支持多个vue页面或多个nvue页面之间公用,vue和nvue之间不公用。
注意:对比前面的方式,该方式更加适合处理全局的并且值会发生变化的情况。
–>
样式
存储
### 耗时问题
<!– getStorage首次调用耗时较多,后续再调用getStorage就明显快很多,这是什么原因呢?
通过开发这工具的 network 设置 offline 模式,可以发现 getStorage 是通过了网络的。
微信小程序的 getStorage 是按用户来隔离的。 –>
隔离策略
同一个微信用户,同一个小程序 storage 上限为 10MB。storage 以用户维度隔离,同一台设备上,A 用户无法读取到 B 用户的数据;不同小程序之间也无法互相读写数据。
清理策略
本地缓存的清理时机跟代码包一样,只有在代码包被清理的时候本地缓存才会被清理。
组件
封装组件
1 | // app.js |
事件
请求
不能修改请求头。
referer是小程序固定:
#### 使用限制
- 网络请求的 referer header 不可设置。其格式固定为 https://servicewechat.com/{appid}/{version}/page-frame.html,其中 {appid} 为小程序的 appid,{version} 为小程序的版本号,版本号为 0 表示为开发版、体验版以及审核版本,版本号为 devtools 表示为开发者工具,其余为正式版本;
- wx.request、wx.uploadFile、wx.downloadFile 的最大并发限制是 10 个;
- wx.connectSocket 的最大并发限制是 5 个。
- 小程序进入后台运行后,如果 5s 内网络请求没有结束,会回调错误信息 fail interrupted;在回到前台之前,网络请求接口调用都会无法调用。
cookie
微信小程序没有cookie!!!
那就需要我们自己去存储cookie,并且在请求的时候加上cookie。1
2
3
4
5
6
7
8
9
10
11static getHeader ({ method, header }) {
const defaultHeader = {
'Cookie': cookie.getCookie(),
}
if (method == 'POST') {
defaultHeader['Content-Type'] = 'application/x-www-form-urlencoded'
}
return Object.assign({}, defaultHeader, header)
}
小程序内调用 web-view 组件实现内嵌的网页,目前仅支持部分 jsapi 能力,关于 web-view 接口具体使用说明和限制,请 点击查看
文档-web-view: https://developers.weixin.qq.com/miniprogram/dev/component/web-view.html
web-view网页中可使用JSSDK 1.3.2提供的接口返回小程序页面。1
2
3
4wx.miniProgram.navigateTo({url: '/path/to/page'})
wx.miniProgram.postMessage({ data: 'foo' })
wx.miniProgram.postMessage({ data: {foo: 'bar'} })
wx.miniProgram.getEnv(function(res) { console.log(res.miniprogram) })
功能
分享
关于微信 OpenSDK 适配 iOS 16 系统的说明: https://developers.weixin.qq.com/community/develop/doc/000ac2067c82b85b064e79f0455401?page=3#comment-list
微信 iOS OpenSDK 通过剪切板在应用和微信间进行数据传递,在用户同意后完成授权登录、分享等功能。具体说明如下:
为了提升用户体验,微信和 OpenSDK 进行数据传输方式的改造,尽量避免使用剪切板传递数据。具体说明如下:
1、对于一般传输数据的接口,会在 Scheme 或者 Universal Link 中携带相关数据;
2、对因传输数据量较大等原因无法使用上述数据传输方式的接口,保持通过剪切板传递数据。
因此,开发者需要应用升级 OpenSDK,并配合微信客户端 8.0.24 及以上版本使用。
分包
分包加载
目前小程序分包大小有以下限制:
- 整个小程序所有分包大小不超过 20M
- 单个分包/主包大小不能超过 2M
具体使用方法请参考:
- 使用分包
- 独立分包
- 分包预下载
- 分包异步化
性能与体验
性能与体验:https://developers.weixin.qq.com/miniprogram/dev/framework/performance/
代码包体积优化
除了 代码包体积、代码注入、首屏渲染之外,发版频率等因素也会影响小程序启动耗时。
消息订阅
请注意,小程序模板消息接口将于2020年1月10日下线,开发者可使用订阅消息功能
文档-小程序订阅消息
消息类型
一次性订阅消息用
长期订阅消息
目前长期性订阅消息仅向政务民生、医疗、交通、金融、教育等线下公共服务开放,后期将逐步支持到其他线下公共服务业务。
设备订阅消息
订阅消息和模板消息
再见,小程序模板消息!今天起,用订阅消息来通知用户吧
微信公开课 2020-01-10 21:43
- 1月11号开始,小程序开发者发布的新版本不支持模板消息,仅支持订阅消息。
- 以防万一,为避免用户的体验受到损害,我们也提供了三个月的“缓冲期”。
即4月10号24时前使用模板消息。
其它
其他
权限
域名配置
如果没有服务器?或者域名服务器根目录没有操作权限呢??
必须在服务器根目录配置,否则请走nginx代理转发。
没有发现其他的可以绕过微信验证的方式。
政策
禁止小程序JavaScript解释器
关于禁止小程序JavaScript解释器使用规范要求:https://developers.weixin.qq.com/community/minihome/doc/0000ae500e4fd0541f2ea33755b801
为进一步提升小程序的安全性和用户体验,目前平台对提审的小程序均需进行安全检测,在检测过程中,发现有小程序采用内置 JavaScript 解释器(如eval5、estime、evil-eval等)的方式,动态执行JS代码、对小程序wxml代码进行热更新。对于使用解释器的小程序,平台将自2022年7月6日开始在代码审核环节进行驳回,请各位开发者于7月6日前完成自查、修复。
<!–
- 我们首先要写一个 JavaScript 的编译器,将 JavaScript 代码编译成二进制的字节码。
- 找一张图片,将字节码编码并隐藏进图片中。
- 在小程序中引入藏有 JavaScript 字节码的图片,并且解码出字节码。
- 写一个对应的字节码虚拟机,并且执行从图片中解出的字节码。
为什么无法从根本上禁止小程序代码的热更
先说结论,只要满足以下两个条件,那么从根本上禁止热更都是无稽之谈:
宿主语言图灵完备
允许通过网络读取数据
–>