• 对webwork的理解与使用


    什么是web work

    js采用的是单线程模型,所有任务只能在一个线程上完成,一次只能做一件事。前面的任务没做完,后面的任务只能等着。随着电脑计算能力的增强,尤其是多核 CPU 的出现,单线程带来很大的不便,无法充分发挥计算机的计算能力

    相对的webwork就是为js创造多线程的环境,允许主线程创建webwork线程,将未处理的一些任务分给后者 运行.在js主线程运行的同时,work线程在后台运行,两者互不打扰,等到webwork线程的任务结束后,把结果返回给主线程

    web work的注意点

    (1) 同源限制:分配给 Worker 线程运行的脚本文件,必须与主线程的脚本文件同源。
    (2) DOM限制:Worker 线程所在的全局对象,与主线程不一样,无法读取主线程所在网页的 DOM 对象,也无法使用document、window、parent这些对象。但是,Worker 线程可以navigator对象和location对象。
    (3) 通信联系:Worker 线程和主线程不在同一个上下文环境,它们不能直接通信,必须通过消息完成
    (4) 脚本限制:Worker 线程不能执行alert()方法和confirm()方法,但可以使用 XMLHttpRequest 对象发出 AJAX 请求。

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

    在Vue中使用 web work

    1.安装worker-loadernpm install worker-loader

    2.编写worker.js文件

    1. onmessage = function (e) {
    2. // onmessage获取传入的初始值
    3. let sum = e.data;
    4. for (let i = 0; i < 200000; i++) {
    5. for (let i = 0; i < 10000; i++) {
    6. sum += Math.random()
    7. }
    8. }
    9. // 将计算的结果传递出去
    10. postMessage(sum);
    11. }
    '
    运行

    3.通过行内loader引入worker.js  import Worker from 'worker-loader!./worker'

    4.完整代码