vue-worker把复杂的web worker封装起来,提供一套非常简明的api接口,使用的时候可以说像不接触worker一样方便。那么具体怎么使用呢?

安装

npm i -S vue-worker

注册

import Vue from 'vue'import VueWorker from 'vue-worker'import App from 'App.vue'
Vue.use(VueWorker)
new Vue({
el: '#app',
render: h => h(App) })
注册之后,你可以像this.$store一样使用this.$worker

使用

export default {
name: 'worker-test', data() {
return {
worker: null,
}
},
mounted() {
// 通过this.$worker.run这个方法,跑起一个worker,
// worker是在另外的线程里面跑的,所以可以在run的第一个参数函数里面执行一个非常大计算的操作
// run方法像Promise一样提供.then和.catch,then的参数就是run第一个参数函数的返回值
this.worker = this.$worker.run(n => n + 10, [2])
.then(res => console.log(res))
.catch(e => console.log(e)) }, destroyed() {
// 通过赋值null的方式,释放掉worker引用,这样就可以关闭worker,这是作者在github上说的
this.worker = null
},
}

API介绍

下面来详细介绍一下vue-worker的几个api,也就是方法method。

.run(fun, [...args])

上面已经看到了这个方法,而且也有注释说明。注意第二个参数是一个数组,数组的个数和第一个参数fun的形参个数是一样的。
你可能会有一个疑问:直接在fun函数体内使用当前变量不就好了么?js本身的全局变量特性在这里不能用?这是因为worker是在另外一个线程中运行,跟当前页面内的js脚本不是在同一个线程,不共享内存空间,所以直接在fun函数体里面使用另外一个线程的变量是找不到的,所以要通过函数参数的形式进行传递。而传递的实质,是使用了worker的postMessage方法,把第二个参数当做postMessage的内容,具体你可以阅读这里的源码。

run是一次性的,跑完这次,worker线程就会被关掉。想要持久化worker,可以使用下面的create来创建。

.create([...actions])

这个方法让你创建一个worker对象(注意不是worker实例,你无法通过该对象直接操作worker,这个实例仅仅是一个js object,提供了几个属性接口)。

actions是一个数组,数组的每个元素是一个含有两个属性的对象:

export default {
name: 'worker-test',
data() {
return {
worker: null,
}
},
created() {
this.worker = this.$worker.create([
{
message: 'pull-data',
func(data) {
data.forEach(...)
return data
},
},
{
message: 'run-task',
func(id) {
//...
},
}
])
},
mounted() {
let data = ...
this.worker.postMessage('pull-data', [data])
.then(res => console.log(res))
},
destroyed() {
this.worker = null
},
}

实际上.run方法是create方法和postMessage方法的合体,一次性把两个方法的事都做了。

.postMessage(messageid, [...args])

这个在上面的代码里面已经演示了。它不是this.$worker的方法,而是通过this.$worker.create之后得到的object的一个方法。使用这个方法跟worker原生的方法很像,当然,这里的messageid就是上面actions数组里面的某个对象的message字段对应的那个。而args就是你要传递的数据。

你可能又会问了,这里的[..args]是一个参数,还是说里面的元素才是参数。其实很简单,[...args]被用作了.apply的第二个参数:func.apply(null, [...args]),所以,...args对应的就是func的参数。

.postAll([...args])

这里的postAll和上面的postMessage一样,是create之后的那个object的一个方法,而不是this.$worker的,所以使用的时候,也只能用在create之后。

它的参数是一个数组,但是这个数组的元素有三种形式,一种是不传,一种是string:messageid,另一种是{message, [...func_args]}。其实都很好理解。

不传

代表所有的actions都执行一次postMessage。

[string:messageid]

代表对应的messageid的那个action被执行postMessage。

[{message, [...func_args]}]

给指定的messageid传参数。

export default {
name: 'worker-test',
data() {
return {
worker: null,
}
},
created() {
this.worker = this.$worker.create([
{
message: 'pull-data',
func(data) {
data.forEach(...)
return data
},
},
{
message: 'run-task',
func() {
//...
},
}
])
},
mounted() { // 1. 不传
this.worker.postAll().then([res1, res2] => {}) // 2. 字符串形式
let data = ...
this.worker.postAll(['run-task']).then([res] => {}) // 仅'run-task'被postMessage // 3. 对象形式(混合形式)
this.worker.postAll([
'run-task',
{
message: 'pull-data',
args: [data],
},
]).then([res1, res2] => {})
},
destroyed() {
this.worker = null
},
}

比较难把握的就是,这里所有的传入都要采用数组的形式,理解上需要稍微思考下。

.register(action || [...actions])

同理,也是在<worker>的object对象上的方法。当你使用create之后,发现你的worker任务不够用,要追加一个action或多个,那么可以使用register来追加。action(s)和create是一模一样的。

.unregister(message || [...messages])

和register有点像,意思是当你某一个任务不想要了,可以通过unregister来取消这个任务。参数和register不一样,直接使用messageid作为参数即可。

export default {
name: 'worker-test',
data() {
return {
worker: null,
}
},
created() {
this.worker = this.$worker.create([
{
message: 'pull-data',
func(data) {
data.forEach(...)
return data
},
},
{
message: 'run-task',
func() {
//...
},
}
])
},
mounted() {
// 1. 不传
this.worker.postAll().then([res1, res2] => {}) // 2. 字符串形式
let data = ...
this.worker.postAll(['run-task']).then([res] => {}) // 仅'run-task'被postMessage // 3. 对象形式(混合形式)
this.worker.postAll([
'run-task',
{
message: 'pull-data',
args: [data],
},
]).then([res1, res2] => {
// 注意,这里then里面执行的是在主js线程里面执行的,所以可以直接用this.worker
this.worker.unregister('run-task')
// 当你注销掉了,那么下回你在post到run-task这个任务消息时,就啥都不会发生了
})
},
destroyed() {
this.worker = null
},
}

关闭worker

在最前面的代码里面已经提到了,插件的作者指出,你是没办法拿到worker原始实例的,所以也就无法调用worker.terminate()或者在worker线程内部执行self.close()来关闭worker。create方法创建的不是worker实例,所以它内部有,但是没有暴露出来。所以插件没有关闭worker的方法,你直接把worker对象释放掉即可。我翻阅了源码,发现它只在调用run方法时才使用close,执行完run之后worker会被close,但是如果你使用create创建的worker,是不会被close的它会一直存在,直到你关闭浏览器。

原理

web worker是通过一个浏览器提供的Worker对象来创建的,创建的时候要传入指定的javascript文件作为worker线程的执行脚本。worker线程内的脚本有一些限制,比如只能拿到window.navigator的信息,不能拿到完整的window对象。重点是,这里我们没有提供一个js文件传入worker线程,vue-worker是怎么做到的呢?它利用了Blob来创建一个可执行的二进制上下文,在通过这个上下文来调用我们传入的function,就好像在内存中虚拟了一个内容是我们传入的function的js文件一样。具体的源码可以看这里

vue-worker的介绍和使用的更多相关文章

  1. Vue全家桶介绍

    一直不清楚全家桶是什么玩意,上网搜了一下,才知道就是平时项目中使用的几个依赖包,下面分享一下 Vue 全家桶介绍 Vue有著名的全家桶系列,包含了vue-router(http://router.vu ...

  2. vue项目搭建介绍01

    目录 vue项目搭建介绍01 vue 项目框架环境搭建: 创建项目: vue 项目创建流程: vue项目搭建介绍01 vue 项目框架环境搭建: vue 项目框架: vue django(类似)(vu ...

  3. vue项目搭建介绍02

    目录 vue项目搭建介绍02 python-pycharm设置: vue创建项目分类: vue-cli构建 自定义构建 基础的vue项目目录: vue项目搭建介绍02 python-pycharm设置 ...

  4. vue第四单元(初识vue-在页面中直接引入vue框架-学习使用vue语法-vue的指令-介绍data用法-methods用法)

    第四单元(初识vue-在页面中直接引入vue框架-学习使用vue语法-vue的指令-介绍data用法-methods用法) #课程目标 了解 vue 框架的特点 掌握创建 vue 实例 掌握 data ...

  5. [Vue入门及介绍,基础使用、MVVM架构、插值表达式、文本指令、事件指令]

    [Vue入门及介绍,基础使用.MVVM架构.插值表达式.文本指令.事件指令] 1)定义:javascript渐进式框架 ​ 渐进式:可以控制一个页面的一个标签,也可以控制一系列标签,也可以控制整个页面 ...

  6. Vue 全家桶介绍

    Vue有著名的全家桶系列,包含了vue-router(http://router.vuejs.org),vuex(http://vuex.vuejs.org), vue-resource(https: ...

  7. 可能是目前最完整的前端框架 Vue.js 全面介绍

    Vue.js 是一个JavaScriptMVVM库,是一套构建用户界面的渐进式框架. 摘要 2016年最火的前端框架当属Vue.js了,很多使用过vue的程序员这样评价它,“vue.js兼具angul ...

  8. vue 目录结构介绍

    1 初始目录如下: 2 目录结构介绍 bulid:最终帆布的代码存放位置 config:配置目录,包括端口号等 node_modules:npm加载的项目依赖模块 src:z这里是我们要开发的目录,基 ...

  9. 【入门篇】前端框架Vue.js知识介绍

    一.Vue.js介绍 1.什么是MVVM? MVVM(Model-View-ViewModel)是一种软件架构设计模式,它源于MVC(Model-View-Controller)模式,它是一种思想,一 ...

  10. Vue框架的介绍及使用

    Vue框架 定义:渐进式 JavaScript 框架 渐进式:可以控制一个页面的一个标签,可以控制一系列标签,也可以控制整个页面,甚至可以控制整个前台项目. 通过对框架的了解与运用程度,来决定其在整个 ...

随机推荐

  1. 逃离迷宫 HDU1728 (bfs)

    和连连看非常相似   都是求转向的BFS 改了一下就上交了... #include<cstdio> #include<cstring> #include<algorith ...

  2. Clion 常用快捷键

    clion 快捷键 CTRL+ALT+I  自动缩进 查询快捷键CTRL+N   查找类CTRL+SHIFT+N  查找文件CTRL+SHIFT+ALT+N 查 找类中的方法或变量CIRL+B   找 ...

  3. windows server 2003 安全加固(二)

    windows server 2003 安全加固 关闭默认端口 我们知道远程桌面服务端口默认开启在3389端口,如果我们一定要用到,最好能换到另外的端口上,放到靠后的端口号上去,比如10001. 更改 ...

  4. Java并发编程快速学习

    上周的面试中,被问及了几个关于Java并发编程的问题,自己回答的都不是很系统和全面,可以说是"头皮发麻",哈哈.因此果断购入<Java并发编程的艺术>一书,学习后的体会 ...

  5. go语言学习-结构体

    结构体 go语言中的结构体,是一种复合类型,有一组属性构成,这些属性被称为字段.结构体也是值类型,可以使用new来创建. 定义: type name struct { field1 type1 fie ...

  6. 洛谷.2219.[HAOI2007]修筑绿化带(单调队列)

    题目链接 洛谷 COGS.24 对于大的矩阵可以枚举:对于小的矩阵,需要在满足条件的区域求一个矩形和的最小值 预处理S2[i][j]表示以(i,j)为右下角的C\(*\)D的矩阵和, 然后对于求矩形区 ...

  7. Python3练习题系列(04)

    题目: 制作一个游戏 知识点: 函数.if_elif_else, while, exit 游戏图谱: 游戏代码: from sys import exit def gold_room(): print ...

  8. 潭州课堂25班:Ph201805201 爬虫高级 第三课 sclapy 框架 腾讯 招聘案例 (课堂笔记)

    到指定目录下,创建个项目 进到 spiders 目录 创建执行文件,并命名 运行调试 执行代码,: # -*- coding: utf-8 -*- import scrapy from ..items ...

  9. ios真机调试错误解决:Installation of apps is prohibited by a policy on the device

    该问题的出现原因是手机中的访问权限被关闭了,打开方法如下: 设置->通用->访问限制->安装应用程序

  10. ajax请求的完整步骤

    AJAX = 异步JavaScript和XML,可以使网页实现异步更新,达到局部更新的目的. 一.AJAX请求步骤如下: 1.创建XMLHttpRequest对象 var xhr; if(window ...