Erstellen Sie eine lose gekoppelte & multi-page-JS-Anwendung mit Core(Mediator) / Sandbox(Fassade) / Modul-Muster — Beratung?
Baue ich eine multi-Seite-javascript-Anwendung. Ich habe viel gelesen in design-patterns und der Erstellung von Anwendungen mit einem Core - /Fassade - /Modul-Ansatz w/lose Kopplung (pub/sub Ritzen zu Veranstaltungen).
Habe ich ein ziemlich gutes system ausgearbeitet, das minimiert & vereint alle meine Modul-Dateien & Verwandte Abhängigkeiten in einer externen javascript-Datei bei der Bereitstellung. Minimierung der zusätzlichen HTTP-Anfragen für meine Anwendung ist ein design-Ziel -- also ich bin nicht allzu interessiert an der AMD (asynchronous module definition).
Ich bin mit den Richtlinien delinitated in Nicholas Zakas ' s Vortrag,
Scalable JavaScript Application Architecture
http://www.youtube.com/watch?v=vXjVFPosQHw
&&
Addy Osmani ist Patterns For Large-Scale JavaScript Application Architecture
http://addyosmani.com/largescalejavascript/
&&
Diese premium-Lernprogramm von Andrew Burgess von Nettuts, Schreiben Modulare JavaScript -
http://marketplace.tutsplus.com/item/writing-modular-javascript/128103/?ref=addyosmani&ref=addyosmani&clickthrough_id=90060087&redirect_back=true
Meine Frage, ist die Beratung auf, wie man über die Verwaltung von verschiedenen Seiten dieser Anwendung & Ihre zugehörigen Module. Ich bin auch mit Backbonejs Router-Klasse w/ballupton ist History.js Bibliothek zu manipulieren, die HTML5 history/Zustand-API und das dynamische laden von Seiten ohne refresh, während die Aufrechterhaltung der Abwärtskompatibilität für ältere Browser, die keine Unterstützung für die HTML-Status-API. Alle meine Seiten teilen sich eine gemeinsame code-Basis (single-minified & komprimierte js-Datei).
Hier ist ein überblick von der Struktur, die ich mir vorstelle in meiner Anwendung:
Es ist im wesentlichen ein hybrid-Ansatz. Die Obere Hälfte besteht aus einem Kern/Fassade/Modul-Muster mit diskreten Modulen, die nicht direkt interagieren mit einander und veröffentlichen/abonnieren von Benachrichtigungen über die Fassade.
Die untere Hälfte besteht aus meiner vorgeschlagenen Struktur Anwendung, die Sie informiert ein "main-controller", wenn der Staat/url-änderungen, die Haupt-controller führt alle globalen Operationen (z.B. initialisieren der header & sidebar-Menü von meinem UI, wenn nicht bereits initialisiert ist) und weist den relevanten sub-control zu betreiben es init () - Methode (genauso wie der Aufruf von destroy(); auf jedem controller, der zuvor geladen wurde). Jeder sub-controller (entspricht ex: home-Seite, Kalender-Seite, reservations-Seite, etc.) cherry-picks Module aus dem pool der zur Verfügung stehenden Module und initialisiert Sie.
Ist das ein guter Ansatz oder bin ich da auf einem schlechten Weg? Ich kann sehen, sind noch die Module unabhängig von einander, was eine gute Skalierbarkeit.
Habe ich auch als nur die Behandlung der Router & Controller als separate Module und mit Ihnen zu veröffentlichen - /abonnieren-um den Kern, und jeder controller irgendwie initialisiert die notwendigen Module, die es braucht für seine Seite.
- Ihr argument für die Verwendung von AMD zu Modularisieren Ihre Anwendung ist fehlerhaft; verwenden des r.js Optimierer ist es trivial, erstellen Sie ein einzelnes Paket aus, um Ihre Module, wenn Sie, zum Beispiel, requirejs während der Optimierungs-phase.
- Neue Konzepte, die wir derzeit verwenden, um meine Antwort.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eine Sache, die wir getan haben, um zu halten die Geschichte reibungslos funktioniert, wurde zunächst die änderung der URL. Bei änderung der URL ein Ereignis hätte ausgelöst werden, der router würde die url analysiert, dann herauszufinden, was zu tun ist. In diesem Fall würde automatisch ausgelöst, die beim laden der Seite als auch. Wenn Sie auf einen link geklickt, es würde ändern Sie einfach die URL, die ist ziemlich einfach und vollständig entkoppelt links/buttons aus der Anwendungslogik. Dies schien zu funktionieren gut für unsere Anwendung. Wir verwendet JQM, aber wir ließen die meisten Ihren router, da Lesen wir die meisten unserer Instruktionen von einigen XML-Datei und nicht ein Haufen von HTML-Seiten laden, in dem hauptansichtsfenster Bereich.
Habe ich oft gesehen, backbone-Anwendungen benutze den router als Kern/Vermittler. Das ist eine gute Idee. Sie können hören Sie einfach auf change-Ereignisse für die URL, und ändern Sie dann die Seite entsprechend. Dieser Vermittler muss wohl ein singleton, obwohl singletons sind schwerer zu unit-test.
Die Sache, die ich nicht unbedingt einer Meinung mit Rückgrat war seine definition von "Ansichten". Die Ansicht irgendwie scheint eine Aktion in einem controller (auch aus einigen Perspektiven). Wir Hinzugefügt eine weitere Stufe der Trennung in unserer Anwendung an diesem Punkt. Unsere Meinung ajax-Anfragen-Vorlage-Dateien, die gefüllt waren mit einigen JSON und handlebars.js. Ich würde sagen, dein header/sidebar sollte nur auf Vorlagen. Wenn Sie aktualisieren müssen Sie dann sehen, wie Sie tun könnte extrem einfach anders Ihr schaut auf die Schaffung von 4 neuen Module: Sammlung für eine Liste, Modell für jedes Element, collection view-und model-Ansicht. Ich würde paar Vorlagen mehr eng mit einigen der höheren Ebene anzeigen, bis Sie müssen weiter unterteilt werden, (zB. einige "Application/Main View").
Dass diese Vorlage Schicht ermöglicht es Ihnen, änderungen an der Oberfläche, ohne neu zu kompilieren, das ist schön. Jederzeit können Sie die Dinge in die "meta" es ist ein Gewinn (auch wenn es erfordert, dass Sie zum Lesen von XML (ha)). Als bonus kann man dann den cache der Vorlage separat als gut (oder cache-Büste, es separat für diese Angelegenheit).
Ihre Architektur scheint gut, obwohl, und ist ein Gültiger Ansatz für Ihr problem. Ein Tipp, den ich geben würde ist, dass Sie nicht über design-up-front. Iteration ist am besten. Sie müssen umgestalten. Es ist unmöglich vorauszusehen, was wäre Ihre Anwendung mehr reibungslos fließen 3-6 Monate im Voraus.
Update am Dez 18th, 2013
Nun wird ein Tag sind wir mit marionette und mehr addy osmani tricks. Auf der Oberseite der oben genannten Elemente, wir sind mit der AMD-Alternative format:
Sind wir auch mit der marionette Anwendung der Klasse in Verbindung mit wreqr die eine Anforderung/Antwort-Schicht. Diese können Breite Anwendung Objekte sauber. Es erlaubt uns auch Klassen definieren, ohne explizit den Namen der Klasse. Dies ist ein ziemlich guter Weg, um in der sandbox. EG:
Dies alles scheint zu funktionieren ziemlich gut.
Sollten Sie auch Kasse aura js-und web-Komponenten. Unsere directory-Struktur, die Art der mimik/rechnet diese Konzepte, ohne in Sie investieren noch.
Ich denke, es ist ein guter Ansatz.
Ich habe die Entwicklung etwas ähnliches in 2 großen kommerziellen web-apps (minus Rückgrat, und mit einer benutzerdefinierten history manager) und es funktioniert Super. Ich bin auch nicht mit AMD und alle Interaktionen werden von pub/sub.
Einer meiner besten Inspirationen (die ich bin sicher, Sie bereits wissen) ist: https://github.com/aurajs/aura