Web Worker Offloading

plugin banner

Offload JavaScript execution to a Web Worker.

Author:WordPress Performance Team (profile at wordpress.org)
WordPress version required:6.6
WordPress version tested:6.7.1
Plugin version:0.2.0
Added to WordPress repository:03-10-2024
Last updated:18-12-2024
Rating, %:40
Rated by:1
Plugin URI:https://github.com/WordPress/performance/issu...
Total downloads:17 169
Active installs:8 000+
plugin download
Click to start download

This plugin offloads JavaScript execution to a Web Worker, improving performance by freeing up the main thread. This should translate into improved Interaction to Next Paint (INP) scores.

This functionality is experimental.

In order to opt in a script to be loaded in a worker, simply add worker script data to a registered script. For example,
if you have a script registered with the handle of foo, opt-in to offload it to a web worker by doing:

wp_script_add_data( 'foo', 'worker', true );

Unlike with the script loading strategies (async/defer), any inline before/after scripts associated with the worker-offloaded registered script will also be offloaded to the worker, whereas with the script strategies an inline after script would block the script from being delayed.

Otherwise, the plugin currently ships with built-in integrations to offload Google Analytics to a web worker for the following plugin:

Please monitor your analytics once activating to ensure all the expected events are being logged. At the same time, monitor your INP scores to check for improvement.

This plugin relies on the Partytown ???? library by Builder.io, released under the MIT license. This library is in beta and there are quite a few open bugs.

The Partytown configuration can be modified via the plwwo_configuration filter. For example:

<?php
add_filter( 'plwwo_configuration', function ( $config ) {
    $config['mainWindowAccessors'][] = 'wp'; // Make the wp global available in the worker (e.g. wp.i18n and wp.hooks).
    return $config;
} );

However, not all of the configuration options can be serialized to JSON in this way, for example the resolveUrl configuration is a function. To specify this, you can add an inline script as follows.

<?php
add_action(
    'wp_enqueue_scripts',
    function () {
        wp_add_inline_script(
            'web-worker-offloading',
            <<<JS
            window.partytown = {
                ...(window.partytown || {}),
                resolveUrl: (url, location, type) => {
                    if (type === 'script') {
                        const proxyUrl = new URL('https://my-reverse-proxy.example.com/');
                        proxyUrl.searchParams.append('url', url.href);
                        return proxyUrl;
                    }
                    return url;
                },
            };
            JS,
            'before'
        );
    }
);

There are also many configuration options which are not documented, so refer to the TypeScript definitions.


FAQ
ChangeLog