<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Wikipedia%3ATechnik%2FSkin%2FJS%2FResourceLoader</id>
	<title>Wikipedia:Technik/Skin/JS/ResourceLoader - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Wikipedia%3ATechnik%2FSkin%2FJS%2FResourceLoader"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Wikipedia:Technik/Skin/JS/ResourceLoader&amp;action=history"/>
	<updated>2026-05-27T22:24:28Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Wikipedia:Technik/Skin/JS/ResourceLoader&amp;diff=2552907&amp;oldid=prev</id>
		<title>imported&gt;PerfektesChaos: k</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Wikipedia:Technik/Skin/JS/ResourceLoader&amp;diff=2552907&amp;oldid=prev"/>
		<updated>2026-04-13T12:20:40Z</updated>

		<summary type="html">&lt;p&gt;k&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{../../../!header&lt;br /&gt;
|Text=ResourceLoader}}&lt;br /&gt;
Der &amp;#039;&amp;#039;&amp;#039;ResourceLoader&amp;#039;&amp;#039;&amp;#039; (RL) ist ein Bestandteil von [[MediaWiki]], über den sich dynamisch [[JavaScript|JS]]- und [[Cascading Style Sheets|CSS]]-Definitionen in das [[Hypertext Markup Language|HTML]]-Dokument einer Wiki-Seite einbinden lassen.&lt;br /&gt;
&lt;br /&gt;
Die Funktionalität stand mit der Version MW 1.17 im Februar 2011 zur Verfügung und wird weiter ausgebaut.&lt;br /&gt;
&lt;br /&gt;
Ausschlaggebend für die Entwicklung waren folgende Gesichtspunkte:&lt;br /&gt;
* Die Anzahl der verfügbaren unabhängigen Skriptpakete lag 2015 über 200&amp;amp;nbsp;– künftig ist noch mit weiterer Zunahme zu rechnen. Das ist irgendwann nicht mehr ohne Hilfsmittel zu überschauen und zu pflegen.&lt;br /&gt;
* Nicht alle Funktionen werden immer, von jedem Benutzer, für jeden Seiteninhalt, für jede individuelle Konfiguration benötigt. Es ist nicht mehr möglich, wie früher einfach immer zu jeder Seite alle Skripte mitzuliefern.&lt;br /&gt;
* Die Ressourcen erwiesen sich oft als veraltet bei den Lesern und in deren Browser. Der [[Browser-Cache]] und vor allem die [[Proxy-Server]] setzen die mitgelieferten [[Browser-Cache#HTTP-Caching|Angaben zum Cache-Management]] nicht richtig um. Nunmehr wird die Aktualität dadurch sichergestellt, dass eine neue [[Uniform Resource Locator|URL]] generiert wird, wenn sich etwas am Inhalt ändert. Dadurch muss zwangsweise eine neue Version beim Server abgerufen werden.&lt;br /&gt;
* Ab Frühjahr/Mitte 2011 begann zunächst [[Google Chrome]], danach [[Mozilla Firefox|Firefox]] mit dem „asynchronen Laden“ von Ressourcen. Damit funktionieren alte Skripte nicht mehr, die davon ausgehen, dass ein Skript nach dem anderen in einer festen und bekannten Reihenfolge ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbereich ==&lt;br /&gt;
&lt;br /&gt;
=== Zentrale MediaWiki-Software ===&lt;br /&gt;
Alle {{Anker|Grundausstattung}} Standardsoftware von MediaWiki wird inzwischen mit Methoden des RL eingebunden: {{Phab|dir=resources|title=/resources/*}}&lt;br /&gt;
&lt;br /&gt;
=== {{Anker|site}} Projektweite Standardressourcen ===&lt;br /&gt;
Dies sind:&lt;br /&gt;
* [[MediaWiki:Common.js]] und die zur aktuellen Skin gehörende Seite, etwa [[MediaWiki:Vector.js]]&lt;br /&gt;
* Analog [[MediaWiki:Common.css]] und die zur aktuellen Skin gehörende Seite, etwa [[MediaWiki:Vector.css]]&lt;br /&gt;
Modulname: &amp;lt;code&amp;gt;site&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== {{Anker|gadget}} Projektweite Helferlein ===&lt;br /&gt;
Die [[Spezial:Helferlein|Helferlein]] können auch mittels RL geladen werden, dafür wird auf [[MediaWiki:Gadgets-definition]] dies mit eventuellen Abhängigkeiten angegeben; damit werden auch für jede [[#Browser-Cache|Version spezifische URL]] generiert und es wird [[#Debug|komprimiert]].&lt;br /&gt;
* Siehe dazu auch: [[mw:Extension:Gadgets]]&lt;br /&gt;
* Zukünftig soll es irgendwann mal vielleicht die Möglichkeit geben, weltweit verfügbare Module an einer zentralen Stelle vollständig vorzuhalten ([[mw:RL2|Version&amp;amp;nbsp;2]]).&lt;br /&gt;
&lt;br /&gt;
=== {{Anker|user}} Standardressourcen des momentanen Benutzers ===&lt;br /&gt;
Dies sind die [[../../Einstellungen|Einstellungen]]:&lt;br /&gt;
* [[Special:Mypage/common.js|common.js]] und die zur aktuellen Skin gehörende Seite, etwa [[Special:Mypage/vector.js|vector.js]]&lt;br /&gt;
* Analog [[Special:Mypage/common.css|common.css]] und die zur aktuellen Skin gehörende Seite, etwa [[Special:Mypage/vector.css|vector.css]]&lt;br /&gt;
Modulname: &amp;lt;code&amp;gt;user&amp;lt;/code&amp;gt; (auch bei nicht angemeldeten Benutzern „geladen“, aber leer)&lt;br /&gt;
&lt;br /&gt;
Damit gleichzeitig schon geladen sind (bei angemeldeten Benutzern) [[../../Einstellungen#global|globale Einstellungen]], falls vorhanden; Modulname: &amp;lt;code&amp;gt;ext.globalCssJs.user&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Benutzerskripte ===&lt;br /&gt;
Auf eigenständige Ressourcen der Benutzer ist der ResourceLoader 2012 nicht besonders zugeschnitten; er lässt sich aber trotzdem einsetzen: [[../../JS#ResourceLoader|Anwendungsbeispiel]].&lt;br /&gt;
&lt;br /&gt;
=== PHP auf dem Server ===&lt;br /&gt;
Diese Seite beschreibt schwerpunktmäßig den ResourceLoader auf der Browser-Seite in JavaScript; als Gegenstück gibt es einen analogen in [[PHP]] geschriebenen ResourceLoader auf den Servern, namentlich unter &amp;lt;code&amp;gt;/w/load.php&amp;lt;/code&amp;gt; (oder früher auf bits.wikimedia.org) zur Zusammenstellung.&lt;br /&gt;
* {{Phab|file=resources/Resources.php}} – Zusammenstellung der Module (möglicherweise bereits zukünftige Version)&lt;br /&gt;
* {{Phab|file=load.php}} – ResourceLoader&lt;br /&gt;
&lt;br /&gt;
== Das Modul ==&lt;br /&gt;
Ein Modul ist die Zusammenfassung folgender Komponenten, die einen inhaltlichen Bezug haben sollten:&lt;br /&gt;
# Modul-Name (unentbehrlich)&lt;br /&gt;
# JavaScript (praktisch immer)&lt;br /&gt;
# CSS (optional)&lt;br /&gt;
# [[Special:Prefixindex/MediaWiki:|Systemnachrichten]] (optional)&lt;br /&gt;
Die Quellen können von einer oder mehreren statischen Seiten stammen oder spontan generiert worden sein.&lt;br /&gt;
&lt;br /&gt;
Mit Vollzugsmeldung für einen Modul-Namen bestätigt die Software, dass eine bestimmte Funktionalität (JS-Funktionen, CSS-Deklarationen) einsatzbereit ist. Es wird keine Aussage darüber getroffen, woher diese Funktionalität stammt und welche von mehreren Varianten vorliegt.&lt;br /&gt;
&lt;br /&gt;
=== Name ===&lt;br /&gt;
* Jedes Modul wird durch einen Modul-Namen (eigentlich: -Identifikator, -Bezeichner) angesprochen.&lt;br /&gt;
* Grundsätzlich ist es egal, wie dieser Name lautet; es könnte auch „Rumpelstilzchen“ heißen, solange es nicht zu Namenskonflikten kommt.&lt;br /&gt;
* Es haben sich aber einige Regeln herausgebildet:&lt;br /&gt;
** Es werden ASCII-Zeichen (ohne Leerzeichen) verwendet.&lt;br /&gt;
** Überwiegend werden Kleinbuchstaben benutzt.&lt;br /&gt;
** Gliederung durch Punkte.&lt;br /&gt;
* Für individuelle Benutzer hat sich noch kein Schema herauskristallisiert. Das Präfix &amp;lt;code&amp;gt;user.&amp;lt;/code&amp;gt; wird bereits verwendet für &amp;lt;code&amp;gt;user.groups&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;user.options&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;user.tokens&amp;lt;/code&amp;gt; – sollte für weltweite Systemdefinitionen reserviert bleiben.&lt;br /&gt;
&lt;br /&gt;
Gebräuchliche Namen sind beispielsweise:&lt;br /&gt;
: &amp;lt;code&amp;gt;mediawiki.util&amp;lt;/code&amp;gt;&lt;br /&gt;
:: Ein Modul mit verschiedenen [[../mw#.util|Hilfsfunktionen]] ({{Phab|file=resources/src/mediawiki/mediawiki.util.js|title=Quelle}})&lt;br /&gt;
: &amp;lt;code&amp;gt;jquery.colorUtil&amp;lt;/code&amp;gt;&lt;br /&gt;
:: Ein Modul mit Hilfsfunktionen zu Farben ({{Phab|file=resources/src/jquery/jquery.colorUtil.js|title=Quelle}})&lt;br /&gt;
: &amp;lt;code&amp;gt;site&amp;lt;/code&amp;gt;&lt;br /&gt;
:: Projektweite [[#site|Standardressourcen]] (für das momentane Projekt)&lt;br /&gt;
: &amp;lt;code&amp;gt;user&amp;lt;/code&amp;gt;&lt;br /&gt;
:: [[#user|Standardressourcen]] des momentanen Benutzers&lt;br /&gt;
: &amp;lt;code&amp;gt;user.groups&amp;lt;/code&amp;gt;&lt;br /&gt;
:: Ressourcen, die spezifisch für Benutzergruppen sind&lt;br /&gt;
::* [[MediaWiki:Group-editor.css]]&lt;br /&gt;
::** &amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot; inline&amp;gt;span.editoronly   { display:inline !important }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
::** &amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot; inline&amp;gt;div.editoronly   { display:block !important }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
::* [[MediaWiki:Group-sysop.css]]&lt;br /&gt;
: &amp;lt;code&amp;gt;user.defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
:: [[../Variablen#Benutzerkonfiguration|Konfiguration]] für alle Benutzer, einschließlich der nicht angemeldeten&lt;br /&gt;
: &amp;lt;code&amp;gt;user.options&amp;lt;/code&amp;gt;&amp;lt;!-- seit 2018-08 --&amp;gt;&lt;br /&gt;
:: Spezifische [[../Variablen#Benutzerkonfiguration|Konfiguration]] des momentan angemeldeten Benutzers; überschreibt ggf. Komponenten von &amp;lt;code&amp;gt;user.defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;ext.gadget.Zeitzonenkonverter&amp;lt;/code&amp;gt;&lt;br /&gt;
:: [[../../Gadgets|Projektweites Helferlein]]; hier: [[MediaWiki:Gadget-Zeitzonenkonverter]]&lt;br /&gt;
: &amp;lt;code&amp;gt;ext.irgendein-name&amp;lt;/code&amp;gt;&lt;br /&gt;
:: Erweiterungen; Extensions auf dem Server oder in JavaScript.&lt;br /&gt;
: &amp;lt;code&amp;gt;ext.gadget.irgendein-helferlein&amp;lt;/code&amp;gt;&lt;br /&gt;
:: Erweiterung oder Gadget in JavaScript.&lt;br /&gt;
&lt;br /&gt;
Siehe auch: [[mw:ResourceLoader/Default modules|mw: Default modules]] (englisch)&lt;br /&gt;
&lt;br /&gt;
=== Speicherort ===&lt;br /&gt;
Aus dem Modulnamen lässt sich durch Menschen erraten, auf welcher Seite eine Quelle gespeichert sein könnte; aber dies lässt sich nicht durchgängig automatisch generieren. Es besteht der gleiche feine Unterschied wie zwischen [[Uniform Resource Locator|URL]] und [[Uniform Resource Name|URN]].&lt;br /&gt;
* Das Modul kann on-the-fly generiert worden sein; dann gibt es keine Seite.&lt;br /&gt;
* Das gleiche Modul kann in verschiedenen Projekten gespeichert sein; es kann in unterschiedlichen Entwicklungsständen verfügbar sein.&lt;br /&gt;
* Von welcher URL das Modul geladen wurde, spielt letztlich keine Rolle. Entscheidend ist, dass die zugesicherte Funktionalität unterstützt wird.&lt;br /&gt;
&lt;br /&gt;
== Pakete ==&lt;br /&gt;
Die Skriptquellen und CSS-Stile werden nicht einzeln vom Server abgerufen, sondern gebündelt. Dies beschleunigt den Ablauf und senkt den Ressourcenverbrauch; siehe „[[Skalierbarkeit#DNS-Webpackaging|Webpackaging]]“.&lt;br /&gt;
&lt;br /&gt;
Es werden in den folgenden Situationen Pakete von Modulen gebildet:&lt;br /&gt;
# Wenn die welt- und projektweite [[#Grundausstattung|Grundausstattung]] einer Seite bereitgestellt wird („Startup“) – spezifisch für jede Skin.&lt;br /&gt;
# Wenn die [[../../Gadgets|Gadgets]] anhand der Benutzerkonfiguration ausgeliefert werden.&lt;br /&gt;
# Wenn eine  [[#.loader.using()|.loader.using()]]-Anforderung abgearbeitet wurde und dabei fehlende Module festgestellt wurden.&lt;br /&gt;
Es werden auf einen Schlag einerseits alle Skripte, andererseits alle angeforderten CSS-Definitionen geladen. Jede URL erhält eine [[#Browser-Cache|Versionsidentifikation]] (Zeitstempel).&lt;br /&gt;
&lt;br /&gt;
Im Standardmodus (&amp;lt;code&amp;gt;[[#Debug|debug=false]]&amp;lt;/code&amp;gt;) werden dabei außerdem:&lt;br /&gt;
* alle Skripte bzw. Stile hintereinander kopiert und unter jeweils einer einzigen URL bereitgestellt.&lt;br /&gt;
** Die URL erhält einen Zeitstempel gemäß der jüngsten (numerisch größten) Komponente.&lt;br /&gt;
* Die Ressource wird minimiert.&lt;br /&gt;
** Das gepackte Ergebnis wird in einem Cache zur Wiederverwendung eingelagert.&lt;br /&gt;
** Weil gerade im allgemeinen Bereich der Seite immer dieselben Kombinationen von Ressourcen auftreten, kann der Server (und auch Proxy-Server) diese fertigen Pakete für alle Benutzer vorhalten.&lt;br /&gt;
* Weil nur eine URL abgefragt wird, ist der Verkehr zwischen Benutzern und Server geringer.&lt;br /&gt;
&lt;br /&gt;
== {{Anker|Debug}} Debug-Modus und Komprimierung ==&lt;br /&gt;
Jede Ressource lässt sich in zwei Varianten vom Server laden:&lt;br /&gt;
# &amp;lt;code&amp;gt;debug=false&amp;lt;/code&amp;gt; &amp;amp;nbsp; (Standardvorgabe)&lt;br /&gt;
#* Für alle gleichzeitig benötigten Skripte oder CSS-Definitionen wird eine einzige URL gebildet und darunter auch hintereinander weg geschrieben als eine kompakte Ressource vom Server geliefert.&lt;br /&gt;
#* Der Code jedes einzelnen Skriptes und CSS wird komprimiert:&lt;br /&gt;
#** Alle Kommentare werden gelöscht.&lt;br /&gt;
#** Alle entbehrlichen [[Leerraum|Whitespace-Zeichen]] werden entfernt.&lt;br /&gt;
#** Es wird eine Zeilenlänge von etwa 1000 Zeichen durch Verkettung einzelner Statements hergestellt; die (korrekte) Syntax von JavaScript und CSS erlaubt das.&lt;br /&gt;
#* Bei erkannten groben Syntaxfehlern in den Quellen wird die Ressource nicht ausgeliefert, statt dessen eine Fehlermeldung gesendet.&lt;br /&gt;
#* Die Komprimierung ist allerdings nicht ganz unproblematisch; bei syntaktisch falscher Programmierung kann es zu falschen Konstruktionen kommen, und es werden Syntaxkonstrukte nicht erkannt, die aber auch nicht von jedem Browser richtig interpretiert werden.&lt;br /&gt;
#* In den Zeilen von 1000 Zeichen Länge ist bei auftretenden Folgefehlern keine unmittelbare Analyse möglich.&lt;br /&gt;
# &amp;lt;code&amp;gt;debug=true&amp;lt;/code&amp;gt;&lt;br /&gt;
#* Es erfolgt keine Komprimierung.&lt;br /&gt;
#* Jede Ressource wird einzeln geliefert, so wie sie auch im Quellprogramm definiert ist. Damit sind Zeilennummern identisch.&lt;br /&gt;
#* Standardmäßig wird ein Hilfsmittel geladen, das die Auswertung in der [[../../JS#Fehlermeldungen|Fehlerkonsole]] unterstützen soll.&lt;br /&gt;
&lt;br /&gt;
== Browser-Cache ==&lt;br /&gt;
An die mittels &amp;lt;code&amp;gt;load.php&amp;lt;/code&amp;gt; gebildete URL wird die jeweils jüngste Änderungszeit auf dem Server mit einer Genauigkeit von zehn Sekunden angefügt. Damit hat jedes Paket eine eindeutige URL, die sich von veralteten Versionen im [[Browser-Cache]] unterscheidet. Somit bleibt Browsern und Proxy-Servern nichts anderes übrig, als die aktuelle Version herunterzuladen.&lt;br /&gt;
&lt;br /&gt;
Für die Standardressourcen des Projekts und Benutzers sowie Gadgets wird vom Server dieser Zeitschlüssel an die URL angefügt.&lt;br /&gt;
&lt;br /&gt;
Betreffend der weltweit einheitlichen zentralen MediaWiki-Software wird ein Verzeichnis aller erhältlichen Module mit den jeweiligen Zeitschlüsseln in jede HTML-Seite eingeschrieben. Diese Liste hat selbst aber zurzeit (MW&amp;amp;nbsp;1.18/1.20) keinen Versionscode; eine Veränderung eines Zeitschlüssels eines Moduls hätte somit keine neue URL zur Folge. Allerdings gelten die Module der zentralen Software als stabil und werden normalerweise zur Laufzeit einer Version nicht verändert.&lt;br /&gt;
&lt;br /&gt;
== mw.loader ==&lt;br /&gt;
Im [[../mw|mw-Objekt]] steht der ResourceLoader als Komponente &amp;lt;code&amp;gt;.loader&amp;lt;/code&amp;gt; zur Verfügung.&lt;br /&gt;
* [[mw:ResourceLoader/Default modules#mediaWiki.loader|mw:mediaWiki.loader]]  – Beschreibung (englisch)&lt;br /&gt;
* {{Phab|file=resources/src/startup/mediawiki.js}} – Quellcode&lt;br /&gt;
* [https://doc.wikimedia.org/mediawiki-core/master/js/#!/api/mw.loader Kurzdokumentation]&lt;br /&gt;
&lt;br /&gt;
; mw.loader.addSource(modules, props) {{Anker|.loader.addSource()}}&lt;br /&gt;
: Registrierung einer URL (für load.php gedacht) zu einem Quellcode. &amp;lt;!-- MW 1.19 --&amp;gt;&lt;br /&gt;
; mw.loader.getModuleNames()   {{Anker|.loader.getModuleNames()}}&lt;br /&gt;
: Array mit allen bekannten Modulnamen. &amp;lt;!-- MW.19 --&amp;gt;&lt;br /&gt;
; mw.loader.getState(module)   {{Anker|.loader.getState()}}&lt;br /&gt;
: Status einer Ressource abfragen.&lt;br /&gt;
:* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt;: String mit Modulname.&lt;br /&gt;
: Rückgabewert ist eine Zeichenkette, wenn das Modul bislang irgendwie bekannt geworden war.&lt;br /&gt;
:* &amp;quot;&amp;lt;code&amp;gt;registered&amp;lt;/code&amp;gt;&amp;quot; – Modulname ist bekannt – definiert in [[#.loader.register()|.loader.register()]].&lt;br /&gt;
:* &amp;quot;&amp;lt;code&amp;gt;loading&amp;lt;/code&amp;gt;&amp;quot; – Modul wird zurzeit geladen.&lt;br /&gt;
:* &amp;quot;&amp;lt;code&amp;gt;loaded&amp;lt;/code&amp;gt;&amp;quot; – Dieses Modul wurde erfolgreich einzeln geladen.&lt;br /&gt;
:* &amp;quot;&amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt;&amp;quot; – Dieses Modul und alle seine Abhängigkeiten wurden geladen.&lt;br /&gt;
:* &amp;quot;&amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt;&amp;quot; – Dieses Modul hat möglicherweise einen Syntaxfehler.&lt;br /&gt;
:* &amp;quot;&amp;lt;code&amp;gt;missing&amp;lt;/code&amp;gt;&amp;quot; – Zugriff auf die URL dieses Moduls gescheitert.&lt;br /&gt;
:* &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; – Modulname ist nicht bekannt.&lt;br /&gt;
: Wenn eine Wiki-Seite geladen wurde, sind die Registrierungsinformationen aller nutzbaren Module (einschließlich Versionsinfo) definiert; zunächst als &amp;lt;code&amp;gt;registered&amp;lt;/code&amp;gt;, ggf. auch schon als &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt;.&lt;br /&gt;
; mw.loader.getVersion(module)   {{Anker|.loader.getVersion()}}&lt;br /&gt;
: Versionsinformation einer Ressource abfragen – definiert in .loader.register().&lt;br /&gt;
:* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt;: String mit Modulname.&lt;br /&gt;
: Rückgabewert ist eine Zeichenkette, wenn das Modul bekannt ist.&lt;br /&gt;
:* String – ISO8601 &amp;#039;&amp;#039;YYYYMMDD&amp;#039;&amp;#039;T&amp;#039;&amp;#039;hhmmss&amp;#039;&amp;#039;Z, oder &amp;quot;&amp;lt;code&amp;gt;19700101T000000Z&amp;lt;/code&amp;gt;&amp;quot; wenn nicht vereinbart.&lt;br /&gt;
:* &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; – Modulname ist nicht bekannt&lt;br /&gt;
; &amp;lt;s&amp;gt;mw.loader.implement(module, script, style, msgs, templates)   {{Anker|.loader.implement()}}&amp;lt;/s&amp;gt;&lt;br /&gt;
: Deklaration eines neuen Modulnamens, Verbindung mit der zugehörigen Implementierung und Laden.&lt;br /&gt;
: Alle Parameter bis auf den Modulnamen sind optional; gleichwohl muss sinnvollerweise mindestens einer die Implementierung enthalten.&lt;br /&gt;
:* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt;: String mit Modulname. Darf noch nicht mit &amp;lt;code&amp;gt;implement()&amp;lt;/code&amp;gt; vereinbart gewesen sein.&lt;br /&gt;
:* &amp;lt;code&amp;gt;script&amp;lt;/code&amp;gt;: Auszuführende Funktion (Code) oder Array&amp;lt;!-- 2011/2012 Fehler in MW Doku @param --&amp;gt; von URL mit JS-Code&lt;br /&gt;
:* &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt;: Objekt; entweder aus direkten CSS-Deklarationen oder Liste der URL von CSS-Deklarationen – nicht &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
:* &amp;lt;code&amp;gt;msgs&amp;lt;/code&amp;gt;: Objekt; benötigte Systemnachrichten, die den [[../mw#.messages|.messages]] hinzuzufügen sind, als key:value – nicht &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
: &amp;#039;&amp;#039;Wirkung:&amp;#039;&amp;#039; Die Funktion wird ausgeführt oder die Skript-Quellen werden von den angegebenen URL abgerufen, indem &amp;amp;lt;script&amp;amp;nbsp;src=&amp;gt; in das Dokument eingefügt wird. War das Laden erfolgreich, wird der Status &amp;lt;code&amp;gt;loaded&amp;lt;/code&amp;gt; gesetzt; &amp;lt;code&amp;gt;missing&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; wenn ein Fehler detektiert wurde. Über die Registrierung hinaus erfolgt zurzeit auch immer das tatsächliche Laden. Im Erfolgsfall wird nach aufgelaufenen unbefriedigten Abhängigkeiten gesucht; sind keine mehr vorhanden, wird &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt; für das Modul ausgewiesen. Schließlich werden eventuelle Funktionen aus der .loader.using()-Warteschlange ausgeführt.&lt;br /&gt;
; &amp;lt;s&amp;gt;mw.loader.inspect(reports)&amp;lt;/s&amp;gt;   {{Anker|.loader.inspect()}}&lt;br /&gt;
: Analysierte die bekannten und geladenen Module zu Testzwecken.&lt;br /&gt;
: Gab auf Debugging-Konsolen (Firebug, zurzeit nicht aber Dragonfly) eine Liste der geladenen Modul-IDs aus; dazu die Code-Größe statischer Module und Angaben zum CSS. Die Tabelle war ggf. sortierbar, falls &amp;lt;code&amp;gt;console.table()&amp;lt;/code&amp;gt; unterstützt wird.&lt;br /&gt;
: Nicht mehr verfügbar; siehe jedoch: [[../mw#.inspect|mw.inspect]]&lt;br /&gt;
; mw.loader.load()   {{Anker|.loader.load()}}&lt;br /&gt;
:* &amp;#039;&amp;#039;&amp;#039;.loader.load(URL, MIME, async)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
:*: Siehe [[../../JS#loader.load()|Laden anderer Skripte]] für JavaScript und CSS, etwa Benutzerskripte.&lt;br /&gt;
:*:* &amp;lt;code&amp;gt;URL&amp;lt;/code&amp;gt;: &amp;#039;&amp;#039;string&amp;#039;&amp;#039;; nur &amp;lt;code&amp;gt;//&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;http://&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;https://&amp;lt;/code&amp;gt;&lt;br /&gt;
:*:* &amp;lt;code&amp;gt;MIME&amp;lt;/code&amp;gt;: &amp;#039;&amp;#039;string&amp;#039;&amp;#039;; Vorgabe &amp;lt;code&amp;gt;application/javascript&amp;lt;/code&amp;gt; – sonst nur &amp;lt;code&amp;gt;text/css&amp;lt;/code&amp;gt; (momentan ist noch &amp;lt;code&amp;gt;text/javascript&amp;lt;/code&amp;gt; Vorgabe)&lt;br /&gt;
:*:* &amp;lt;code&amp;gt;async&amp;lt;/code&amp;gt;: &amp;#039;&amp;#039;boolean&amp;#039;&amp;#039; &amp;lt;!-- MW 1.19 --&amp;gt;&lt;br /&gt;
:*:** &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; (Vorgabe) – URL asynchron laden, auch wenn &amp;#039;&amp;#039;document.ready&amp;#039;&amp;#039; noch nicht eingetreten war.&lt;br /&gt;
:*:** &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; – abwarten, bis &amp;#039;&amp;#039;document.ready&amp;#039;&amp;#039; und dann erst mit dem Laden beginnen.&amp;lt;!-- ????&lt;br /&gt;
(default)&lt;br /&gt;
* true if loading a URL&lt;br /&gt;
* false if loading modules&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
:* &amp;#039;&amp;#039;&amp;#039;.loader.load( modules )&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
:*: Laden eines Moduls (oder mehrerer Module) einschließlich aller weiteren Module, von denen diese abhängen.&lt;br /&gt;
:*:* &amp;lt;code&amp;gt;modules&amp;lt;/code&amp;gt;: String mit Modulname, oder Array mit Modulnamen.&lt;br /&gt;
:*: War das Modul bereits geladen gewesen, sollte nichts weiter passieren.&lt;br /&gt;
:*: Soll anschließend eine Funktion ausgeführt werden, wäre [[#.loader.using()|.loader.using()]] zu verwenden. Wenn das Skript selbst eine Art AutoRun-Funktion enthält, kann .loader.load() benutzt werden.&lt;br /&gt;
; mw.loader.register( module, version, dependencies, group, source )   {{Anker|.loader.register()}}&lt;br /&gt;
: Registrierung eines Moduls zum Abruf über &amp;lt;code&amp;gt;load.php&amp;lt;/code&amp;gt; &amp;lt;s&amp;gt;(von //bits.wikimedia.org)&amp;lt;/s&amp;gt;&lt;br /&gt;
: Für Benutzerskripte nicht nutzbar.&lt;br /&gt;
:* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt;: String mit Modulnamen, oder Array.&lt;br /&gt;
:* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;: Versionsnummer; erlaubt Unterscheidung im Browser-Cache.&amp;lt;br /&amp;gt; Erwartet wird die Anzahl der Sekunden seit dem 1. Januar 1970, 00:00:00.&amp;lt;br /&amp;gt;Es handelt sich nur um den Zeitpunkt, zu dem die Ressource im Dateisystem ankam – nicht um eine inhaltliche Versionsnummer im Sinne einer Weiterentwicklung. Eine jüngere Version kann einen älteren Inhalt beschreiben, beispielsweise nach einem Revert.&lt;br /&gt;
:* &amp;lt;code&amp;gt;dependencies&amp;lt;/code&amp;gt;: Abhängigkeiten; Array→String oder einzelner String oder Function→Array.&lt;br /&gt;
:* &amp;lt;code&amp;gt;group&amp;lt;/code&amp;gt;: Übergeordneter Modulname, wenn &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt; ein Untermodul ist.&lt;br /&gt;
:* &amp;lt;code&amp;gt;source&amp;lt;/code&amp;gt;: aktuelles Wikiprojekt (wgLoadScript; Vorgabe), oder anderes Wiki; Pfad vor &amp;lt;code&amp;gt;load.php&amp;lt;/code&amp;gt;&lt;br /&gt;
: Erster Parameter Pflicht, Rest optional.&lt;br /&gt;
; mw.loader.require( module )   {{Anker|.loader.require()}}&lt;br /&gt;
: Status einer Ressource sichern: Wenn noch nicht bereit, dann Fehler auslösen.&lt;br /&gt;
: Ermöglicht das Aufspüren vergessener Abhängigkeiten aus tieferen Schichten.&lt;br /&gt;
:* &amp;lt;code&amp;gt;module&amp;lt;/code&amp;gt;: String mit Modulname&lt;br /&gt;
: Gleichgesetzt mit &amp;lt;code&amp;gt;window.require()&amp;lt;/code&amp;gt; – nur in dieser Form soll es in produktivem Code verwendet werden.&lt;br /&gt;
: Bei über [[#.loader.using()|.using()]] angeforderten Modulen wird die Funktionsdefinition zurückgegeben. &lt;br /&gt;
; mw.loader.state(modules)   {{Anker|.loader.state()}}&lt;br /&gt;
: Setze den Status von Ressourcen.&lt;br /&gt;
: Dabei ist &amp;#039;&amp;#039;modules&amp;#039;&amp;#039; ein &amp;lt;code&amp;gt;object&amp;lt;/code&amp;gt; mit Zuweisungen ID→state.&amp;lt;!-- 2018-08-23 1.32.0-wmf.18 --&amp;gt;&lt;br /&gt;
: Siehe [[#.loader.getState()|.loader.getState()]]&lt;br /&gt;
; mw.loader.store   {{Anker|.loader.store}}&lt;br /&gt;
: Abspeicherung im persistenten [[WebStorage]] verwalten (Objekt).&lt;br /&gt;
:* &amp;#039;&amp;#039;&amp;#039;.loader.store.clear()&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
:*: Lösche im Browser hinterlegten MediaWiki-Code.&lt;br /&gt;
:* &amp;#039;&amp;#039;&amp;#039;.loader.store.enabled&amp;#039;&amp;#039;&amp;#039; = false;&lt;br /&gt;
:*: Verhindere Abspeicherung im &amp;lt;code&amp;gt;localStorage&amp;lt;/code&amp;gt; des Browsers.&lt;br /&gt;
; mw.loader.using( dependencies, ready, error )   {{Anker|.loader.using()}}&lt;br /&gt;
: Starte eine Funktion, nachdem ein Modul geladen wurde, oder wenn dies fehlschlug; lade fehlende weitere Module nach.&lt;br /&gt;
: Rückgabewert&amp;lt;!-- MW1.23 --&amp;gt; ist ein Objekt vom Typ &amp;lt;code&amp;gt;[http://api.jquery.com/jQuery.Deferred/ jQuery.Promise]&amp;lt;/code&amp;gt;, auf das weitere [[Wikipedia:Technik/Skin/JS/API#Callback|Callback-Vereinbarungen]] angewendet werden können. Die reguläre &amp;#039;&amp;#039;done&amp;#039;&amp;#039;-Funktion ist bereits der zweite Parameter.&lt;br /&gt;
:* &amp;lt;code&amp;gt;dependencies&amp;lt;/code&amp;gt;: String oder Array – Name/n der Module, die vor der Ausführung von &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt; geladen sein müssen. Schließt automatisch diejenigen Module ein, von denen sie intern abhängen.&lt;br /&gt;
:* &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt;: Funktion, die ausgeführt wird, nachdem alle Module geladen worden sind.&lt;br /&gt;
:* &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt;: (optional) Funktion, die ausgeführt wird, falls das zusätzliche Laden fehlschlug.&lt;br /&gt;
: [[../../JS#Module auf dem Server|Anwendungsbeispiel]]&lt;br /&gt;
&lt;br /&gt;
Die restlichen Funktionen sind zurzeit für lokale Projekte und Benutzer kaum einsetzbar oder nicht empfehlenswert: addStyleTag(), resolveIndexedDependencies(), work().&lt;br /&gt;
&lt;br /&gt;
Es gibt für den Fehlerfall auch ein Event &amp;lt;code style=&amp;quot;white-space:nowrap&amp;quot;&amp;gt;resourceloader_exception(e, [module], source)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Benutzer-Skript ==&lt;br /&gt;
Um ein bibliotheksartiges Benutzer-Skript (übergangsweise) für bedarfsweises Laden durch den ResourceLoader auszustatten, ist wie folgt vorzugehen:&lt;br /&gt;
# Eindeutigen und langfristig haltbaren [[#Name|Modul-Namen]] vergeben.&lt;br /&gt;
# Am Ende des Skriptes mit [[#.loader.state()|&amp;lt;code&amp;gt;.loader.state(&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;name&amp;#039;&amp;#039;&amp;lt;code&amp;gt;,&amp;amp;nbsp;&amp;quot;ready&amp;quot;)&amp;lt;/code&amp;gt;]] das abgeschlossene Laden deklarieren. Falls das Skript zuvor auf eine andere Weise geladen würde, wird ein unnötiger und möglicherweise zu Fehlfunktionen führender mehrfacher Abruf vermieden.&lt;br /&gt;
# Auf sorgfältige und syntaktisch einwandfreie Programmierung achten.&lt;br /&gt;
# Den Anwendern den Modul-Namen bekanntgeben sowie mögliche URL mit den Quellen.&lt;br /&gt;
# Für den weiteren Einsatz siehe [[../../JS#ResourceLoader|Anwendungsbeispiel]].&lt;br /&gt;
# [[#Debug|Komprimierung]] und [[#Browser-Cache|Versionsaktualisierung]] erfolgen dabei jedoch nicht.&lt;br /&gt;
&lt;br /&gt;
== Gadgets ==&lt;br /&gt;
Bei einem [{{fullurl:Special:Prefixindex|namespace=8&amp;amp;prefix=Gadget-}} MediaWiki:Gadget-&amp;#039;&amp;#039;Name&amp;#039;&amp;#039;.js] sind Besonderheiten betreffend Ladereihenfolge und Ausführung zu beachten.&lt;br /&gt;
&lt;br /&gt;
Bisher war es so, dass &amp;#039;&amp;#039;zuerst&amp;#039;&amp;#039; die [[Wikipedia:Helferlein|Helferlein]] (Gadgets) geladen und ausgeführt wurden, danach die [[#user|Standardressourcen des Benutzers]].&lt;br /&gt;
&lt;br /&gt;
Das änderte sich 2011/2012:&lt;br /&gt;
# Schnelle Browser mit asynchronem Laden von Ressourcen halten sich nicht mehr unbedingt an eine Reihenfolge im Ablauf.&lt;br /&gt;
# Der ResourceLoader stellt alle vom Benutzer angeforderten (und bereits als dazu geeignet markierten) Gadgets zu einem [[#Pakete|Paket]] zusammen.&lt;br /&gt;
#* Dieses wird standardmäßig &amp;#039;&amp;#039;nach&amp;#039;&amp;#039; dem Benutzerskript-Paket &amp;lt;code&amp;gt;user&amp;lt;/code&amp;gt; geladen. Darauf kann man sich jedoch auch nicht verlassen; ein Browser könnte beide Pakete gleichzeitig abfordern und es kann von Netzwerkbedingungen abhängen, welches zuerst bereit ist.&lt;br /&gt;
Man darf bei Neuprogrammierungen oder grundlegenden Überarbeitungen grundsätzlich keine Reihenfolgen mehr unterstellen, sondern muss explizit eine erforderliche Synchronisation durch Deklaration von Abhängigkeiten herstellen.&lt;br /&gt;
&lt;br /&gt;
=== Definition und Abhängigkeiten ===&lt;br /&gt;
Beim Speichern im Namensraum für Gadgets müssen in jedem Fall die benötigten &amp;#039;&amp;#039;dependencies&amp;#039;&amp;#039; in einem Kommentar am Beginn des Skriptes angegeben werden, damit sie richtig in [[MediaWiki:Gadgets-definition]] eingepflegt werden können.&lt;br /&gt;
&lt;br /&gt;
Es würde auch nicht viel schaden, die Funktion in eine [[#.loader.using()|.using]]-Klausel einzubetten, wenn zu erwarten ist, dass das Skript auch öfters außerhalb der automatischen Helferlein geladen werden soll. Das wäre bei aufwändigen Skripten etwa mit API-Abfragen anzunehmen.&lt;br /&gt;
&lt;br /&gt;
Die auf [[MediaWiki:Gadgets-definition]] dafür vereinbarten Skripte können allerdings spontan über [[#.loader.load()|&amp;lt;code&amp;gt;.loader.load(&amp;quot;ext.gadget.&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;name&amp;#039;&amp;#039;&amp;lt;code&amp;gt;&amp;quot;).&amp;lt;/code&amp;gt;]] statt [[../../JS#Laden anderer Skripte|.loader.load(URL)]] bedarfsweise geladen werden: Im ersten Fall versorgen sie sich dann selbsttätig mit ihren aktuell benötigten dependencies, und wenn sie bereits geladen waren, passiert nichts Überflüssiges oder Selbstzerstörendes&amp;amp;nbsp;– und die aktuellste Version wird abgerufen. Genauso mit .loader.using().&lt;br /&gt;
&lt;br /&gt;
Mit .loader.load(URL) kann es hingegen zum Überschreiben von Initialisierungs- und Konfigurationsdaten kommen, wenn das Skript auf anderem Weg bereits geladen war; auch werden die dependencies ggf. nicht befriedigt und es kann eine veraltete Version im Browser-Cache liegen.&lt;br /&gt;
&lt;br /&gt;
=== Benutzerkonfiguration ===&lt;br /&gt;
Im Benutzerskript kann nicht mehr stehen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot; style=&amp;quot;border: none; padding: 0; margin-left: 2em;&amp;quot;&amp;gt;&lt;br /&gt;
 if (window.thisGadget) {&lt;br /&gt;
    window.thisGadget.thatOption = true;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dies muss künftig bei den Anwendern geschrieben werden als:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot; style=&amp;quot;border: none; padding: 0; margin-left: 2em;&amp;quot;&amp;gt;&lt;br /&gt;
 if (! mw.libs.thisGadget) {&lt;br /&gt;
    mw.libs.thisGadget  =  { };&lt;br /&gt;
 }&lt;br /&gt;
 mw.libs.thisGadget.thatOption = true;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Auf der Seite [[MediaWiki:Gadgets-definition]] muss es bei konfigurierbaren Skripten heißen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; style=&amp;quot;border: none; padding: 0; margin-left: 2em;&amp;quot;&amp;gt;&lt;br /&gt;
   thisGadget[ResourceLoader|dependencies=user]|thisGadget.js&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im Gadget muss eingangs geprüft werden, ob vom Anwender das [[../Datenelemente#Anwendungsobjekt|Anwendungsobjekt]] schon definiert wurde:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot; style=&amp;quot;border: none; padding: 0; margin-left: 2em;&amp;quot;&amp;gt;&lt;br /&gt;
 if (! mw.libs.thisGadget) {&lt;br /&gt;
    mw.libs.thisGadget  =  { };&lt;br /&gt;
 }&lt;br /&gt;
 mw.libs.thisGadget.init  =  function () { .................&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Grundsätzlich sollte kein Anwendungsobjekt einfach überschrieben und ungeprüft definiert werden; es könnte im Lauf vorangegangener Prozeduren bereits mit Inhalten und Funktionalität gefüllt worden sein.&lt;br /&gt;
&lt;br /&gt;
In einem mittels &amp;lt;code&amp;gt;mw.loader.load()&amp;lt;/code&amp;gt; geladenen Skript hat man im Unterschied zum Gadget die Kontrolle über die Ladereihenfolge. Wenn Benutzer ein Skript selbst laden, können sie vorher die Optionen setzen.&lt;br /&gt;
&lt;br /&gt;
=== Status ===&lt;br /&gt;
Wenn Benutzer über die Gadget-Option das Helferlein automatisch geladen haben, wird auch der Gadget-Status auf &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt; gesetzt.&lt;br /&gt;
&lt;br /&gt;
Da es aber ein normales Skript ist, könnte die Seite auch später dynamisch mit .loader.load() geladen werden. Um für diesen Fall den korrekten Status zu verdeutlichen und Interaktion mit anderen Skripten sicherzustellen, sollte zusätzlich am Ende vereinbart werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot; style=&amp;quot;border: none; padding: 0; margin-left: 2em;&amp;quot;&amp;gt;&lt;br /&gt;
mw.loader.state( { &amp;quot;ext.gadget.meinHelferlein&amp;quot;: &amp;quot;ready&amp;quot; } );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weitere Informationen ==&lt;br /&gt;
(alle englisch)&lt;br /&gt;
{{MediaWiki|ResourceLoader|suffix=Projektseite}}&lt;br /&gt;
* [[mw:ResourceLoader/Developing with ResourceLoader|Developing]]&lt;br /&gt;
* [[mw:ResourceLoader/Migration guide (users)|Migration guide (users)]]&lt;br /&gt;
* [[mw:ResourceLoader/Version 2 Design Specification|Version 2 Design Specification]]&lt;br /&gt;
* [https://doc.wikimedia.org/mediawiki-core/master/js/#!/api/mw.loader Dokumentation] der Bibliotheksfunktionen&lt;br /&gt;
* Phabricator-Diffusion mit allen {{Phab|dir=resources/src|title=Quellcodes}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Wikipedia:Technik/Skin|ResourceLoader]]&lt;/div&gt;</summary>
		<author><name>imported&gt;PerfektesChaos</name></author>
	</entry>
</feed>