第18章 Web Workers
18.1 Web Workers概要
18.1.1 Web Workers 的定义
从内部来看,客户端 JavaScript 与 UI 的渲染处理用的是同一个进程,而且是以单线程的方式执行的。因此,如果在客户端 JavaScript 中执行高负载的处理,就可能会发生 UI 渲染处理被阻断这一致命问题。
Web Workers 是一种能够在另外的线程中创建新的 JavaScript 运行环境,以使 JavaScript 代码能够在后台处理的一种机制。如果能够视情况恰当地分离出复杂的处理,并将其置于后台运行,就能够在通过客户端进行复杂处理的同时,不妨碍用户的 UI 操作,从而开发出高可用性的 Web 应用程序。
18.1.2 Web Workers 的执行方式
通常的客户端 JavaScript 运行环境称作主线程,而将通过 Web Workers 创建的后台 JavaScript 运行环境称为工作线程(Worker)。可以在主线程中创建工作线程,且能够同时创建多个工作线程。
主线程与工作线程的 JavaScript 运行环境是相互分离的,无法相互引用对方环境中的变量。也就是说,在各自的环境中分别准备了其全局对象,且这些全局对象无法被相互引用。可以通过 window 这一名称来引用主线程的全局对象,并通过 self 这一名称来引用工作线程的全局对象。
还有一个重要的问题是,从工作线程的环境中是无法引用 document 对象的。也就是说,所有的 UI 操作,即 DOM 的引用与更改,都只能在主线程中进行。无法在工作线程中对 UI 进行任何操作。如果要进行数据的收发处理,则必须通过消息收发接口(postMessage 方法、message 事件)来进行。
这些都是为了简化多线程程序设计而添加的限制。在语言规范层面上保证了 UI 操作始终都只能在主线程中执行的话,就能够将一些在多线程程序设计中多发的错误防范于未然。