Automatically move a module into a Web Worker (Webpack loader)
npm install @imedadel/workerize-loader
Worker
sh
npm install -D workerize-loader
`
$3
worker.js:
`js
// block for time ms, then return the number of loops we could run in that time:
export function expensive(time) {
let start = Date.now(),
count = 0
while (Date.now() - start < time) count++
return count
}
`
index.js: _(our demo)_
`js
import worker from 'workerize-loader!./worker'
let instance = worker() // new is optional
instance.expensive(1000).then( count => {
console.log(Ran ${count} loops)
})
`
$3
#### inline
Type: Boolean
Default: false
You can also inline the worker as a BLOB with the inline parameter
`js
// webpack.config.js
{
loader: 'workerize-loader',
options: { inline: true }
}
`
or
`js
import worker from 'workerize-loader?inline!./worker'
`
$3
If you're using Babel in your build, make sure you disabled commonJS transform. Otherwize, workerize-loader won't be able to retrieve the list of exported function from your worker script :
`js
{
test: /\.js$/,
loader: "babel-loader",
options: {
presets: [
[
"env",
{
modules: false,
},
],
]
}
}
`
$3
To test a module that is normally imported via workerize-loader when not using Webpack, import the module directly in your test:
`diff
-const worker = require('workerize-loader!./worker.js');
+const worker = () => require('./worker.js');
const instance = worker();
`
To test modules that rely on workerized imports when not using Webpack, you'll need to dig into your test runner a bit. For Jest, it's possible to define a custom transform that emulates workerize-loader on the main thread:
`js
// in your Jest configuration
{
"transform": {
"workerize-loader(\\?.)?!(.)": "/workerize-jest.js"
}
}
`
... then add the workerize-jest.js shim to your project:
`js
module.exports = {
process(src, filename, config, options) {
return 'module.exports = () => require(' + JSON.stringify(filename.replace(/.+!/,'')) + ')';
},
};
`
Now your tests and any modules they import can use workerize-loader!` prefixes.