美文网首页
web worker 与 service worker

web worker 与 service worker

作者: 李霖弢 | 来源:发表于2020-12-28 17:15 被阅读0次

    https://zhuanlan.zhihu.com/p/115243059

    Web Worker

    Worker 和 主线程互不干扰,通常用于替主线程分担计算密集型任务,防止主线程中JS执行时阻塞UI。
    Worker本身也会耗费资源,因此一旦使用完毕,就应该分别使用terminateclose方法关闭。

    • worker线程无法读取本地文件,因此其脚本文件也必须为网络资源,且必须与主线程脚本文件同源
    • worker无法读取/操作dom对象,没有alert()confirm()方法,也无法获取documentwindowparent,但是可以获取navigatorlocation

    基本用法

    主线程
    • 主线程和web worker通过message事件传递信息(信息在event.data里)
    • 通过onerror可以监听子线程中的报错,通过onmessageerror可以监听通讯内容无法序列化成字符串
    //webworker.html
    var worker = new Worker('worker.js', { name : 'myWorker' });
    worker.onerror = function (e) {
      console.log('ERROR: Line ', e.lineno, ' in ', e.filename, ': ', e.message);
    };
    worker.postMessage({ a: 18 });
    
    worker.onmessage = function (event) {
      console.log("event", event);
      console.log('Received message ' + (event.data.a + event.data.b));
    }
    
    //   worker.terminate();
    
    • 通信是深拷贝关系,即是传值而不是传址,不会互相影响。当拷贝二进制内容(FileBlobArrayBuffer等)时可使用Transferable Objects方式将数据转移而非拷贝,以节省内存
    worker.postMessage(arrayBuffer, [arrayBuffer]);
    
    // 例子
    var ab = new ArrayBuffer(1);
    worker.postMessage(ab, [ab]);
    
    子线程
    • 子线程中this指向全局对象self(类似主线程中的windows)
    • 子线程可以通过importScripts加载其他JS
    • 通过onmessageerror可以监听通讯内容无法序列化成字符串
    // worker.js
    console.log("worker ready", this === self);
    console.log(name);//myWorker
    addEventListener(
      "message",
      function (e) {
        postMessage(Object.assign(e.data, { b: 20 }));
      },
      false
    );
    
    importScripts("other.js");
    // self.close();
    

    service worker

    基于web worker,充当服务器与浏览器之间的代理服务器(可以拦截请求,并作出开发者指定的动作),拥有离线缓存能力

    相关文章

      网友评论

          本文标题:web worker 与 service worker

          本文链接:https://www.haomeiwen.com/subject/mbomxktx.html