Problem
Na tę odpowiedź udzielono już wcześniej odpowiedzi, ale są one stare i nieaktualne. Mam ponad 2000 wierszy kodu w jednym pliku i, jak wszyscy wiemy, jest to zła praktyka, zwłaszcza gdy przeglądam kod lub dodam nowe funkcje. Chcę lepiej zorganizować swój kod, teraz i na przyszłość.
Powinienem wspomnieć, że buduję narzędzie (nie prostą stronę internetową) z wieloma przyciskami, elementami UI, przeciąganiem, upuszczaniem, odbiornikami / obsługą akcji i funkcją w zakresie globalnym, w którym kilku słuchaczy może używać tej samej funkcji.
Przykładowy kod
$('#button1').on('click', function(e){
// Determined action.
update_html();
});
... // Around 75 more of this
function update_html(){ .... }
...
Wniosek
Naprawdę muszę zorganizować ten kod, aby jak najlepiej go używać i nie powtarzać samego siebie i móc dodawać nowe funkcje i aktualizować stare. Będę nad tym pracował sam. Niektóre selektory mogą składać się ze 100 linii kodu, inne to 1. Przyjrzałem się temu trochę require.js
i stwierdziłem, że jest to trochę powtarzalne i faktycznie piszę więcej kodu niż potrzeba. Jestem otwarty na wszelkie możliwe rozwiązania spełniające te kryteria, a link do zasobów / przykładów jest zawsze na plus.
Dzięki.
Odpowiedzi:
Omówię kilka prostych rzeczy, które mogą ci pomóc lub nie. Niektóre mogą być oczywiste, inne mogą być niezwykle tajemnicze.
Krok 1: Rozmieść swój kod
Rozdzielenie kodu na wiele modułowych jednostek to bardzo dobry pierwszy krok. Zbierz to, co działa „razem” i umieść je w ich małych, zamkniętych jednostkach. nie martw się na razie o format, zachowaj go w tekście. Struktura jest późniejszym punktem.
Załóżmy więc, że masz taką stronę:
Miałoby sens, aby podzielić na przedziały, tak aby wszystkie związane z nagłówkami programy obsługi zdarzeń / segregatory były tam, dla ułatwienia konserwacji (i bez konieczności przesiewania przez 1000 wierszy).
Następnie możesz użyć narzędzia takiego jak Grunt, aby przebudować JS z powrotem do pojedynczej jednostki.
Krok 1a: Zarządzanie zależnościami
Użyj biblioteki, takiej jak RequireJS lub CommonJS, aby zaimplementować coś, co nazywa się AMD . Asynchroniczne ładowanie modułu umożliwia jawne określenie, od czego zależy Twój kod, co następnie umożliwia odciążenie wywołania biblioteki do kodu. Możesz po prostu powiedzieć „To potrzebuje jQuery”, a AMD załaduje je i wykona kod, gdy jQuery będzie dostępne .
Ma to również ukryty klejnot: ładowanie biblioteki nastąpi w momencie, gdy DOM będzie gotowy, a nie wcześniej. To już nie zatrzymuje ładowania Twojej strony!
Krok 2: Modularyzacja
Widzisz szkielet? Mam dwie jednostki reklamowe. Najprawdopodobniej będą mieć wspólne słuchacze wydarzeń.
Twoim zadaniem na tym etapie jest zidentyfikowanie punktów powtórzeń w kodzie i próba zsyntetyzowania tego wszystkiego w moduły . Moduły będą teraz obejmować wszystko. Będziemy dzielić rzeczy w trakcie.
Cała idea tego kroku polega na przejściu od kroku 1 i usunięciu wszystkich kopiowanych makaronów, aby zastąpić je jednostkami, które są luźno powiązane. Więc zamiast mieć:
ad_unit1.js
ad_unit2.js
Będę miał:
ad_unit.js
:page.js
:Co pozwala ci na oddzielenie wydarzeń od twoich znaczników, a także pozbycie się powtórzeń. To całkiem przyzwoity krok, który później rozszerzymy.
Krok 3: Wybierz ramy!
Jeśli chcesz jeszcze bardziej zmodularyzować i zmniejszyć liczbę powtórzeń, istnieje kilka niesamowitych frameworków, które implementują podejścia MVC (Model - Widok - Kontroler). Moim ulubionym jest Backbone / Spine, ale jest też Angular, Yii, ... Lista jest długa.
Model przedstawia swoje dane.
Zobacz reprezentuje Mark-up i wszystkie zdarzenia związane z nim
Controller reprezentuje logikę biznesową - innymi słowy, regulator mówi strony co do obciążenia i poglądy, co do korzystania z modeli.
Będzie to znaczący krok do nauki, ale nagroda jest tego warta: preferuje czysty, modułowy kod zamiast spaghetti.
Jest wiele innych rzeczy, które możesz zrobić, to tylko wskazówki i pomysły.
Zmiany specyficzne dla kodu
Oto kilka konkretnych ulepszeń kodu:
Jest to lepiej napisane jako:
Wcześniej w kodzie:
Nagle masz sposób na utworzenie standardowej warstwy z dowolnego miejsca w kodzie bez wklejania kopii. Robisz to w pięciu różnych miejscach. Właśnie uratowałem ci pięć pasty do kopiowania.
Jeszcze jeden:
// Opakowanie zestawu reguł dla akcji
Jest to bardzo skuteczny sposób rejestrowania reguł, jeśli masz zdarzenia, które nie są standardowe lub zdarzenia tworzenia. Jest to również naprawdę niesamowite w połączeniu z systemem powiadomień pub / sub oraz w przypadku powiązania z wydarzeniem, które uruchamiasz za każdym razem, gdy tworzysz elementy. Fire'n'forget modułowe wiązanie wydarzeń!
źródło
View
. Więc. Jak to nie dotyczy Twojego kodu?layers.js
,sidebar.js
,global_events.js
,resources.js
,files.js
,dialog.js
jeśli tylko będzie się podzielić swój kod. Użyj,grunt
aby przebudować je w jeden orazGoogle Closure Compiler
skompilować i zminimalizować.Oto prosty sposób na podzielenie aktualnej bazy kodu na wiele plików przy użyciu require.js. Pokażę ci, jak podzielić kod na dwa pliki. Dodanie większej liczby plików będzie później proste.
Krok 1) U góry kodu utwórz obiekt aplikacji (lub dowolną nazwę, na przykład MyGame):
var App = {}
Krok 2) Przekonwertuj wszystkie zmienne i funkcje najwyższego poziomu, aby należały do obiektu aplikacji.
Zamiast:
var selected_layer = "";
Chcesz:
App.selected_layer = "";
Zamiast:
Chcesz:
Zwróć uwagę, że w tym momencie kod nie będzie działał, dopóki nie wykonasz następnego kroku.
Krok 3) Przekonwertuj wszystkie globalne odwołania do zmiennych i funkcji, aby przejść przez aplikację.
Zmień rzeczy, takie jak:
do:
i:
do:
Krok 4) Przetestuj swój kod na tym etapie - wszystko powinno działać. Prawdopodobnie na początku pojawi się kilka błędów, ponieważ coś przeoczyłeś, więc napraw je, zanim przejdziesz dalej.
Krok 5) Skonfiguruj requirejs. Zakładam, że masz stronę internetową obsługiwaną z serwera WWW, której kod znajduje się w:
i jQuery w
Jeśli te ścieżki nie są dokładnie takie , jak te, poniższe nie będą działać i będziesz musiał je zmodyfikować.
Pobierz requirejs i umieść require.js w swoim
www/js
katalogu.w swoim
page.html
, usuń wszystkie tagi script i wstaw tag script, na przykład:twórz
www/js/main.js
z zawartością:następnie umieść cały kod, który właśnie naprawiłeś w krokach 1-3 (którego jedyną zmienną globalną powinna być aplikacja) w:
Na samej górze tego pliku umieść:
Na dole umieść:
Następnie załaduj page.html w swojej przeglądarce. Twoja aplikacja powinna działać!
Krok 6) Utwórz kolejny plik
Tutaj Twoja praca się opłaca, możesz to robić w kółko.
Wyciągnij kod z
www/js/app.js
odwołań do $ i App.na przykład
Włóż to
www/js/foo.js
Na samej górze tego pliku umieść:
Na dole umieść:
Następnie zmień ostatnią linię www / js / main.js na:
Otóż to! Zrób to za każdym razem, gdy chcesz umieścić kod we własnym pliku!
źródło
r.js
preprocesora. Co więcej, tak naprawdę nie rozwiązałeś problemu PO - przekazałeś tylko ogólnerequire.js
instrukcje.Jeśli chodzi o twoje pytanie i komentarze, zakładam, że nie chcesz przenosić swojego kodu do frameworka takiego jak Backbone, ani używać biblioteki ładującej, takiej jak Require. Chcesz po prostu lepszego sposobu zorganizowania kodu, który już masz, w najprostszy możliwy sposób.
Rozumiem, że irytujące jest przewijanie ponad 2000 wierszy kodu w celu znalezienia sekcji, nad którą chcesz popracować. Rozwiązaniem jest podzielenie kodu na różne pliki, po jednym dla każdej funkcji. Na przykład
sidebar.js
,canvas.js
itd. Następnie można połączyć je ze sobą do produkcji za pomocą Grunt wraz z Usemin można mieć coś takiego:W Twoim html:
W Twoim Gruntfile:
Jeśli chcesz używać Yeoman, otrzymasz standardowy kod do tego wszystkiego.
Następnie dla każdego pliku musisz upewnić się, że postępujesz zgodnie z najlepszymi praktykami i że cały kod i zmienne znajdują się w tym pliku i nie są zależne od innych plików. Nie oznacza to, że nie można wywoływać funkcji jednego pliku z drugiego, chodzi o to, aby zmienne i funkcje były hermetyzowane. Coś podobnego do przestrzeni nazw. Zakładam, że nie chcesz przenosić całego kodu, aby był zorientowany obiektowo, ale jeśli nie masz nic przeciwko nieco refaktoryzacji, polecam dodanie czegoś równoważnego z tak zwanym wzorcem modułu. Wygląda mniej więcej tak:
sidebar.js
Następnie możesz załadować ten fragment kodu w następujący sposób:
Pozwoli ci to mieć znacznie łatwiejszy w utrzymaniu kod bez konieczności zbytniego przepisywania kodu.
źródło
#sidebar #sortable
. Równie dobrze możesz zaoszczędzić sobie pamięci, po prostu wstawiając kod i zapisując dwa IETF.Użyj javascript MVC Framework, aby uporządkować kod javascript w standardowy sposób.
Najlepsze dostępne frameworki JavaScript MVC to:
Wybór frameworka JavaScript MVC wymagał uwzględnienia wielu czynników. Przeczytaj następujący artykuł porównawczy, który pomoże Ci wybrać najlepsze ramy na podstawie czynników ważnych dla Twojego projektu: http://sporto.github.io/blog/2013/04/12/comparison-angular-backbone-can-ember/
Możesz również użyć RequireJS z frameworkiem do obsługi ładowania plików i modułów Asynchrounous js.
Spójrz poniżej, aby rozpocząć ładowanie modułu JS:
http://www.sitepoint.com/understanding-requirejs-for-effective-javascript-module-loading/
źródło
Kategoryzuj swój kod. Ta metoda bardzo mi pomaga i działa z każdym frameworkiem js:
W preferowanym edytorze (najlepszym jest Komodo Edit) możesz złożyć, zwijając wszystkie wpisy, a zobaczysz tylko tytuły:
źródło
Sugerowałbym:
W twoim przypadku Jessica podziel interfejs na strony lub ekrany. Strony lub ekrany mogą być obiektami i rozszerzyć je z niektórych klas nadrzędnych. Zarządzaj interakcjami między stronami za pomocą klasy PageManager.
źródło
Sugeruję użycie czegoś takiego jak Backbone. Backbone to biblioteka javascript obsługiwana przez RESTFUL. Ik sprawia, że twój kod jest czystszy i bardziej czytelny, a także jest potężny, gdy jest używany razem z requirejs.
http://backbonejs.org/
http://requirejs.org/
Backbone nie jest prawdziwą biblioteką. Ma na celu nadanie struktury kodowi javascript. Może zawierać inne biblioteki, takie jak jquery, jquery-ui, google-maps itp. Backbone jest moim zdaniem najbliższym javascriptowym podejściem do struktur Object Oriented i Model View Controller.
Także jeśli chodzi o przepływ pracy. Jeśli budujesz swoje aplikacje w PHP, korzystaj z biblioteki Laravel. Będzie działać bezbłędnie z Backbone, gdy będzie używany z zasadą RESTfull. Poniżej link do Laravel Framework i tutorial o budowaniu RESTfull API:
http://maxoffsky.com/code-blog/building-restful-api-in-laravel-start-here/
http://laravel.com/
Poniżej znajduje się samouczek z nettuts. Nettuts ma wiele samouczków wysokiej jakości:
http://net.tutsplus.com/tutorials/javascript-ajax/understanding-backbone-js-and-the-server/
źródło
Może nadszedł czas, abyś zaczął wdrażać cały proces tworzenia oprogramowania przy użyciu takich narzędzi, jak yeoman http://yeoman.io/ . Pomoże to kontrolować wszystkie zależności, proces kompilacji i, jeśli chcesz, automatyczne testowanie. Na początek jest to dużo pracy, ale po wdrożeniu zmiany w przyszłości będą znacznie łatwiejsze.
źródło