Support » Plugin: Jetpack by WordPress.com » SLOW SLOW SITES — So much additional JS junk?

  • I’ve installed this and while this ‘everything but the kitchen sink’ has some handy security functionality, the amount of rubbish JS it includes in separate, cookie-riddled, highly-unoptimized includes is appalling. Is WordPress doing quality control? A website that’s otherwise fast becomes far slower with these silly includes. Even with removing filters and actions, there’s still a lot of remnant JS left behind. Any idea on how to optimise the JS?

Viewing 3 replies - 1 through 3 (of 3 total)
  • Plugin Author Jeremy Herve

    (@jeherve)

    Jetpack Mechanic 🚀

    Thanks for the feedback!

    the amount of rubbish JS it includes in separate, cookie-riddled, highly-unoptimized includes is appalling.

    Do you have any examples of such files? We’ve built Jetpack so those files are only added when necessary; whenever you deactivate a feature under Jetpack > Settings in your dashboard, we also remove all related JS files that were used with that feature. And when the feature is activated, we try to make sure the file is only enqueued when it’s needed on the page.

    I currently know of only one JS file that gets loaded even when you deactivate all Jetpack features: it’s named devicepx and is used to manage image replacements on HiDPi and Retina devices. If you’re not interested in the feature, you can dequeue the file like so:

    
    function jeherve_dequeue_devicepx() {
        wp_dequeue_script( 'devicepx' );
    }
    add_action( 'wp_enqueue_scripts', 'jeherve_dequeue_devicepx' );
    

    We also serve a lot of those files directly from our CDN, so they can be cached, and delivered quickly, via HTTP/2, from a location near you.

    That said, there is always room for improvement! If you find a file that could be improved let me know, either here or in a new thread in the support forums.

    Thanks!

    Any idea on how to optimise the JS?

    In general, I’d personally recommend a plugin like Autoptimize to concatenate and serve all local JS files once your site has been optimized to remove all unnecessary JS.

    Thank you for the response, but not quite.

    Firstly, there’s a lot of junk added to wp_head and the footer. Through helpful people in various forums online, I’ve been accumulating all the stuff we need to disable. So I put this in my functions.php file for sure. Note that all this functionality is completely disabled in my Jetback, like the JSON API, which I don’t need. Yet it publishes in my wp_head.

    
          /****** REMOVE ALL WORDPRESS JUNK *****/
           function disable_wp_oembeds_init() {
          	global $wp;
          
          	// Remove the embed query var.
          	$wp->public_query_vars = array_diff( $wp->public_query_vars, array(
          		'embed',
          	) );
          
          	// Remove the REST API endpoint.
          	remove_action( 'rest_api_init', 'wp_oembed_register_route' );
          
          	// Turn off oEmbed auto discovery.
          	add_filter( 'embed_oembed_discover', '__return_false' );
          
          	// Don't filter oEmbed results.
          	remove_filter( 'oembed_dataparse', 'wp_filter_oembed_result', 10 );
          
          	// Remove oEmbed discovery links.
          	remove_action( 'wp_head', 'wp_oembed_add_discovery_links' );
          
          	// Remove oEmbed-specific JavaScript from the front-end and back-end.
          	remove_action( 'wp_head', 'wp_oembed_add_host_js' );
          	add_filter( 'tiny_mce_plugins', 'disable_wp_oembeds_tiny_mce_plugin' );
          
          	// Remove all embeds rewrite rules.
          	add_filter( 'rewrite_rules_array', 'disable_wp_oembeds_rewrites' );
          }
          
          add_action( 'init', 'disable_wp_oembeds_init', 9999 );
          
          // Removes the 'wpembed' TinyMCE plugin.
          function disable_wp_oembeds_tiny_mce_plugin( $plugins ) {
          	return array_diff( $plugins, array( 'wpembed' ) );
          }
          
          // Remove all rewrite rules related to embeds.
          function disable_wp_oembeds_rewrites( $rules ) {
          	foreach ( $rules as $rule => $rewrite ) {
          		if ( false !== strpos( $rewrite, 'embed=true' ) ) {
          			unset( $rules[ $rule ] );
          		}
          	}
          
          	return $rules;
          }
          
          // Remove the REST API link tag in page header.
          // <link rel='https://api.w.org/' href='http://example.com/wp-json/' />
          remove_action( 'wp_head', 'rest_output_link_wp_head', 10 );
          remove_action( 'wp_head', 'wp_oembed_add_discovery_links', 10 );
          // Remove the Link header for the WP REST API
          // [link] => <http://www.example.com/wp-json/>; rel="https://api.w.org/"
          remove_action( 'template_redirect', 'rest_output_link_header', 11, 0 );
          
          // Filters for WP-API version 1.x
          add_filter('json_enabled', '__return_false');
          add_filter('json_jsonp_enabled', '__return_false');
          
          // Filters for WP-API version 2.x
          add_filter('rest_enabled', '__return_false');
          add_filter('rest_jsonp_enabled', '__return_false');
          
          function jeherve_dequeue_devicepx() {
              wp_dequeue_script( 'devicepx' );
          }
          add_action( 'wp_enqueue_scripts', 'jeherve_dequeue_devicepx' );
    

    Sadly, there are still bits and pieces left behind. This is what I am left with:

    
        <link rel='dns-prefetch' href='//v0.wordpress.com'> 
        <link rel='dns-prefetch' href='//jetpack.wordpress.com'> 
        <link rel='dns-prefetch' href='//s0.wp.com'> 
        <link rel='dns-prefetch' href='//s1.wp.com'> 
        <link rel='dns-prefetch' href='//s2.wp.com'> 
        <link rel='dns-prefetch' href='//public-api.wordpress.com'> 
        <link rel='dns-prefetch' href='//0.gravatar.com'> 
        <link rel='dns-prefetch' href='//1.gravatar.com'> 
        <link rel='dns-prefetch' href='//2.gravatar.com'> 
        <style type='text/css'>img#wpstats{display:none}</style>
    

    Note that the presence of gravatar is utterly infuriating because everything related to gravatar is disabled. Everywhere I find it. Everywhere. Why’s the DNS prefetch needed exactly?

    Hope the plugin developers will fix this rubbish. It’s not professional to force “emojis” and this nonsense down our throats.

    • This reply was modified 2 years, 4 months ago by  morespinach.
    Plugin Author Jeremy Herve

    (@jeherve)

    Jetpack Mechanic 🚀

    Thanks for the extra details.

    To clarify, everything you’ve disabled so far is added by WordPress itself. It’s not related to Jetpack at all. You could deactivate the Jetpack plugin (and all other plugins on your site), and those resources would still be added.

    Jetpack’s JSON API module isn’t related to any of the things you’ve disabled, and doesn’t add anything to your site’s header.

    Every one of those core WordPress resources was added for a reason, and as you’ve discovered, they can usually be disabled with a filter. If you’re not sure why this was added to WordPress in the first place, you can check WordPress’ core bug tracker to find out more. For example, emoji were recently discussed in this ticket:
    https://core.trac.wordpress.org/ticket/36955

    If you find that one of those things impacts performance on your site without adding any functionality, you can open a new Trac ticket and provide details about the tests you’ve run here:
    https://core.trac.wordpress.org/ticket/new

    I’m afraid I can’t be of much more help with this, since those things aren’t managed by Jetpack.

    Now let’s look at Jetpack. It also adds things to your site’s source code, when you use a feature that requires adding something to your site’s source code. The first thing was devicepx, as I mentioned in my previous post. I see you’ve already disabled it since you’re not interested in offering support for Retina and HiDPi devices; that leaves us with the few things you’ve mentioned at the end of your posts. Let’s take a closer look at it.

    There are 2 big elements on that list: DNS Prefetchs, and an inline CSS style.

    DNS Prefetching is standard practice, and is used to resolve domain names before a user tries to follow a link, or load resources from a link. This can significantly improve performance when you’re looking at a page with links to different resources. You can read more about it here:
    https://www.chromium.org/developers/design-documents/dns-prefetching

    In Jetpack, 4 different features rely on DNS prefetching:

    • Photon: our free image CDN serves images from 3 different subdomains, that are prefetched when you use that module. Since you don’t use it on your site, the subdomains aren’t prefetched and you don’t see them in your source code.
    • Likes: our Likes feature adds an iFrame to the bottom of your posts, where WordPress.com users will be able to click a Like button and their profile picture (Gravatar) will then displayed next to the Like button to show their Like. That module, when enabled, adds prefetching from Gravatar domains as well as prefetching from a CDN that is used to store the resources styling the Like button itself in the iFrame. If you don’t need that feature, you can deactivate the module and the domains won’t get prefetched.
    • Jetpack’s Comment Form: our Comment Form module replaces the default comment form by an iFrame where folks will be able to log in with different Social Media profiles (WordPress.com, Facebook, Twitter, Google+) to leave a comment on your site. The comment form itself displays your Gravatar as soon as you fill in your email address. That module adds prefetching from multiple domains: jetpack.wordpress.com is where the iFrame itself lives; static resources to style the comment form are served via our CDNs, at the s*.wp.com domains; the public-api.wordpress.com domain is used by the Jetpack API to post the comment back to your site since comments are still stored locally on your site when you use the Jetpack Comment form module; the *.gravatar.com domains are used to serve Gravatar images from our CDN. If you’re not interested in this functionality you can deactivate the Comments module and DNS prefetching will be disabled along with the module. Looking at the list you posted above, I believe you’re using that module on your site.
    • VideoPress: DNS prefetching for the v0.wordpress.com domain is added when you use either the VideoPress module or the Shortcode Embeds module on your site. It allows you to embed VideoPress videos in your posts and pages. If you’re not using that feature, you can deactivate the modules, or even keep all the Shortcodes except for the VideoPress one, as explained here. Looking at your list above, I believe you’re using one of these modules on your site.

    You can consequently remove DNS prefetching by removing the feature that relies on it from your site. Deactivating Jetpack features can be done by going to Jetpack > Settings in your dashboard.

    Now let’s look at that last line:

    <style type='text/css'>img#wpstats{display:none}</style>

    This CSS is used to hide Jetpack’s tracking pixel, so it’s not displayed in the footer of your site. That tracking image is used when the Stats module is active; it is there so each time the image is loaded, a visit is recorded.

    That tracking image is hidden by default, but if you were to choose to display it, that CSS wouldn’t be added to your site. To display the tracking image (in the form of a little smiley face in Jetpack), you can go to Jetpack > Settings > Engagement, and uncheck the box to hide the stats smiley face image. Save your changes, and the inline CSS code will disappear.
    Another alternative would be to uncheck that box, and then add that inline CSS to your theme’s stylesheet if you prefer that CSS not to be added inline.
    Another alternative would be to deactivate the Stats module.

    I hope this clarifies things a bit!

Viewing 3 replies - 1 through 3 (of 3 total)
  • The topic ‘SLOW SLOW SITES — So much additional JS junk?’ is closed to new replies.