Bootstrap

深入浅出-JS Worker(多线程、ShardWorker、前端性能优化)

🚀前提:什么是线程?🚀

线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

线程是独立调度和分派的基本单位。

同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符信号处理等等。但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)。

JavaScript单线程

JavaScript设计成单线程目的:为了防止多个线程同时操作DOM,带来渲染冲突问题。

但是遇见大量计算会使页面卡顿,用户体验不佳

就引出本篇的主题Web Worker

🚀Web Worker🚀

Web Worker 允许我们在 js 主线程之外开辟新的 Worker 线程。
因为是独立的线程,Worker 线程与 js 主线程能够同时运行,互不阻塞。
如果有大量运算任务时,可以把运算任务交给 Worker 线程去处理,当 Worker 线程计算完成,再把结果返回给 js 主线程。

js主线程只用专注处理业务逻辑,Worker处理大量复杂计算,从而减少了主线程阻塞
时间,提高运行效率和提升用户体验。

Web Worker用法

const worker = new Worker(path, options);
  • path js脚本的路径地址(遵守同源策略),否则会抛出SECURITY_ERR 类型错误
  • options
    • type worker 类型。该值可以是 classicmodule。 默认值 classic
    • credentials worker凭证。该值可以是 omit, same-origin,或 include。默认值 omit (不要求凭证)
    • name

主线程与Worker参数之间参数传递

index.html

const myWorker = new Worker('/worker.js');
myWorker.addEventListener('message', e => {
   
    console.log(e.data);
});
myWorker.postMessage('这里是主线程');

worker.js

// self是worker的
;