worker-loader
worker-loader
该加载器将脚本注册为Web Worker
安装
npm i -D worker-loader
用法
App.js
import Worker from 'worker-loader!./Worker.js';
Config
webpack.config.js
{
module: {
rules: [
{
test: /\.worker\.js$/,
use: { loader: 'worker-loader' }
}
]
}
}
App.js
import Worker from './file.worker.js';
const worker = new Worker(
worker.postMessage{ a: 1 }
worker.onmessage = function (event) {};
worker.addEventListener("message", function (event) {}
选项
Name | 类型 | 默认 | 描述 |
---|---|---|---|
name | {String} | hash.worker.js | 为输出脚本设置一个自定义名称 |
一致 | {Boolean} | false | 将工作人员内联为BLOB |
倒退 | {Boolean} | false | 需要非工作人员支持环境的回退 |
publicPath | {String} | null | 覆盖从中下载工作者脚本的路径 |
name
要为输出脚本设置自定义名称,请使用name
参数。该名称可能包含字符串[hash]
,为了缓存目的,该字符串将替换为依赖于内容的哈希
webpack.config.js
*
{
loader: 'worker-loader',
options: { name: 'WorkerName.[hash].js' }
}
inline
您还可以使用该inline
参数将工作人员内联为BLOB
webpack.config.js
{
loader: 'worker-loader',
options: { inline: true }
}
In️内联模式也会为浏览器创建块,而不支持内联工作者,为了禁用此行为,只需将
fallback
参数设置为false
webpack.config.js
{
loader: 'worker-loader'
options: { inline: true, fallback: false }
}
fallback
需要非工作人员支持环境的回退
webpack.config.js
{
loader: 'worker-loader'
options: { fallback: false }
}
publicPath
覆盖下载工作程序脚本的路径。如果未指定,则使用与其他 webpack 相同的公共路径
webpack.config.js
{
loader: 'worker-loader'
options: { publicPath: '/scripts/workers/' }
}
例子
worker 文件可以像任何其他文件一样导入依赖项
Worker.js
const _ = require('lodash')
const obj = { foo: 'foo' }
_.has(obj, 'foo')
// Post data to parent thread
self.postMessage{ foo: 'foo' })
// Respond to message from parent thread
self.addEventListener('message', (event) => console.log(event))
Integrating with ES2015 Modules
ℹ️如果您已
babel-loader
配置,您甚至可以使用ES2015模块。
Worker.js
import _ from 'lodash'
const obj = { foo: 'foo' }
_.has(obj, 'foo')
// Post data to parent thread
self.postMessage{ foo: 'foo' })
// Respond to message from parent thread
self.addEventListener('message', (event) => console.log(event))
Integrating with TypeScript
要与 TypeScript 集成,您需要为工作人员的导出定义一个自定义模块
typings/custom.d.ts
declare module "worker-loader!*" {
class WebpackWorker extends Worker {
constructor(
}
export = WebpackWorker;
}
Worker.ts
const ctx: Worker = self as any;
// Post data to parent thread
ctx.postMessage{ foo: "foo" }
// Respond to message from parent thread
ctx.addEventListener("message", (event) => console.log(event)
App.ts
import Worker = require("worker-loader!./Worker"
const worker = new Worker(
worker.postMessage{ a: 1 }
worker.onmessage = (event) => {};
worker.addEventListener("message", (event) => {}
Cross-Origin Policy
WebWorkers
受到同源策略的限制,因此如果您的webpack
资产没有与您的应用程序源自同一来源,则其下载可能会被您的浏览器阻止。如果您托管 CDN 域下的资产,通常会出现这种情况。即使从这里下载webpack-dev-server
也可能被阻止。有两种解决方法
首先,您可以将工作人员内联为 blob,而不是通过inline
参数将其作为外部脚本下载
App.js
import Worker from './file.worker.js';
webpack.config.js
{
loader: 'worker-loader'
options: { inline: true }
}
其次,您可以通过publicPath
选项覆盖您的工作脚本的基本下载 URL
App.js
// This will cause the worker to be downloaded from `/workers/file.worker.js`
import Worker from './file.worker.js';
webpack.config.js
{
loader: 'worker-loader'
options: { publicPath: '/workers/' }
}