Code Styling Project

It’s not a bug, it’s always a feature.
  • Deutsch
  • English
  • rss
  • Home
  • Blog
  • Impressum
  • Entwicklungen
  • Fehlerbehebungen
  • Anleitungen

WordPress 2.6.1 lädt zu viele script.aculo.us Komponenten

codestyling | 29. August 2008 | 22:40

Wenn man als Entwickler eines Plugins mal den Wunsch hat, mit Effekten rum zuspielen, dann stößt man schnell auf das Problem, das eine Unmenge von Javascripts geladen und ausgeführt werden.
Dabei war ich mir ziemlich sicher, das ich nur einen Teil der Scripte aktiv angefordert habe. Doch WordPress hat entschieden, wesentlich mehr laden zu wollen, als ich angefordert hab. Also bin ich diesem Phänomen auf den Grund gegangen und hab wieder mal einen kleinen Lapsus im WordPress Code gefunden.

Eigentlich wollte ich nur mit der Effekt Bibliothek etwas ausprobieren und war mir im Klaren darüber, dass ich das Laden der Komponente durch folgende Anweisung erreichen kann:

wp_enqueue_script('scriptaculous-effects');

Diese Anweisung im Plugin oder Theme führt dazu, das WordPress die Abhängigkeiten auflöst und evtl. als Basis benötigte Scripte mit ausliefert in der richtigen Reihenfolge. Die Beschreibung im Codex besagt das ja auch. Also erwartete ich beim Laden der Seite folgende Scripte in dieser Reihenfolge:

  1. /wp-includes/js/prototype.js?ver=1.6
  2. /wp-includes/js/scriptaculous/scriptaculous.js?ver=1.8.0
  3. /wp-includes/js/scriptaculous/effects.js

Soviel zur Theorie, die Praxis sieht wieder mal anders aus. Das Ergebnis hat mich gleichermaßen überrascht wie erschreckt:

  1. /wp-includes/js/prototype.js?ver=1.6
  2. /wp-includes/js/scriptaculous/scriptaculous.js?ver=1.8.0
  3. /wp-includes/js/scriptaculous/builder.js
  4. /wp-includes/js/scriptaculous/effects.js
  5. /wp-includes/js/scriptaculous/dragdrop.js
  6. /wp-includes/js/scriptaculous/controls.js
  7. /wp-includes/js/scriptaculous/slider.js
  8. /wp-includes/js/scriptaculous/sound.js
  9. /wp-includes/js/scriptaculous/effects.js?ver=1.8.0

Richtig beobachtet, effects.js wurde 2x geladen und 5 Scripte gleich mit, die ich nicht wollte und die man bei der Benutzung der Effekte auch nicht braucht. Also was ist hier los ?

Auf der Suche nach dem “Ort des Grauens” im WordPress Core Code bin ich schließlich auf die Datei script-loader.php gestoßen, in der die ganzen Abhängigkeiten definiert werden. Hier findet man auszugsweise das hier:

	$scripts->add( 'scriptaculous-root', '/wp-includes/js/scriptaculous/scriptaculous.js', array('prototype'), '1.8.0');
	$scripts->add( 'scriptaculous-builder', '/wp-includes/js/scriptaculous/builder.js', array('scriptaculous-root'), '1.8.0');
	$scripts->add( 'scriptaculous-dragdrop', '/wp-includes/js/scriptaculous/dragdrop.js', array('scriptaculous-builder', 'scriptaculous-effects'), '1.8.0');
	$scripts->add( 'scriptaculous-effects', '/wp-includes/js/scriptaculous/effects.js', array('scriptaculous-root'), '1.8.0');
	$scripts->add( 'scriptaculous-slider', '/wp-includes/js/scriptaculous/slider.js', array('scriptaculous-effects'), '1.8.0');
	$scripts->add( 'scriptaculous-sound', '/wp-includes/js/scriptaculous/sound.js', array( 'scriptaculous-root' ), '1.8.0' );
	$scripts->add( 'scriptaculous-controls', '/wp-includes/js/scriptaculous/controls.js', array('scriptaculous-root'), '1.8.0');
	$scripts->add( 'scriptaculous', '', array('scriptaculous-dragdrop', 'scriptaculous-slider', 'scriptaculous-controls'), '1.8.0');

Soweit sieht das alles korrekt aus, auch die Abhängigkeiten stimmen. Das falsche Ladeverhalten kann eigentlich nicht hier begründet sein. Also mal die Basisdatei scriptaculous.js selbst mal anschauen…

Und jetzt kommt Licht in die Sache, denn es gibt in dem Ordner 2 solche Dateien:

  • scriptaculous.js
  • wp-scriptaculous.js

Beide Dateien unterscheiden sich nur an einer Stelle, die aber essentiell ist: dem automatischen Nachladen von Komponenten! Während die Originaldatei scriptaculous.js ohne Angabe eines weiteren Parameters immer alle Komponenten lädt, macht die Datei wp-scriptaculous.js das nicht sondern lädt nur dann Komponenten aktiv selbst, wenn sie explizit angegeben wurden. Nun hab ich mich also auf die Suche durch mehrere WordPress Versionen gemacht, ob das schon mal mit der modifizierten Datei gemacht wurde und hab es in WP2.1 gefunden und auch Einträge dazu im WP Bug Trac.

Es ist tatsächlich so geplant, dass für WordPress die modifizierte Datei genommen werden soll, damit das mit der Auflösung der Anhängigkeiten von WP erledigt werden kann und nie zuviel Dateien geladen werden müssen. Das haben die Programmierer aber wieder mal irgendwann ignoriert oder versehentlich ausgebaut.

Abhilfe schafft die Modifikation (rotes hinzufügen) in folgender WP 2.6.1 Datei: /wp-includes/script-loader.php

$scripts->add( 'scriptaculous-root', '/wp-includes/js/scriptaculous/wp-scriptaculous.js', array('prototype'), '1.8.0');

Nach dieser Änderung funktioniert immer noch alles wie es soll, es werden aber jetzt nur noch die Komponenten geladen, die man wirklich angefordert hat oder die, von denen es tatsächlich auch abhängt.

Diese Änderung wirkt sich natürlich erheblich und positiv auf die Geschwindigkeit aus, mit der die Seiten nun ausgeliefert werden. Deshalb habe ich diesen Bug auch wieder für die Version WP 2.6.2 gemeldet und hoffe, das Core Team kümmert sich schleunigst darum: Ticket #7642 (new defect)

Kategorien
Deutsch, WordPress (DE)
RSS Kommentare
RSS Kommentare

« WordPress Sprachdatei Plugin - Machbarkeitsstudie WordPress Dashboard Feeds mit fehlerhaften Umlauten »

7 Antworten    Schreib einen Kommentar

Alexander

Alexander

30.08.2008 | 11:15

Super,

ich muss sagen, meine Seite lädt wirklich schneller nach der Änderung.

Danke dir,
super Arbeit.

PS.: Wie siehts mit deinem Sprachdatei Plugin aus?

Grüße aus Gera

Antworten »

codestyling

codestyling

30.08.2008 | 17:01

Nach mehreren internen Tests durch ausgesuchte Betatester wird das Plugin diese Wochenende veröffentlicht, ich arbeite schon an der Seite mit der Beschreibung und dem Download.
Im Moment muss noch ein Bug beseitigt werden, der ein Nebeneffekt des Plugins ist: der Plugin- und Theme-Editor werden irgendwie blockiert. Funktionell ist das Plugin jedoch ok und durch die Tester bestätigt.
Und ein Feature, das in der Machbarkeitsstudie nicht erwähnt wurde, ist hinzugekommen: Einbindung von Google Translate API. Also Endspurt ist angesagt …

Antworten »

LastOne

LastOne

06.09.2008 | 18:07

Da möchte ich mich doch auch gleich mal für den Tip bedanken, ich hab das mal gerade umgesetzt und subjektiv betrachtet finde ich meine Seite nun auch schneller. Wie stark das nun an der aktuellen Serverlast hängt weiß ich nicht, aber schaden tut es sicher nicht.

Grüße,
Sebastian

Antworten »

Daishi

Daishi

09.09.2008 | 11:30

Ich sitze noch an 2.6 :) (in .2 behoben?)

Übrigens, Glückpunsh für die Mitgliedschaft im WP Team!!! :D

Antworten »

codestyling

codestyling

09.09.2008 | 11:41

Vielen Dank für das Getränk :-)
Leider ist das in WP2.6.2 noch nicht behoben und wurde zu 2.7 verschoben. Deshalb bleibt das auch akuell bis dahin. Ich hoffe, das sich das bald jemand ansieht, bisher war da wenig Interesse, obwohl das in einigen getesteten Systemen einen Zeitunterschied im Seitenaufbau von bis zu 5 Sekunden ausmachen kann!

Antworten »

rosenkrieger

rosenkrieger

05.01.2009 | 18:21

Hallo, durch einen Twitter Kumpel bin ich auf diese Website aufmerksam geworden. Ich habe seit WP 2.7 extrem lange ladezeiten bei meinem blog ( http://www.rosenblut.org ).

Ich habe dann mit YSLOW ( Firefox Extension ) mal meinen blog überprüft und siehe da die Verzögerungen sind von scriptaculous!

Ich habe hier mal einen Screenshot gemacht:
http://img.skitch.com/20090105-b4p8hfix5rihs7ttcgwrb2s2ad.png

Man sieht das ich fast 12 Sekunden an diesen blöden Scripts “verschwende”

Den code wie es hier empfohlen wird habe ich schon überprüft - “leider” steht bei mir genau das drinnen was hier empfohlen wird ( wp-scriptaculous.js )

Was kann ich tun?!?

Antworten »

rosenkrieger

rosenkrieger

05.01.2009 | 18:37

Mein Problem hat sich erledigt. Es war das Plugin Lightbox v2 das diese ganzen Javascripts geladen hatte. Nachdem ich es deaktiviert habe ist der Blog um ein vielfaches schneller geworden!

Antworten »

Du kannst diese Tags verwenden : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Navigation

  • Allgemein
  • jQuery in WordPress
  • Politik
  • WordPress (DE)

Suche

Neuere Beiträge ...

  • prozentuale Angaben - was Browser meinen zu verstehen
  • WordPress Lokalisierung - Features und Weiterentwicklung
  • WordPress Kategorie-Baum Chaos in “Artikel bearbeiten”
  • WordPress 2.7 - neues Kontext Hilfesystem selber nutzen
  • WordPress Dashboard Feeds mit fehlerhaften Umlauten

Ältere Beiträge ...

  • WordPress Sprachdatei Plugin - Machbarkeitsstudie
  • WordPress 2.6 und die Text/Diff Fehler im Editor
  • WordPress Fehler durch Sprachdateien - die Ursache
  • WordPress Sprachdateien erzeugen Fehler in gettext.php
  • TinyMCE - Schreiben mit Theme basiertem Stylesheet
rss RSS Kommentare valid xhtml 1.0 design by jide powered by Wordpress get firefox