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

Die Zeiten ändern sich.

Dieser Beitrag scheint älter als 5 Jahre zu sein – eine lange Zeit im Internet. Der Inhalt ist vielleicht veraltet ...

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. 🙂

Update September 2020: Mit WordPress 5.5 wurde jQuery Migrate nicht mehr standardmäßig aktiviert. Falls Plugins/Themes noch veraltete Skripte einsetzen, kann es nun zu Problemen kommen. Bis die Probleme gefixt sind, kann übergangsweise mit dem Enable jQuery Migrate Helper das Tool wieder aktiviert werden.
Wer mehr über den geplanten Update-Pfad von jQuery in WordPress wissen möchte, der sollte den Make-Blogeintrag lesen und als Entwickler:in seinen Code mit Test jQuery Updates testen.

5 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.

  2. Also bei mir funktioniert das nicht. Habe jetzt alle Wege ausprobiert. Jquery bleibt drin.

    • Es geht in dem Artikel darum, jQuery-Migrate zu eliminieren, nicht jQuery. Sobald eine Komponente jQuery als Dependenz angibt, wird auch jQuery geladen. Wenn du also jQuery vermeiden möchtest, müsstest du schauen, welche Skripte jQuery als Dependenz angeben.

Schreibe einen Kommentar

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