web woker 笔记

Last Updated:

2021-09-25

#javascript #webworker #js多线程 #浏览器多线程

Web Worker 使用教程

用完即毁

Worker 线程一旦新建成功,就会始终运行,不会被主线程上的活动(比如用户点击按钮、提交表单)打断。这样有利于随时响应主线程的通信。但是,这也造成了 Worker 比较耗费资源,不应该过度使用,而且一旦使用完毕,就应该关闭。

几个注意点

Web Worker 有以下几个使用注意点。 (1)同源限制 分配给 Worker 线程运行的脚本文件,必须与主线程的脚本文件同源。 (2)DOM 限制 Worker 线程所在的全局对象,与主线程不一样,无法读取主线程所在网页的 DOM 对象,也无法使用documentwindowparent这些对象。但是,Worker 线程可以navigator对象和location对象。 (3)通信联系 Worker 线程和主线程不在同一个上下文环境,它们不能直接通信,必须通过消息完成。 (4)脚本限制 Worker 线程不能执行alert()方法和confirm()方法,但可以使用 XMLHttpRequest 对象发出 AJAX 请求。 (5)文件限制 Worker 线程无法读取本地文件,即不能打开本机的文件系统(file://),它所加载的脚本,必须来自网络。

同源限制

分配给 Worker 线程运行的脚本文件,必须与主线程的脚本文件同源。

tbc1: 等待自己研究 问:同源,是同属于一个一级域名的二级域名的worker脚本文件能否被加载(譬如,主脚本在test.baidu.com上的文件,能通过worker加载test2.baidu.com上的脚本吗? 问:同源,有没有httphttps的分别(例如,主脚本在https://www.baidu.com上的文件,worker能加载http://www.baidu.com上的脚本吗?亦或者相反,主脚本在http上能通过worker加载https的脚本吗?) 问:主线程上的脚本文件,是cdn后的oss上的脚本文件(但前端项目是部署在https://www.petersonlian.com/testworkder上),譬如https://oss.test.com/1.js,那么worker能加载https://oss.test.com/2.js吗?

worker脚本只能访问navigatorlocation对象

worker脚本,无法访问主线程所在网页的DOM对象(譬如document,window,parent等)

worker不能执行alert()confirm(),但可以发ajax

可以使用 XMLHttpRequest 对象发出 AJAX 请求。

worker所加载脚本必须来自网络

Worker 线程无法读取本地文件,即不能打开本机的文件系统(file://),它所加载的脚本,必须来自网络。

基本用法