webpack中使用web worker
This commit is contained in:
parent
3bfac6eede
commit
32acd76e27
@ -106,5 +106,42 @@ self.onmessage = function(event) {
|
|||||||
|
|
||||||
### 可能的错误
|
### 可能的错误
|
||||||
+ 如果文档不允许启动worker,则会引发`SecurityError`
|
+ 如果文档不允许启动worker,则会引发`SecurityError`
|
||||||
+ 如果脚本之一的MIME类型为 text/csv, image/*, video/*,或 audio/*, 则会引发`NetworkError`。它应该始终是 text/javascript。
|
+ 如果脚本之一的MIME类型为 text/csv, image/\*, video/\*,或 audio/\*, 则会引发`NetworkError`。它应该始终是 text/javascript。
|
||||||
+ 如果url无法解析,则引发`SyntaxError`。
|
+ 如果url无法解析,则引发`SyntaxError`。
|
||||||
|
|
||||||
|
### 在webpack中使用
|
||||||
|
需要引入`work-loader`这个加载器
|
||||||
|
```javascript
|
||||||
|
let MyWorker = require('worker-loader!./test.js')
|
||||||
|
// 引入的这个对象可以直接当做Worker对象来用
|
||||||
|
let wk = new MyWorker()
|
||||||
|
wk.postMessage('test')
|
||||||
|
```
|
||||||
|
或者在webpack的配置文件当中添加规则
|
||||||
|
```javascript
|
||||||
|
{
|
||||||
|
module: {
|
||||||
|
rules: [
|
||||||
|
{
|
||||||
|
// 匹配 *.worker.js
|
||||||
|
test: /\.worker\.js$/,
|
||||||
|
use: {
|
||||||
|
loader: 'worker-loader',
|
||||||
|
options: {
|
||||||
|
name: '[name]:[hash:8].js',
|
||||||
|
// inline: true,
|
||||||
|
// fallback: false
|
||||||
|
// publicPath: '/scripts/workers/'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 同源策略
|
||||||
|
Web Worker严格遵守同源策略,如果webpack的静态资源与应用代码不是同源的,那么很有可能就被浏览器给墙掉了,而且这种场景也经常发生。
|
||||||
|
对于Web Worker遇到这种情况,有两种解决方案
|
||||||
|
1. 通过设置worker-loader的选项参数`inline`把worker内联成blob数据格式,而不再是通过下载脚本文件的方式来使用worker
|
||||||
|
2. 通过设置worker-loader的选项参数`publicPath`来重写掉worker脚本的下载url,当然脚本也要存放到同样的位置
|
||||||
Loading…
x
Reference in New Issue
Block a user