web Worker多线程与离线缓存

1. web Worker多线程

1.1 了解web worder

JS单线程的问题

  1. 一次只能做一件事。会造成阻塞
  2. 多核 CPU 中,单线程无法发挥计算机的计算能力

Web Worker 的作用,就是为 JavaScript 创造多线程环境,允许主线程创建 Worker 线程,将一些任务分配给后者运行。在主线程运行的同时,Worker 线程在后台运行,两者互不干扰。等到 Worker 线程完成计算任务,再把结果返回给主线程。

worker好处:

  1. 计算密集型或高延迟的任务被worker现成负担了,不会被阻塞或拖慢

worker的问题:

  1. Worker 线程一旦新建成功,就会始终运行, 会浪费资源,所以不用要及时关闭
1.2 主线程
1. 创建worker线程

主线程通过new命令,调用Worker()构造函数,新建一个 Worker 线程。

var worker = new Worker('work.js');

Worker()构造函数的参数是一个脚本文件,该文件就是 Worker 线程所要执行的任务。由于 Worker 不能读取本地文件,所以这个脚本必须来自网络。如果下载没有成功(比如404错误),Worker 就会默默地失败。

2. 主线程向Worker线程发布数据

主线程通过调用worker.postMessage()方法,向 Worker线程 发消息。

worker.postMessage('Hello World');

postMessage()方法的参数:

就是主线程传给 Worker 的数据。它可以是各种数据类型,包括二进制数据。

3. 主线程监听Worker线程发送的信息

主线程通过worker.onmessage指定监听函数,接收子线程发回来的消息。

worker.onmessage = function (event) {
    // 获取worker线程传递过来的数据
  console.log(event.data);
}

通过事件对象的data属性可以获取 Worker 发来的数据。

4. 关闭Worker线程

在Worker 完成任务以后,主线程就可以把它关闭

worker.terminate();
1.3 Worker 线程
1. 监听主线程发布的数据

Worker 线程通过监听message事件。来获取主线程发布的数据

self.addEventListener('message', function (e) {
  self.postMessage( e.data);
}, 

self代表子线程自身,即子线程的全局对象。

事件对象的data属性包含主线程发来的数据。

2. 向主线程发布消息

Worker线程通过self.postMessage()方法用来向主线程发送消息。

self.postMessage( e.data);
3. 关闭自身线程

Worker 线程 可以通过 close方法关闭Worker线程

self.close();
例子:

两个同步语句,不存在阻塞问题

 <body>
 <div id="box"></div>
  <div id="wrap"></div>
  <script>
    //两个同步语句,不存在阻塞问题
    box.innerHTML='111'
    wrap.innerHTML ='222'
   </script>

存在阻塞问题的语句,前面同步完成后才能渲染222

 <div id="box"></div>
  <div id="wrap"></div>
  <script>
    
    //存在阻塞问题的语句,前面同步完成后才能渲染222
    document.onclick = function () {
      let count = 0;
      for (let i = 0; i < 1000000; i++) {
        count++
      }
      box.innerHTML = count;
      wrap.innerHTML = 222
    }
   </script>

先打印主线程,再打印子线程(理解子线程)

  <div id="box"></div>
  <div id="wrap"></div>
  <script>
    //先打印主线程,再打印子线程(理解子线程)
    document.onclick = function () {
      // let count = 0;
      // for (let i = 0; i < 1000000; i++) {
      //   count++
      // }
      // 创建一个子线程
      console.log('主线程11')
      let work =new Worker('worker.js')//需要创建worker.js文件,写点内容console.log('子线程');console.log(this === self)//this 与 self都表示当前子线程对象。控制台最终结果是子线程最后打印
      console.log('主线程work',work)
      // box.innerHTML = count;
      wrap.innerHTML = 222
    }
    </script>

主线程将复杂的任务放在子线程中执行,并向子线程发送数据

// index.html(主线程中的代码)
<body>
  <div id="box"></div>
  <div id="wrap"></div>
  <script>
    document.onclick = function () {
      // 第一步创建一个子线程
      let work = new Worker('worker.js')//需要创建worker.js文件,写点内容console.log('子线程');console.log(this === self)//this 与 self都表示当前子线程对象。控制台最终结果是子线程最后打印
      //第二步 将复杂的任务放在子线程中执行,并向子线程发送数据
      work.postMessage(10000000);
      //  第三步 主线程监听事件接收子线程数据
      work.addEventListener('message', function (ev) {
        console.log('work ev', ev)
        box.innerHTML = ev.data;   //先渲染222,然后再渲染这里的值1000000。这样就不会阻塞 wrap.innerHTML = 222的执行
        this.terminate()//这里执行完了,子线程还是在工作的,所以要通过主线程关闭子线程(外部关闭子线程)。也可在子线程内部关闭self.close()
      }, false)
      wrap.innerHTML = 222
    }
  </script>
</body>
//worker.js(子线程中的代码)
//子线程接收数据,监听message事件
this.addEventListener('message', function (ev) {
    console.log(ev)//控制台中就能看到事件对象,事件对象中的data就是传过来的数据
    let count = 0;
    for (let i = 0; i < ev.data; i++) {
        count++
    }
    //   console.log(count)
    // 子线程通过this 或self把结果传给主线程
    this.postMessage(count)
    // self.close()//关闭线程
}, false)
1.4 多线程注意点
  1. 同源限制: Worker线程运行的脚本文件必须与主线程的脚本文件同源
  2. DOM限制: Worder线程中不能使用document,window,parent的对象
  3. 文件限制: Worder 线程无法读取本地文件,所加载的必须是网络文件

2. 离线存储 (offline application)

HTML5 中可以让我们构建一个离线缓存的应用, 需要创建cache manifest

什么是离线存储

离线存储是让web应用在离线的情况下继续使用, 通过manifest文件指明需要缓存的资源

2.1 离线缓存的优势
  1. 可以配置需要缓存的资源

  2. 离线浏览 - 用户可在应用离线时使用它们

  3. 速度 - 已缓存资源加载得更快, 增强用户体验

  4. 减少请求,缓解服务器负担

2.2 缓存清单

缓存清单就是一个普通的文件,其中列出浏览器应该缓存的资源,以供离线时访问. 推荐使用.appcache为后缀名

2.3 缓存使用

html标签里使用缓存清单

<--离线时也能访问到这个页面,在html标签里加上 manifest="xxxxx.appcache"就可以。将来浏览器就会请求这个文件,这个文件里说明哪些文件需要缓存,哪些文件不需要缓存-->
   
<html lang = "en" manifest="xxxxx.appcache">   
2.4 manifest(appcache) 文件格式
  1. 顶行写 CACHE MANIFEST

  2. CACHE: 指定我们需要缓存的静态资源, 入css, image, js等

  3. NETWORK: (可选) 指定需要在线访问的资源, 可以使用通配符

  4. FALLBACK: (可选) 当被缓存的文件找不到时的备用资源

2.5 其他
  1. CACHE 可以省略, 这种情况下需要缓存的资源写在CACHE MANIFESR

  2. 可以指定多个CACHE: NETWORK, FALLBACK 无顺序限制

  3. 表示注释

CACHE MANIFEST
#这是需要缓存资源CACHE:
/index.html/222.jpg/333.jpg
#表示必须在有网络的情况下使用NETWORK:
/index.css*
#如果缓存的资源找不到使用备用资源FALLBACK:
/222.jpg /333.jpg

在个互联网中能区分文件类型,因为所有的文件都有一个MIME( 多用途互联网邮件扩展类型 )

MIME参考手册https://www.w3cschool.cn/media_mimeref.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容