2013-08-08 5 views
5

Im Moment entwickle ich ziemlich große und komplexe Webapp und habe mit einer großen Menge von Client-Seite Js-Code zu tun, und mein Leben leichter zu machen, ich versuche, diesen Code so viel zu entkoppeln so wie ich kann.Entkopplung zu komplex Javascript-Module

Ich wurde sehr inspiriert von Nicholas Zakas (http://www.youtube.com/watch?v=vXjVFPosQHw) und Addy Osmani (http://addyosmani.com/largescalejavascript) sprach über skalierbare js Architektur und versuchte, einige ihrer Ideen auf meine Arbeit anzuwenden.

Ich habe getrennt alle meine Code über die mehreren unabhängigen Modulen und behandeln alle Interkommunikation mit irgendeiner Art von Mediator. Dieser Ansatz funktionierte in den meisten Fällen sehr gut. Aber es gibt einige Fälle, in denen ich denke, ist nicht genug.

Eines der Module, an denen ich arbeite, repräsentiert eine ziemlich komplexe listenähnliche Struktur. Hier einige vereinfachtes Beispiel:

very simplified example

Neben einigen Rendering-Logik-Modul für dieses Stück Seite sollte behandeln:

  • Paginierung
  • Makeln Gruppen
  • bewegen elems und Gruppen um mit dnd
  • schneiden/kopieren/kleben elems und gruppen
  • erfrischend certaing Gruppen/elems
  • einige Logik innerhalb elems
  • mehr Sachen in der nächsten Zukunft sein können

Ich hatte alle nicht verwandte Logik durchgeführt, die ich (zB Bearbeitung könnte und Löschen von Logik erfolgt zu einem anderen Modul über Ereignisse), aber Modulgröße ist immer noch groß (über 1K Zeilen Code), und ich weiß nicht, wie man es reduziert. Außerdem verwende ich Modulmuster für meine Module, so dass es noch schwieriger ist, die Logik zwischen mehreren Dateien zu trennen.

So kam ich hier zu fragen, gibt es eine Möglichkeit, komplexe Logik in einem einzigen Modul zu entkoppeln?

UPDATE:

ich etwas klarstellen wollen. Ich bin ziemlich bewusst, wie ich Module ("Modul" aus einem Modulmuster) über mehrere Dateien in meinem Code trennen kann.

Aber was ich wirklich für die Suche ist die neue logische Art und Weise betrifft innerhalb eines einzelnen Moduls zu trennen („Modul“ von NKZ Präsentation).

+0

Ihre Frage ist ein bisschen vage, aber im Allgemeinen können Sie ein Modul wie ein Programm behandeln, und innerhalb der Wände des Moduls können Sie Untermodule, Klassen, Typen und reine Funktionen erstellen, um das Durcheinander zu reduzieren. in sich geschlossene Module sind typischerweise relativ teuer, aufgrund der verringerten internen Verfahrensrecycling; ex: ein eigenständiger Listensorter im Vergleich zu einem jQuery-Plugin. Module sind besser als Unordnung, also sind Sie auf dem richtigen Weg. Es ist wahrscheinlich erforderlich, dass Sie die Konzepte Dependency Injection und Inversion of Control beherrschen, um Ihr Scripting auf die nächste Stufe zu bringen. – dandavis

+0

Leute, die sich für dieses Thema interessieren, können sich [t3] (http://t3js.org/), ein kürzlich von Nicolas Zakas und seinem Team bei Box veröffentlichtes JS-Framework, ansehen, das direkt aus den in der Präsentation skizzierten Konzepten stammt in der Frage verknüpft. [Hier ist] (https://www.box.com/blog/introducing-t3-enciling-large-scale-javascript-applications/) ein Blogbeitrag von Zakas, der es einführt. – Nobita

+0

Hallo, das ist ein bisschen spät, aber könnte irgendwie hilfreich sein. https://pogsdotnet.blogspot.sg/2017/07/modular-javascript-architecture.html –

Antwort

1

Um ein einzelnes Modul in mehrere Dateien entkoppeln würde ich empfehlen die Augmentation Muster auf dieser Seite Zusätzlich hier http://www.adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html

gefunden verwenden, sind einige weitere Ressourcen auf skalierbare JS-Anwendungen zu erstellen:

Hier ist ein Video von eine Präsentation von Nicholas Zakas zum Thema "Erstellen einer skalierbaren JavaScript-Anwendungsarchitektur". http://www.youtube.com/watch?v=7BGvy-S-Iag

Eine weitere gute Ressource http://addyosmani.com/largescalejavascript/

diese Konzepte Wissen ermöglicht es Ihnen, eine Anwendung zu erstellen, die von Drop-Module in die und aus nahtlos fähig ist. Sie können ein Modul ändern, ohne ein anderes Modul zu beeinflussen, da Ihr Programm lose gekoppelt ist. Wenn Sie außerdem eine Basisbibliothek, z. B. KnockoutJS, auf Angular umstellen möchten, können Sie mit diesem Framework die Basisbibliothek einfach und ohne großen Bruch Ihres Codes austauschen.

Wenn Sie Module und einen Mediator oder eine Sandbox verwenden, wird der Code leichter zu testen sein. Testen ist in jeder nicht-trivialen Anwendung wichtig. Ich hoffe das hilft!

+0

Dank @Spencer. Zuerst war mir das Augmentierungsmuster bekannt, aber ich ziehe es vor, mich davon fern zu halten, weil ich einige der Merkmale des Modulmusters nicht nutzen kann. Zum Beispiel kann ich nicht wirklich privaten Spielraum für einige Var und Funktionen haben. Aber eigentlich kann ich mir keine bessere Lösung vorstellen, um ein Modul (aus einem Modulmuster) auf mehrere Dateien aufzuteilen. Zweitens habe ich bereits den Ansatz von Nicholas Zakas und Addy Osmani erwähnt, skalierbare js-Apps zu entwickeln, und ich nutze es bereits. – panfil

+1

Und der letzte. Knockout oder Angular werden mir natürlich das Leben erleichtern. Ein bisschen. Aber ein anderer cooler Rahmen wird das Problem einer großen Konzentration von Logik an einem Ort nicht lösen. – panfil

+0

Hoppla! Ich habe den Teil vermisst, in dem du gesagt hast, dass du die zwei Quellen, die ich zur Verfügung gestellt habe, gelesen hast! Leider ist mir keine bessere Möglichkeit bekannt, Module in andere Dateien aufzuteilen, als das Augmentationsmuster zu verwenden. – Spencer