小程序运行时
收藏
我的收藏运行环境
抖音小程序运行在小程序 SDK 上,但是由于 SDK 嵌入的宿主不同,小程序 SDK 提供的能力集合可能会根据宿主的不同而变化。
- •在 iOS 中,小程序的逻辑层 JavaScript 代码运行在 JavaScriptCore 中,视图层由 WKWebView 进行渲染。
- •在 Android 中,小程序的逻辑层 JavaScript 代码运行在 V8 中,视图层由 Mobile Chrome 进行渲染。
由于小程序在不同的操作系统/宿主下,能力与样式的支持并不完全相同,所以在开发者工具中完成开发之后,需要在不同环境下对自己的小程序进行验证,验证无问题后再上传。
运行机制
启动
小程序启动会有两种方式,冷启动和热启动。
- •冷启动:用户首次打开小程序,或小程序被主动销毁(后台运行超过 5 分钟)后再次打开时,小程序需要重新加载启动,即冷启动。
- •热启动:如果用户已经打开过某小程序,然后在一定时间内再次打开该小程序,此时小程序并未被销毁,只是从后台状态进入前台状态,这个过程就是热启动。
前台状态和后台状态
首次打开小程序时候,小程序会处于前台运行状态。
点击右上角关闭按钮关闭小程序或者离开宿主客户端时,小程序 并不会直接销毁,而是进入后台运行状态。小程序在后台停留超过 5 分钟会被主动销毁。
当未被系统销毁的小程序再度被打开或者激活时,会从后台运行切换为前台运行。
更新
小程序每次冷启动时,都会优先使用本地已经缓存的程序包启动小程序,同时异步检查是否有更新版本。
销毁
用户点击右上角的关闭按钮关闭小程序后,小程序仅是进入后台状态,并未被销毁。只有当小程序在后台状态下满足以下条件时,才会被销毁。
- •当小程序进入后台,可以维持一段时间(5 分钟)的后台运行状态,如果这段时间内都未再进入前台,小程序会被销毁。
- •当小程序占用系统资源过高,可能会被系统销毁或被客户端(头条、抖音或其它宿主)主动回收。
在 iOS 上,当客户端在一定时间间隔内连续收到系统内存告警时,会根据一定的策略,主动销毁小程序,并提示用户 「运行内存不足,请重新打开该小程序」。 建议小程序在必要时使用 tt.onMemoryWarning 监听内存告警事件,进行必要的内存清理。
JavaScript 支持情况
运行限制
基于安全考虑,小程序中不支持动态执行代码:
- •不支持
eval
。- •不支持
new Function()
创建函数。小程序中禁止访问全局对象:
- •禁止访问
globalThis
。- •禁止访问
window
。ES6 支持情况一览表
抖音小程序很大程度上是支持 ES6 的,但是有少部分特性无法支持,目前的情况如下:
String
名称 | iOS 9 | iOS 10 及以上版本 | Android |
codePointAt | ✅ | ✅ | ✅ |
normalize | ❌ | ✅ | ✅ |
includes | ✅ | ✅ | ✅ |
startsWith | ✅ | ✅ | ✅ |
endsWith | ✅ | ✅ | ✅ |
repeat | ✅ | ✅ | ✅ |
String.fromCodePoint | ✅ | ✅ | ✅ |
Array
名称 | iOS 9 | iOS 10 及以上版本 | Android |
copyWithin | ✅ | ✅ | ✅ |
find | ✅ | ✅ | ✅ |
findIndex | ✅ | ✅ | ✅ |
fill | ✅ | ✅ | ✅ |
entries | ✅ | ✅ | ✅ |
keys | ✅ | ✅ | ✅ |
values | ✅ | ✅ | ✅ |
includes | ✅ | ✅ | ✅ |
Array.from | ✅ | ✅ | ✅ |
Array.of | ✅ | ✅ | ✅ |
Number
名称 | iOS 9 | iOS 10 及以上版本 | Android |
isFinite | ✅ | ✅ | ✅ |
isNaN | ✅ | ✅ | ✅ |
parseInt | ✅ | ✅ | ✅ |
parseFloat | ✅ | ✅ | ✅ |
Number.isInteger | ✅ | ✅ | ✅ |
Number.EPSILON | ✅ | ✅ | ✅ |
Number.isSafeInteger | ✅ | ✅ | ✅ |
Math
名称 | iOS 9 | iOS 10 及以上版本 | Android |
trunc | ✅ | ✅ | ✅ |
sign | ✅ | ✅ | ✅ |
cbrt | ✅ | ✅ | ✅ |
clz32 | ✅ | ✅ | ✅ |
imul | ✅ | ✅ | ✅ |
fround | ✅ | ✅ | ✅ |
hypot | ✅ | ✅ | ✅ |
expm1 | ✅ | ✅ | ✅ |
log1p | ✅ | ✅ | ✅ |
log10 | ✅ | ✅ | ✅ |
log2 | ✅ | ✅ | ✅ |
sinh | ✅ | ✅ | ✅ |
cosh | ✅ | ✅ | ✅ |
tanh | ✅ | ✅ | ✅ |
asinh | ✅ | ✅ | ✅ |
acosh | ✅ | ✅ | ✅ |
atanh | ✅ | ✅ | ✅ |
Object
名称 | iOS 9 | iOS 10 及以上版本 | Android |
is | ✅ | ✅ | ✅ |
assign | ✅ | ✅ | ✅ |
getOwnPropertyDescriptor | ✅ | ✅ | ✅ |
keys | ✅ | ✅ | ✅ |
getOwnPropertyNames | ✅ | ✅ | ✅ |
getOwnPropertySymbols | ✅ | ✅ | ✅ |
Other
名称 | iOS 9 | iOS 10 及以上版本 | Android |
Symbol | ✅ | ✅ | ✅ |
Set | ✅ | ✅ | ✅ |
Map | ✅ | ✅ | ✅ |
Proxy | ❌ | ✅ | ✅ |
Reflect | ✅ | ✅ | ✅ |
Promise | ✅ | ✅ | ✅ |
async/await | ✅ | ✅ | ✅ |