Das Problem
Diese Antwort wurde bereits beantwortet, ist jedoch alt und nicht aktuell. Ich habe über 2000 Codezeilen in einer einzigen Datei, und wie wir alle wissen, ist dies eine schlechte Praxis, insbesondere wenn ich Code durchschaue oder neue Funktionen hinzufüge. Ich möchte meinen Code jetzt und für die Zukunft besser organisieren.
Ich sollte erwähnen, dass ich ein Tool (keine einfache Website) mit vielen Schaltflächen, UI-Elementen, Drag & Drop, Aktionslistenern / -handlern und Funktionen im globalen Bereich erstelle, in dem mehrere Listener möglicherweise dieselbe Funktion verwenden.
Beispielcode
$('#button1').on('click', function(e){
// Determined action.
update_html();
});
... // Around 75 more of this
function update_html(){ .... }
...
Fazit
Ich muss diesen Code wirklich für die beste Verwendung organisieren und mich nicht wiederholen und in der Lage sein, neue Funktionen hinzuzufügen und alte zu aktualisieren. Ich werde alleine daran arbeiten. Einige Selektoren können 100 Codezeilen sein, andere sind 1. Ich habe ein bisschen require.js
nachgesehen und festgestellt, dass es sich irgendwie wiederholt und tatsächlich mehr Code als nötig schreibt. Ich bin offen für jede mögliche Lösung, die diesen Kriterien entspricht, und Links zu Ressourcen / Beispielen sind immer von Vorteil.
Vielen Dank.
Antworten:
Ich werde einige einfache Dinge durchgehen, die Ihnen vielleicht helfen oder auch nicht. Einige könnten offensichtlich sein, andere könnten extrem arkan sein.
Schritt 1: Unterteilen Sie Ihren Code
Die Aufteilung Ihres Codes in mehrere modulare Einheiten ist ein sehr guter erster Schritt. Runden Sie ab, was "zusammen" funktioniert, und legen Sie sie in eine eigene kleine Einheit. Mach dir vorerst keine Sorgen um das Format, halte es inline. Die Struktur ist ein späterer Punkt.
Angenommen, Sie haben eine Seite wie diese:
Es wäre sinnvoll, eine Unterteilung vorzunehmen, damit alle Header-bezogenen Ereignishandler / -binder vorhanden sind, um die Wartung zu vereinfachen (und nicht 1000 Zeilen durchsuchen zu müssen).
Sie können dann ein Tool wie Grunt verwenden, um Ihr JS wieder zu einer einzigen Einheit zusammenzusetzen.
Schritt 1a: Abhängigkeitsmanagement
Verwenden Sie eine Bibliothek wie RequireJS oder CommonJS, um etwas namens AMD zu implementieren . Durch das Laden des asynchronen Moduls können Sie explizit angeben, wovon Ihr Code abhängt, und dann den Bibliotheksaufruf in den Code auslagern. Sie können einfach wörtlich "Dies benötigt jQuery" sagen und der AMD lädt es und führt Ihren Code aus, wenn jQuery verfügbar ist .
Dies hat auch ein verstecktes Juwel: Das Laden der Bibliothek erfolgt in der Sekunde, in der das DOM bereit ist, nicht vorher. Dadurch wird das Laden Ihrer Seite nicht mehr angehalten!
Schritt 2: Modularisieren
Sehen Sie das Drahtmodell? Ich habe zwei Anzeigenblöcke. Sie werden höchstwahrscheinlich gemeinsame Ereignis-Listener haben.
Ihre Aufgabe in diesem Schritt ist es, die Wiederholungspunkte in Ihrem Code zu identifizieren und zu versuchen, all dies zu Modulen zusammenzufassen . Module werden im Moment alles umfassen. Wir werden Sachen aufteilen, wenn wir weitergehen.
Die ganze Idee dieses Schritts besteht darin, von Schritt 1 aus alle Kopiernudeln zu löschen, um sie durch lose gekoppelte Einheiten zu ersetzen. Also, anstatt zu haben:
ad_unit1.js
ad_unit2.js
Ich werde haben:
ad_unit.js
::page.js
::Dies ermöglicht es Ihnen, zwischen Ihren Ereignissen und Ihrem Markup zu unterteilen und Wiederholungen zu vermeiden. Dies ist ein ziemlich anständiger Schritt und wir werden ihn später weiter ausbauen.
Schritt 3: Wählen Sie ein Framework!
Wenn Sie Wiederholungen noch weiter modularisieren und reduzieren möchten, gibt es eine Reihe großartiger Frameworks, die MVC-Ansätze (Model - View - Controller) implementieren. Mein Favorit ist Backbone / Spine, aber es gibt auch Angular, Yii, ... Die Liste geht weiter.
Ein Modell repräsentiert Ihre Daten.
Eine Ansicht repräsentiert Ihr Markup und alle damit verbundenen Ereignisse
Ein Controller repräsentiert Ihre Geschäftslogik. Mit anderen Worten, der Controller teilt der Seite mit, welche Ansichten geladen und welche Modelle verwendet werden sollen.
Dies wird ein bedeutender Lernschritt sein, aber der Preis ist es wert: Er bevorzugt sauberen, modularen Code gegenüber Spaghetti.
Es gibt viele andere Dinge, die Sie tun können, das sind nur Richtlinien und Ideen.
Code-spezifische Änderungen
Hier sind einige spezifische Verbesserungen an Ihrem Code:
Dies ist besser geschrieben als:
Früher in Ihrem Code:
Plötzlich haben Sie die Möglichkeit, von überall in Ihrem Code eine Standardebene zu erstellen, ohne sie einzufügen. Du machst das an fünf verschiedenen Orten. Ich habe dir gerade fünf Kopierpasten gespeichert.
Einer noch:
// Regelsatz-Wrapper für Aktionen
Dies ist eine sehr wirksame Methode, um Regeln zu registrieren, wenn Sie Ereignisse haben, die nicht Standard sind, oder Erstellungsereignisse. Dies ist auch in Kombination mit einem Pub / Sub-Benachrichtigungssystem und wenn es an ein Ereignis gebunden ist, das Sie auslösen, wenn Sie Elemente erstellen, ein echter Kick-Ass. Fire'n'forget modulare Ereignisbindung!
quelle
View
. So. Wie trifft dies nicht auf Ihren Code zu?layers.js
,sidebar.js
,global_events.js
,resources.js
,files.js
,dialog.js
wenn Sie nur den Code gehen aufzuteilen. Verwenden Siegrunt
diese Option , um sie zu einer zusammenzustellen undGoogle Closure Compiler
zu kompilieren und zu minimieren.Hier ist eine einfache Möglichkeit, Ihre aktuelle Codebasis mithilfe von require.js in mehrere Dateien aufzuteilen. Ich werde Ihnen zeigen, wie Sie Ihren Code in zwei Dateien aufteilen. Das Hinzufügen weiterer Dateien ist danach unkompliziert.
Schritt 1) Erstellen Sie oben in Ihrem Code ein App-Objekt (oder einen beliebigen Namen wie MyGame):
var App = {}
Schritt 2) Konvertieren Sie alle Variablen und Funktionen der obersten Ebene so, dass sie zum App-Objekt gehören.
Anstatt:
var selected_layer = "";
Sie wollen:
App.selected_layer = "";
Anstatt:
Sie wollen:
Beachten Sie, dass Ihr Code zu diesem Zeitpunkt erst funktioniert, wenn Sie den nächsten Schritt abgeschlossen haben.
Schritt 3) Konvertieren Sie alle globalen Variablen- und Funktionsreferenzen, um die App zu durchlaufen.
Ändere Sachen wie:
zu:
und:
zu:
Schritt 4) Testen Sie Ihren Code zu diesem Zeitpunkt - alles sollte funktionieren. Sie werden wahrscheinlich zuerst ein paar Fehler bekommen, weil Sie etwas verpasst haben, also beheben Sie diese, bevor Sie fortfahren.
Schritt 5) Richten Sie requirejs ein. Ich gehe davon aus, dass Sie eine Webseite haben, die von einem Webserver bereitgestellt wird, dessen Code sich in:
und jquery in
Wenn diese Pfade nicht genau so sind , funktioniert das Folgende nicht und Sie müssen die Pfade ändern.
Laden Sie requirejs herunter und legen Sie require.js in Ihrem
www/js
Verzeichnis ab.page.html
Löschen Sie in Ihrem Skript alle Skript-Tags und fügen Sie ein Skript-Tag wie folgt ein:www/js/main.js
Mit Inhalten erstellen :Fügen Sie dann den gesamten Code, den Sie gerade in den Schritten 1 bis 3 repariert haben (dessen einzige globale Variable App sein sollte) in Folgendes ein:
Fügen Sie ganz oben in dieser Datei Folgendes ein:
Unten setzen:
Laden Sie dann page.html in Ihren Browser. Ihre App sollte funktionieren!
Schritt 6) Erstellen Sie eine weitere Datei
Hier zahlt sich Ihre Arbeit aus, das können Sie immer wieder tun.
Ziehen Sie einen Code aus
www/js/app.js
den Referenzen $ und App heraus.z.B
Steck es rein
www/js/foo.js
Fügen Sie ganz oben in dieser Datei Folgendes ein:
Unten setzen:
Ändern Sie dann die letzte Zeile von www / js / main.js in:
Das ist es! Tun Sie dies jedes Mal, wenn Sie Code in eine eigene Datei einfügen möchten!
quelle
r.js
Präprozessor nicht verwenden . Darüber hinaus haben Sie das Problem des OP nicht wirklich angesprochen - lediglich ein allgemeinesrequire.js
Howto bereitgestellt.Bei Ihren Fragen und Kommentaren gehe ich davon aus, dass Sie nicht bereit sind, Ihren Code auf ein Framework wie Backbone zu portieren oder eine Loader-Bibliothek wie Require zu verwenden. Sie möchten nur einen besseren Weg finden, um den Code, den Sie bereits haben, auf einfachste Weise zu organisieren.
Ich verstehe, dass es ärgerlich ist, durch mehr als 2000 Codezeilen zu scrollen, um den Abschnitt zu finden, an dem Sie arbeiten möchten. Die Lösung besteht darin, Ihren Code in verschiedene Dateien aufzuteilen, eine für jede Funktionalität. Zum Beispiel
sidebar.js
,canvas.js
usw. Dann können Sie sie zusammen für die Produktion mit Grunt verbinden, zusammen mit Usemin Sie etwas davon haben können:In Ihrem HTML:
In deinem Gruntfile:
Wenn Sie Yeoman verwenden möchten, erhalten Sie einen Boilerplate-Code für all dies.
Dann müssen Sie für jede Datei selbst sicherstellen, dass Sie die Best Practices befolgen und dass sich der gesamte Code und die Variablen in dieser Datei befinden und nicht von anderen Dateien abhängen. Dies bedeutet nicht, dass Sie keine Funktionen einer Datei aus einer anderen aufrufen können. Es geht darum, Variablen und Funktionen zu kapseln. Ähnlich wie beim Namespace. Ich gehe davon aus, dass Sie nicht Ihren gesamten Code objektorientiert portieren möchten, aber wenn es Ihnen nichts ausmacht, ein wenig umzugestalten, würde ich empfehlen, etwas hinzuzufügen, das dem sogenannten Modulmuster entspricht. Es sieht ungefähr so aus:
sidebar.js
Dann können Sie diesen Code wie folgt laden:
Auf diese Weise können Sie einen viel besser wartbaren Code erhalten, ohne Ihren Code zu viel umschreiben zu müssen.
quelle
#sidebar #sortable
. Sie können sich auch Speicherplatz sparen, indem Sie einfach den Code einfügen und die beiden IETFs speichern.Verwenden Sie Javascript MVC Framework, um den Javascript-Code auf standardmäßige Weise zu organisieren.
Die besten verfügbaren JavaScript MVC-Frameworks sind:
Die Auswahl eines JavaScript-MVC-Frameworks erforderte so viele Faktoren, die berücksichtigt werden mussten. Lesen Sie den folgenden Vergleichsartikel, der Ihnen bei der Auswahl des besten Frameworks anhand der für Ihr Projekt wichtigen Faktoren hilft: http://sporto.github.io/blog/2013/04/12/comparison-angular-backbone-can-ember/
Sie können RequireJS auch mit dem Framework verwenden, um das Laden von asynchronen js-Dateien und -Modulen zu unterstützen.
Sehen Sie sich das Folgende an, um mit dem Laden des JS-Moduls zu beginnen:
http://www.sitepoint.com/understanding-requirejs-for-effective-javascript-module-loading/
quelle
Kategorisieren Sie Ihren Code. Diese Methode hilft mir sehr und funktioniert mit jedem js-Framework:
In Ihrem bevorzugten Editor (der beste ist Komodo Edit) können Sie alle Einträge reduzieren, und Sie sehen nur die Titel:
quelle
Ich würde vorschlagen:
Teilen Sie in Ihrem Fall Jessica die Benutzeroberfläche in Seiten oder Bildschirme. Seiten oder Bildschirme können Objekte sein und von einigen übergeordneten Klassen erweitert werden. Verwalten Sie die Interaktionen zwischen Seiten mit einer PageManager-Klasse.
quelle
Ich schlage vor, dass Sie so etwas wie Backbone verwenden. Backbone ist eine von RESTFUL unterstützte Javascript-Bibliothek. Ik macht Ihren Code sauberer und lesbarer und ist leistungsstark, wenn es zusammen mit requirejs verwendet wird.
http://backbonejs.org/
http://requirejs.org/
Backbone ist keine echte Bibliothek. Es soll Ihrem Javascript-Code Struktur verleihen. Es ist in der Lage, andere Bibliotheken wie jquery, jquery-ui, google-maps usw. einzuschließen. Backbone ist meiner Meinung nach der nächstgelegene Javascript-Ansatz für objektorientierte und Model View Controller-Strukturen.
Auch in Bezug auf Ihren Workflow. Wenn Sie Ihre Anwendungen in PHP erstellen, verwenden Sie die Laravel-Bibliothek. Mit Backbone funktioniert es einwandfrei, wenn es mit dem RESTfull-Prinzip verwendet wird. Unter dem Link zu Laravel Framework und einem Tutorial zum Erstellen von RESTfull-APIs:
http://maxoffsky.com/code-blog/building-restful-api-in-laravel-start-here/
http://laravel.com/
Unten ist ein Tutorial von Nettuts. Nettuts hat viele hochwertige Tutorials:
http://net.tutsplus.com/tutorials/javascript-ajax/understanding-backbone-js-and-the-server/
quelle
Vielleicht ist es an der Zeit, einen vollständigen Entwicklungsworkflow mit Tools wie yeoman http://yeoman.io/ zu implementieren . Auf diese Weise können Sie alle Ihre Abhängigkeiten, den Erstellungsprozess und, falls gewünscht, automatisierte Tests steuern. Es ist zunächst viel Arbeit, aber sobald es implementiert ist, werden zukünftige Änderungen viel einfacher.
quelle