Benötige ich das jQuery-Migrate-Skript wirklich?

WordPress lädt standardmäßig seit Version 3.6 neben jQuery auch noch ein Skript namens jQuery Migrate. Dieses Tool sorgt für die Abwärtskompatibilität bei älterem jQuery-Code. Ausgemusterte Funktionen können so aus dem jQuery Core entfernt werden und werden nur noch per Migrate-Skript unterstützt. Wer aktuellen jQuery-Code nutzt, benötigt das Migrate-Skript daher nicht. Aber wie finde ich das heraus?

Zuerst einmal stellt sich natürlich die Frage, warum ich das Skript nicht laden möchte. Ohne das Skript werden 10 KB und ein Datei-Request gespart. Es macht die Website also schneller. Vielleicht nicht viel, aber es kann einen Teil beitragen.

Im Ursprungszustand informiert uns das jQuery-Migrate-Skript nur darüber, dass es installiert wurde:
JQMIGRATE: Migrate is installed, version 1.4.1

Damit es uns über ein existierendes Problem auch informiert, müssen wir die Entwicklerversion laden. Dazu muss in der wp-config.php folgende Zeile eingefügt werden:

define( 'SCRIPT_DEBUG', true );

Fortan wird zusätzlich auch mitgeloggt:
JQMIGRATE: Migrate is installed with logging active, version 1.4.1

Sollte ein Fehler in existierendem Code entdeckt werden, gibt es einen Log-Eintrag mit „JQMIGRATE:“ als Präfix. Zum Beispiel:
JQMIGRATE: jQuery.fn.load() is deprecated

Nun kann man den Fehler recherchieren, beheben oder das Theme/Plugin-Team darüber informieren. Ist der Fehler gefixt und gibt das Logging nichts (mehr) aus, steht einem Entfernen des Skriptes nichts mehr im Weg.

Der einfachste Weg ist das Plugin Remove jQuery Migrate. Viel macht das Plugin aber auch nicht. WordPress lädt das Skript als Dependenz in der script-loader.php:

	// jQuery
	$scripts->add( 'jquery', false, array( 'jquery-core', 'jquery-migrate' ), '1.12.4' );
	$scripts->add( 'jquery-core', '/wp-includes/js/jquery/jquery.js', array(), '1.12.4' );
	$scripts->add( 'jquery-migrate', "/wp-includes/js/jquery/jquery-migrate$suffix.js", array(), '1.4.1' );

Dieser Aufruf muss entfernt werden und durch einen Aufruf ohne diese Dependenz ersetzt werden (Quelle: Stackexchange):

<?php
/**
 * Disable jQuery Migrate in WordPress.
 *
 * @author Guy Dumais.
 * @link https://en.guydumais.digital/disable-jquery-migrate-in-wordpress/
 */
add_filter( 'wp_default_scripts', $af = static function( &$scripts) {
    if(!is_admin()) {
        $scripts->remove( 'jquery');
        $scripts->add( 'jquery', false, array( 'jquery-core' ), '1.12.4' );
    }    
}, PHP_INT_MAX );
unset( $af );

Wer noch mehr über den Code wissen möchte, dem empfehle ich dem Link im Code zu folgen.

Ein anderer Ansatz von Pascal Birchler, ebenfalls auf Stackexchange, wäre das direkte Ändern der Dependenz:

function dequeue_jquery_migrate( $scripts ) {
    if ( ! is_admin() && ! empty( $scripts->registered['jquery'] ) ) {
        $scripts->registered['jquery']->deps = array_diff(
            $scripts->registered['jquery']->deps,
            [ 'jquery-migrate' ]
        );
    }
}
add_action( 'wp_default_scripts', 'dequeue_jquery_migrate' );

Nun noch die Zeile define( 'SCRIPT_DEBUG', true ); wieder aus der wp-config.php entfernen und testen, ob alles läuft. Immer an das Löschen von Caches (Browser, Plugins, Server, …) denken. Jetzt sollte die Website einen kleinen Tick schneller sein. 🙂

3 Antworten auf Benötige ich das jQuery-Migrate-Skript wirklich?

  1. Eine weitere Alternative:

    add_action( 'wp_default_scripts', function ( $scripts ) {
    
        $scripts->remove( 'jquery-migrate' );
        $scripts->add( 'jquery-migrate', null );
    }, PHP_INT_MAX );

    Durch das Nullen von jquery-migrate ist die Abhängigkeit zwar noch vorhanden, aber es passiert einfach nichts. Vorteil dieser Lösung ist, dass so nicht nur jquery nicht mehr jQuery Migrate lädt, sondern auch kein anderes Assets, dem man jquery-migrate als Abhängigkeit mitgegeben hat. Ich bezweifle zwar, dass so etwas oft der Fall ist, aber prinzipiell wollen wir ja nicht verhindern, dass jQuery das Migrate-Skript lädt. Wir wollen, dass es gar nicht geladen wird. Egal warum. Und dazu machen wir nicht an irgendwelchen anderen Assets herum (und vergessen vielleicht hier und da eins), sondern an jQuery Migrate selbst.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.