0%
Theme NexT works best with JavaScript enabled
WebWorker 阮一峰 Web Worker 使用教程
Web Worker的由来:
默认浏览器中运行的 JavaScript 是单线程,Web Worker 的作用就是为 JS 创建多线程环境,允许主线程创建 Web Worker 线程,并负责计算密集型或高延迟的任务。Web Worker 线程负责计算密集型或高延迟的任务
主线程只需要负责 UI 交互,这样页面更加流畅
Web Worker 注意事项:
同源限制:Web Worker 只能接受同源下的 JS 分配的任务
DOM限制:Web Worker 无法读取和操作 DOM 对象,无法使用 document、window、parent 这些对象,但可以使用 navigator 和 location。
无法使用 window对象也意味着无法使用 window.setInterval()、无法操作 CSS、SVG、Canvas 等
通信限制:Web Worker 只能通过消息与主线程 JS 通信。
脚本限制:Web Worker 不能执行 alert()、confirm(),但可以使用 XMLHttpRequest对象发出 AJAX 请求。
文件限制:Web Worker 不能读取本地文件,即不能打开本地文件系统(file://),所加载的脚本必须来自网络。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 const self : Worker = globalThis as any ;const workerCode = ( ) => { self.onmessage = function (e ) { const data = e.data console .log ("线程收到消息" +data) } setTimeout (() => { self.postMessage ("Worker Thread: Hi" ); }, 2000 ); }; let code = workerCode.toString ();code = code.substring (code.indexOf ("{" ) + 1 , code.lastIndexOf ("}" )); const blob = new Blob ([code], { type : "application/javascript" });const worker_script = URL .createObjectURL (blob);console .log (worker_script);export default worker_script;
主线程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import IntensiveTask from './worker/intensiveTask' ; useEffect (() => { const myWorker = new Worker (IntensiveTask ); myWorker.onmessage = (message: any ) => { console .log ("主线程收到消息" + message.data ); myWorker.terminate () }; myWorker.postMessage ('Main Thread: Hello' ); }, [])