YUI Loader und Änderungen für 3.4.0

1. Juli 2011 auf 6.34 von Dav Glass | In Entwicklung , Leistung | Keine Kommentare

In 3.4.0 haben wir begonnen den Prozess der Verlagerung einiger Loader die Logik um, nicht nur damit es performant, sondern um es robuster und einfacher in anderen Orten nutzen (wie auf dem Server). Wir werden Ausrollen weitere Änderungen in künftigen Revisionen, aber ich wollte einige Zeit in Anspruch nehmen und erklären, was geändert wurde, warum es geändert wurde und wie es Entwicklern auswirken. Für die Mehrheit der Use-Cases, werden die Entwickler merken nichts anderes, außer, dass die Dinge ein wenig schneller sind und ihre Forderung Downloads sind ein wenig kleiner.

Seed-Datei

Das erste, was ich ansprechen möchte, ist die YUI-Seed-Datei. In früheren Versionen von YUI, war unser Seed-Datei sehr klein und enthielt keine Loader oder einer ihrer Meta-Daten. Wir haben festgestellt, dass in der 90%-Use-Case dies nicht so performant wie wir gehofft hatten. Der normale Benutzer umfasst die Seed-Datei fordert dann ihren Modulen, was wiederum bedeutet, dass das Saatgut erst zu holen Loader benötigt, dann berechnen alle seine Abhängigkeiten, dann holen sie alle. Wir haben jetzt das Gefühl, dass diese zusätzliche HTTP-Anfrage die falsche Sache zu tun ist, so der neue Standard-Seed-Datei enthält Loader und die Meta-Daten. Ja, das macht den ursprünglichen Antrag ein wenig größer, aber es wird das Laden von Modulen zu machen, die viel schneller, da alle ihre Meta-Daten Anforderungen sind jetzt bereits auf der Seite.

Wenn Sie verwenden die alte Weise möchten, können Sie einfach auch die yui-base-Seed-Datei statt. Es beinhaltet alles, was zu machen YUI in Stand-alone-Modus betrieben wird und es enthält die Möglichkeit, Loader on demand abrufen. Wenn Sie noch feinere Abhängigkeiten erfordern, haben wir eine yui-Core-Seed-Datei, die genau ist, was die alte yui-base Samen erstellt wurde.

     / Build / yui / yui-min.js / / YUI Seed + Loader
     / Build / yui-base / yui-base-min.js / / Old Seed YUI Loader mit Unterstützung holen
     / Build / yui-core / yui-core-min.js / / Old yui-base ohne Loader holen Unterstützung

Es wird darauf hingewiesen, dass diese URLs anders als die bisherigen URLs werden. Jeder, der mit dem war yui/yui-base.js Dateien müssen sie repoint yui-core/yui-core.js . Wenn Sie die ältere Art der Beladung der Samen und das Abrufen Loader möchten, verwenden Sie die yui-base/yui-base.js Seed-Datei.

Die andere Begründung für diese Änderung ist unsere Roadmap für die Herstellung YUI in so vielen Orten wie möglich laufen. Die alte Seed-Datei sowie Loader in einem einzigen Kombi-Server anzufordern ist alles schön und gut, wenn man eine Combo-Server in Ihrer Anwendung verfügbar zu haben. Aber was ist auf dem Server? Oder in einer Offline-Anwendung auf einem mobilen Gerät? Diese Orte müssen Dateizugriff zu minimieren, während noch immer die Informationen die sie benötigen.

Rollups

Das nächste, was wir geändert wurde entfernt Rollups vom System und säumigen allowRollup in den Loader Konfiguration falsch. Was bedeutet das für Sie? Na, hoffentlich überhaupt nichts. Bevor ich die Auswirkungen der Änderung zu erklären, lassen Sie mich erklären die Gründe dahinter. Der Hauptgrund ist, wieder, Performance, zusammen mit Nutzlast Lieferung. Nehmen Sie dieses Beispiel:

      Modul A: erfordert Event-a-, Event-b
      Modul B: erfordert Event-c-, Event-d

Wenn Sie beide Anfrage, das Rollup-Logik vor 3.4.0 verwendet, um festzustellen, dass Sie die Veranstaltung Rollup erhalten. Welche eigentlich gemeint, dass Sie bekamen:

      event.a, event.b, event.c, event.d, event.e, event.f, event.g, event.h

Sie endete mit auf Ihrer Seite, als man tatsächlich benötigt wird. Durch das Ausschalten des Rollups zu unterstützen, wird YUI jetzt für nur fragen, was Sie tatsächlich angefordert und nichts mehr. In den meisten Fällen werden Sie nicht bemerken. Modul-Entwickler kann in eine Situation, wo die Dinge, die in der Vergangenheit funktioniert nicht funktionieren kann jetzt laufen. Der Grund dafür ist, dass sie tatsächlich geleisteten Arbeitsstunden durch Zufall vor. Lassen Sie mich mit einem Beispiel aus der Praxis: Dial.

In 3.3.0, benötigt Dial dies:

     erfordert: [
         'Widget',
         'Dd-ziehen',
         'Ersatz',
         "Event-mouseenter ', 
         "Übergang",
         'Intl'
     ]

Zum größten Teil, Dial in 3.4.0 gearbeitet hat jedoch Unterstützung für die Tastatur nicht funktioniert. Nach einigen einfachen Untersuchung stellte sich heraus, dass das Rollup-Unterstützung wurde die Auftragserledigung tatsächlich die gesamte Event-Rollup (einschließlich Event-move-und Event-Taste). Ohne das Rollup Logik zieht in alle Ereignis, 3.4.0 Dial nicht mehr hatte alle seine Anforderungen. Machen Dial die Anforderungen spezifischer und Definition aller seiner tatsächlichen Abhängigkeiten richtig macht es wie erwartet funktionieren.

     erfordert: [
         'Widget',
         'Dd-ziehen',
         'Ersatz',
         "Event-mouseenter ',
         "Event-move ',
         "Event-key ',
         "Übergang",
         'Intl'
     ]

Für Modul-Entwickler ist es eine bewährte Methode, um sicherzustellen, dass Ihr Modul erfordert genau das, was es zu funktionieren muss. Gehen Sie nicht davon, dass eine vorgeschaltete Modul Voraussetzung ist. Es ist immer besser, um sicherzustellen, dass Sie für das, was Sie benötigen.

Dies bedeutet auch, dass das Modul Anforderungen mehr klar definiert sind. Zum Beispiel, datatype-date hat Intl Unterstützung in. In früheren Versionen der Intl wie dieser Zugang würde gebaut:

     Y.Intl.getAvailableLangs ('datatype-date');

Aber da dieses Modul nicht wirklich eine Sprache (die datatype-date-format -Modul der Fall ist), wird dies scheitern. Es muss um genauer zu sein und eigentlich für Sprachen für das richtige Modul zu fragen:

     Y.Intl.getAvailableLangs ('datatype-date-format');

Build-Datei Explosion und Submodul Removal

Nach dieser Änderung wurde die nächste Änderung, die wir gemacht explodierenden das Build-Verzeichnis und Entfernen Submodule aus dem Core-System. Submodul Logik wurde nicht entfernt, sondern nur unsere Meta-Daten-Struktur geändert wurde. Dies wird die Abwärtskompatibilität für aktuelle Installationen.

Submodule in das Kernsystem verursacht ein paar Fragen, die wir brauchten, um zu lösen. Der erste Grund war die Performance. Jedes Mal, wenn Loader benötigt, um Abhängigkeiten zu berechnen, benötigt es um das Submodul / plugin Struktur der einzelnen Module zu Fuß. Dadurch Tausende Male wurde verletzt unsere Leistung während der Loader berechnen Routine. Durch das Entfernen von Unterstützung für Submodule in das Kernsystem wir gerettet Zehntausende von Funktionsaufrufen und Iterationen.

Loader wurde geändert, so dass, wenn ein use Eigenschaft in einem Modul-Metadaten definiert mehrere Module, wird es diese Module statt zu versuchen, das Original-Modul zu laden. Also, wenn Sie aufgefordert " dd würde "Loader inspizieren" dd "'s Meta-Daten und sehen eine Nutzung Eigenschaft, die ungefähr so aussieht:

     "Dd-DDM-base, dd-ddm, dd-DDM-drop, dd-ziehen, dd-proxy, dd-schränken, dd-drop, dd-blättern, dd-drop-plugin"

Im Kern YUI-Seed-Datei, sind wir auch mit, was wir fordern virtuellen Rollups oder Aliase. Diese Modul-Definitionen sind genau die gleichen wie die Meta-Daten in Loader. Auf diese Weise können auch alle Dateien aus unserer Abhängigkeit Konfigurator exportiert und noch mit diesen Rollups ohne Loader auf der Seite vorhanden. In zukünftigen Versionen werden wir Raffination dieser Ansatz sogar noch mehr.

Nach dieser Änderung haben wir dann voraus, um unser Build-Dateien explodieren. In früheren Versionen bestimmt die Submodule der Module Dateipfad. Zum Beispiel:

     "Dd": {
         "Submodule": {
             "Dd-ziehen": 
             / / Modul Daten
         }
     }

In 3.3.0, wenn Sie "dd" gebaut, sah die Dateistruktur etwas wie dieses:

     / Build / dd / dd-drag.js
     / Build / dd / dd-ddm.js
     / Build / dd / dd-drop.js

Mit dem Build-System in 3.4.0 explodierte, "dd" 's Build-Dateien nun wie folgt aussehen:

     / Build / dd-drag / dd-drag.js
     / Build / dd-ddm / dd-ddm.js
     / Build / dd-drop / dd-drop.js

Dies erlaubte uns, den "Weg"-Eigenschaft von allen unseren Modul Meta-Daten wie auch entfernen, wodurch die Dateigröße und die Verringerung der Logik müssen die Module url Wege zu montieren.

Wenn Sie auch eine vorkonfigurierte Kombination URL verwenden, müssen Sie eine erneute URL, wenn Sie aktualisieren.

Der Nachteil dieser Änderung ist, dass, wenn Sie mit einem Combo-URL von Modulen "prep" Ihrer Seite sind, können Sie nicht nur die Versionsnummer ändern und zu aktualisieren. Sie müssen erneut die Abhängigkeit Configurator und erzeugen eine neue URL mit neuen Modul-Struktur.

Die Zukunft

Ich werde weiter suchen, Refactoring und maximieren jeden Aspekt unseres Loader und Seed-Strategie. Diese ersten Schritte waren nötig, um in Zukunft Änderungen, die nicht nur für unsere Client-seitige Strategie, sondern auch unser Server, Kommandozeilen-und mobile Geräte Strategien sowie vorgenommen werden müssen helfen.

Share and erweitern: Lesezeichen mit del.icio.us | digg it! | reddit!

Noch keine Kommentare »

RSS-Feed für Kommentare zu diesem Beitrag. TrackBack URI

Leave a comment

Hinweis: Kommentare sind für Erstbesucher moderiert. Spam gelöscht.

XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Hosted by Yahoo!

Copyright © 2006-2011 Yahoo! Inc. Alle Rechte vorbehalten. Datenschutzbestimmungen - Nutzungsbedingungen

Präsentiert von WordPress auf Yahoo! Web Hosting .