大家好,我,阿盟
Web Workers 提供了在后台线程中执行计算密集型任务的能力,有助于充分利用多核处理器的计算能力,微信小程序也是在基础库 v2.18.1 开始支持在插件内使用 worker,但与浏览器对比,还是有显著的一些差异,接下来我们就来介绍并实践操作一下
1. 跨域限制:在小程序中,Web Workers 通常不允许跨域加载脚本。这意味着 Web Workers 只能加载与主线程代码在同一域下或其子域下的脚本文件,而不像浏览器中的 Web Workers 可以加载来自不同域的脚本。这是为了维护小程序的安全性和防止跨域问题。
2. 本地资源限制:小程序的 Web Workers 受到资源下载的限制,例如限制了 HTTP 请求的能力,因此在 Web Workers 中进行网络请求可能受到限制。
3. WebSocket 限制:小程序中的 Web Workers 通常不支持直接创建 WebSocket 连接,这与浏览器中的 Web Workers 不同。WebSocket 连接通常需要在主线程中创建和管理。
4. IndexedDB 限制:小程序中的 Web Workers 通常不支持 IndexedDB 数据库的访问,这是因为小程序环境对存储访问有一些限制。
5. 并发限制:浏览器通常允许多个 Web Workers 同时运行,但具体的线程数限制取决于浏览器的实现。通常,现代浏览器支持多个 Web Workers,可能在不同核心上并行执行它们, 但在小程序中,Worker 最大并发数量限制为 1 个,创建下一个前请用 Worker.terminate() 结束当前 Worker
// 示例代码
// 1. 配置 Worker 信息
{
"workers": "workers"
// 如采用分包模式
"isSubpackage": true
}
// 微信小程序中使用 Web Workers
const worker = wx.createWorker('worker.js');
// 监听从 Web Worker 返回的消息
worker.onMessage(function (res) {
console.log('Received message from Web Worker:', res);
});
// 向 Web Worker 发送消息
worker.postMessage({ data: 'Hello from main thread' });
// 在 Web Worker 文件 worker.js 中定义 Worker 的逻辑
// worker.js
onmessage = function (e) {
console.log('Received message in Web Worker:', e.data);
postMessage({ result: 'Hello from Web Worker' });
};
// 从基础库 v2.27.3 开始,如果 worker 代码配置为了分包,也就是配置了isSubPackage为true,则需要先通过 wx.preDownloadSubpackage 接口下载好 worker 代码,再初始化 Worker
var task = wx.preDownloadSubpackage({
packageType: "workers",
success(res) {
console.log("load worker success", res)
var worker = wx.createWorker("workers/request/index.js") // 创建 worker。 如果 worker 分包没下载完就调 createWorker 的话将报错
},
fail(res) {
console.log("load worker fail", res)
}
})
task.onProgressUpdate(res => {
console.log(res.progress) // 可通过 onProgressUpdate 接口监听下载进度
console.log(res.totalBytesWritten)
console.log(res.totalBytesExpectedToWrite)
})