Cant create SharedWorker with worker-loader

1.4k Views Asked by At

Trying to create SharedWorker with worker-loader It doesnt create it, just Worker is created. Seems like it ignores options.

Usage in parent code

import SharedWorker from "worker-loader!./workers/get-nth-fibonacci-number.shared-worker.js";

import "./styles/style.scss";

const btn = document.getElementById("calc-btn");
const input = document.getElementById("nth-input");
const result = document.getElementById("result-el");

const worker = new SharedWorker();

console.log("worker", worker);

worker.port.addEventListener("message", (e) => {
  result.innerHTML = e.data;
});
worker.port.addEventListener("error", (e) => {
  result.innerHTML = `message: ${e.message}; filename: ${e.filename}; line: ${e.lineno}`;
  console.error(e);
});

//...

worker code

import { getNthFobonacciNumber } from "../helpers/get-nth-fibonacci-number.js";

console.log("hello from worker");

self.addEventListener("connect", function (e) {
  const port = e.ports[0];
  console.log("port", port);
  port.addEventListener("message", function (e) {
    const num = e.data;
    if (Number.isInteger(parseInt(num))) {
      const result = getNthFobonacciNumber(num);
      port.postMessage({ result, port });
    } else {
      throw new Error("Is not a number");
    }
  });
  port.start();
});

webpack rule

      {
        test: /\.shared-worker\.(c|m)?js$/i,
        loader: "worker-loader",
        options: {
          worker: "SharedWorker",
        },
      },

But in console it is shown as Worker class. What is wrong with it?

enter image description here

dependencies

    "@babel/core": "^7.7.7",
    "@babel/plugin-syntax-dynamic-import": "^7.2.0",
    "@babel/preset-env": "^7.7.7",
    "babel-loader": "^8.0.6",
    "brotli-webpack-plugin": "^1.1.0",
    "clean-webpack-plugin": "^3.0.0",
    "compression-webpack-plugin": "^3.0.1",
    "css-loader": "^3.4.1",
    "cssnano": "^4.1.0",
    "file-loader": "^5.0.2",
    "html-loader": "^0.5.5",
    "html-webpack-plugin": "^3.2.0",
    "mini-css-extract-plugin": "^0.9.0",
    "node-sass": "^4.13.0",
    "optimize-css-assets-webpack-plugin": "^5.0.3",
    "postcss-loader": "^3.0.0",
    "postcss-preset-env": "^6.7.0",
    "purgecss-webpack-plugin": "^1.6.0",
    "sass-loader": "^8.0.0",
    "style-loader": "^1.1.2",
    "terser-webpack-plugin": "^2.3.1",
    "webpack": "^4.41.5",
    "webpack-cli": "^3.3.10",
    "webpack-dev-server": "^3.10.1",
    "worker-loader": "^3.0.5"

This thing asks me to add some more details: "It looks like your post is mostly code; please add some more details." This is just a stub text. I'm sorry.

3

There are 3 best solutions below

0
vadimkorr On

Solved by using alternative plugin https://github.com/GoogleChromeLabs/worker-plugin

0
Ramon Sanchez On

with worker-loader you can, create the file with the extension .sharedworker.js and in webpack rules you do this

{
test: /\.sharedworker\.js$/,
use: [
  {
    loader: 'worker-loader',
    options: {
      filename: '[name].[hash:8].js',
      inline: 'fallback',
      worker: {
        type: 'SharedWorker',
        options: {
          credentials: 'omit',
          name: 'mySharedWorker' // for debbuging
        }
      }
    }
  },
  {
    loader: 'babel-loader',
    options: {
      presets: ['@babel/preset-env']
    }
  }
]

}

0
Bdlhy On

you can delete worker-loader! in your import code.

worker-loader! will change options to {}

just use webpack config only.

I have same question, and sovled it