worker-loader

[![npm][npm]][npm-url] [![node][node]][node-url] [![deps][deps]][deps-url] [![tests][tests]][tests-url] [![chat][chat]][chat-url] [![size][size]][size-url]

将脚本注册为 Web Worker 的 webpack loader

要求

此模块需要 Node v6.9.0+ 和 webpack v4.0.0+。

起步

你需要预先安装 worker-loader

  1. $ npm install worker-loader --save-dev

内联

  1. // App.js
  2. import Worker from 'worker-loader!./Worker.js';

配置

  1. // webpack.config.js
  2. {
  3. module: {
  4. rules: [
  5. {
  6. test: /\.worker\.js$/,
  7. use: { loader: 'worker-loader' }
  8. }
  9. ]
  10. }
  11. }
  1. // App.js
  2. import Worker from './file.worker.js';
  3. const worker = new Worker();
  4. worker.postMessage({ a: 1 });
  5. worker.onmessage = function (event) {};
  6. worker.addEventListener("message", function (event) {});

然后,通过你偏爱的方式去运行 webpack

选项

fallback

类型:Boolean 默认值:false

是否需要支持非 worker 环境的回退

  1. // webpack.config.js
  2. {
  3. loader: 'worker-loader'
  4. options: { fallback: false }
  5. }

inline

类型:Boolean 默认值:false

你也可以使用 inline 参数,将 worker 内联为一个 BLOB

  1. // webpack.config.js
  2. {
  3. loader: 'worker-loader',
  4. options: { inline: true }
  5. }

注意:内联模式还会为不支持内联 worker 的浏览器创建 chunk, 要禁用此行为,只需将fallback 参数设置为 false

  1. // webpack.config.js
  2. {
  3. loader: 'worker-loader'
  4. options: { inline: true, fallback: false }
  5. }

name

类型:String 默认值:[hash].worker.js

使用 name 参数,为每个输出的脚本,设置一个自定义名称。 名称可能含有 [hash] 字符串,会被替换为依赖内容哈希值(content dependent hash),用于缓存目的。 只使用 name 时,可以省略 [hash]

  1. // webpack.config.js
  2. {
  3. loader: 'worker-loader',
  4. options: { name: 'WorkerName.[hash].js' }
  5. }

publicPath

类型:String 默认值:null

重写 worker 脚本的下载路径。如果未指定, 则使用与其他 webpack 资源相同的公共路径(public path)。

  1. // webpack.config.js
  2. {
  3. loader: 'worker-loader'
  4. options: { publicPath: '/scripts/workers/' }
  5. }

示例

worker 文件可以像其他脚本文件导入依赖那样,来导入依赖:

  1. // Worker.js
  2. const _ = require('lodash')
  3. const obj = { foo: 'foo' }
  4. _.has(obj, 'foo')
  5. // 发送数据到父线程
  6. self.postMessage({ foo: 'foo' })
  7. // 响应父线程的消息
  8. self.addEventListener('message', (event) => console.log(event))

集成 ES2015 模块

注意:如果配置好 babel-loader , 你甚至可以使用 ES2015 模块。

  1. // Worker.js
  2. import _ from 'lodash'
  3. const obj = { foo: 'foo' }
  4. _.has(obj, 'foo')
  5. // 发送数据到父线程
  6. self.postMessage({ foo: 'foo' })
  7. // 响应父线程的消息
  8. self.addEventListener('message', (event) => console.log(event))

集成 TypeScript

集成 TypeScript,在导出 worker 时,你需要声明一个自定义模块

  1. // typings/custom.d.ts
  2. declare module "worker-loader!*" {
  3. class WebpackWorker extends Worker {
  4. constructor();
  5. }
  6. export default WebpackWorker;
  7. }
  1. // Worker.ts
  2. const ctx: Worker = self as any;
  3. // 发送数据到父线程
  4. ctx.postMessage({ foo: "foo" });
  5. // 响应父线程的消息
  6. ctx.addEventListener("message", (event) => console.log(event));
  1. // App.ts
  2. import Worker from "worker-loader!./Worker";
  3. const worker = new Worker();
  4. worker.postMessage({ a: 1 });
  5. worker.onmessage = (event) => {};
  6. worker.addEventListener("message", (event) => {});

跨域策略

WebWorkers 受到 同源策略 的限制, 如果 webpack 资源的访问服务,和应用程序不是同源, 就会在浏览器中拦截其下载。 如果在 CDN 域下托管资源, 通常就会出现这种情况。 甚至从 webpack-dev-server 下载时都会被拦截。有两种解决方法:

第一种,通过配置 inline 参数,将 worker 作为 blob 内联, 而不是将其作为外部脚本下载

  1. // App.js
  2. import Worker from './file.worker.js';
  1. // webpack.config.js
  2. {
  3. loader: 'worker-loader'
  4. options: { inline: true }
  5. }

第二种,通过配置 publicPath 选项, 重写 worker 脚本的基础下载 URL

  1. // App.js
  2. // 会从 `/workers/file.worker.js` 下载 worker 脚本
  3. import Worker from './file.worker.js';
  1. // webpack.config.js
  2. {
  3. loader: 'worker-loader'
  4. options: { publicPath: '/workers/' }
  5. }

贡献

如果你从未阅读过我们的贡献指南,请在上面花点时间。

贡献指南 贡献指南” class=”icon-link” href=”#贡献指南”>

License

MIT MIT” class=”icon-link” href=”#mit”>