GoogleChromeLabs / worker-plugin

👩‍🏭 Adds native Web Worker bundling support to Webpack.
https://npm.im/worker-plugin
Apache License 2.0
1.92k stars 79 forks source link

Subworkers loaded from incorrect URL? #31

Open jamiewinder opened 5 years ago

jamiewinder commented 5 years ago

I have worker that is loaded from the main code:

const worker = new Worker('./MainWorker.js', {
    name: 'main',
    type: 'module'
});

And within this worker, it tries to load a subworker:

const subworker = new Worker('./Subworker.js', {
    name: 'sub',
    type: 'module'
});

When webpack bundles this, the browser correctly and successfully loads the main worker from 'dist/main.worker.js', however it then tries to load the subworker from 'dist/dist/sub.worker.js' which isn't where the worker bundle was built to.

I'm not sure if this is a config problem on my side or an issue with the plugin. Here are the relevant parts of my webpack config:

{
    entry: ['./src/index.js'],
    output: {
        path: path.join(__dirname, 'dist'),
        filename: '[name].js',
        publicPath: 'dist/'
    },
    plugins: [
        new WorkerPlugin({
            filename: '[name].worker.js'
        })
    ]
}
developit commented 5 years ago

Hi there! You need to set your output.publicPath to an absolute URL:

{
    entry: ['./src/index.js'],
    output: {
        path: path.join(__dirname, 'dist'),
        filename: '[name].js',
-        publicPath: 'dist/'
+        publicPath: '/dist/'
    },
    plugins: [
        new WorkerPlugin({
            filename: '[name].worker.js'
        })
    ]
}

It might be possible to address this in worker-plugin, but I'm not sure.

jamiewinder commented 5 years ago

Thanks. I had tried that (successfully) but I want the URLs to be relative to my page rather than the root. I can't assume which URL the app will be loaded from.

developit commented 5 years ago

@jamiewinder I'm not sure if it will work in the worker context, but you could set the public path dynamically at runtime (more info here):

__webpack_public_path__ = location.pathname + '/dist';