Jaki typ struktury folderów powinien być używany w Angular 2?

134

Jestem programistą Angular 1 i zaczynam uczyć się o Angular 2. Istnieje wiele różnych metod tworzenia struktury folderów w zależności od materiału szkoleniowego. Wymienię każdą z nich poniżej i chciałbym poznać opinie ludzi, z których powinienem skorzystać i dlaczego. Ponadto, jeśli istnieje metoda, której nie ma na liście, ale uważasz, że działa lepiej, możesz ją również wymienić.

Patrząc na to wszystko, metoda nr 3 jest mniej więcej taka, jak robiłem aplikacje w Angular 1.

Metoda 1: angular2-quickstart

Źródło: https://angular.io/guide/quickstart

Struktura folderów:

wprowadź opis obrazu tutaj

Metoda 2: ng-book2

Źródło: https://www.ng-book.com/2/ (aby zobaczyć pliki trzeba zapłacić)

Struktura folderów:

wprowadź opis obrazu tutaj

Metoda 3: mgechev / angular2-seed

Źródło: https://github.com/mgechev/angular2-seed

Struktura folderów:

wprowadź opis obrazu tutaj

Marin Petkov
źródło
1
Uważam, że metoda 2 jest najbardziej wydajna, ponieważ wszystkie komponenty, usługi itp. Powinny być przechowywane w osobnych folderach, aby ułatwić późniejsze wyszukiwanie plików. Jest to najbardziej wydajna metoda w bardzo złożonej aplikacji.
Bryan,
Dzięki za odpowiedź @Bryan, jak myślisz, jaki jest powód dla folderu typings? Żadna z pozostałych 2 metod jej nie używa. Czy masz również opinię na temat pliku app.ts i main.ts w przypadku pliku głównego?
Marin Petkov
Więc ziarno, z którego ostatnio korzystałem, trafiło do przewodnika po stylu, którym jest tutaj method3. Nie wiem, jak to się skaluje i dlaczego istnieje udostępniony folder? Czy nie jest to cały punkt tego frameworka, aby każdy komponent / dyrektywa / potok / usługa mogła być współużytkowana przez każdego? Trudno mi zrozumieć, jak łatwo znaleźć dyrektywy / potoki… z formatem przewodnika po stylach musisz po prostu wiedzieć, gdzie się on znajduje, lub szukać w każdym folderze tej jednej usługi, o której myślałeś, że będziesz używać tylko dla klientów, a teraz ty potrzebuję go do innych rzeczy.
Gary
1
@Gary - Moje zdanie na temat folderu współdzielonego dla siewnika jest takie, że wszystko, co jest udostępnione, może być używane w klasach, które znajdują się na tym samym poziomie folderu lub w dowolnych podfolderach. Czy możesz używać dowolnej klasy w dowolnym miejscu? Jasne, że możesz, ale gdy ktoś nowy spojrzy na twój kod, nie będzie wiedział, co się dzieje. Umieszczając klasy, które są używane między różnymi komponentami / folderami wewnątrz udostępnionych, wyraźnie informuje programistę, że są używane w wielu miejscach.
Marin Petkov
1
Nasz zespół niedawno przeszedł przez ten proces decyzyjny i uznał ten zasób za bardzo przydatny: npmjs.com/package/awesome-angular2
theUtherSide

Odpowiedzi:

118

Oficjalne wytyczne są teraz dostępne. mgechev/angular2-seedteż się z tym zgadzał. patrz # 857 .

Struktura aplikacji Angular 2

https://angular.io/guide/styleguide#overall-structural-guidelines

tsu1980
źródło
3
Nie mogę znaleźć miejsca, w którym dokumentacja sugeruje umieszczenie znaku „+” przed nazwą folderu. Nie pamiętam, co to znaczy, czy jest jakieś wyjaśnienie?
FacundoGFlores
jaki jest cel każdego index.tspliku? czy jest przeznaczony do routingu?
Nicky
1
@FacundoGFlores oznacza to, że komponenty są ładowane z opóźnieniem.
charlie_pl
2
@Nicky Celem plików index.ts jest uproszczenie importu, nie musisz importować z każdego pliku, ale z folderu: na przykład import {Hero, Sword, Shield} z 'app / heroes / hero'
charlie_pl
1
Powyższy obrazek jest już nieaktualny. Na przykład nie pokazuje folderu „src”, który staje się elementem nadrzędnym folderu „app”.
Christoph
11

Mam zamiar użyć tego. Bardzo podobny do trzeciego pokazanego przez @Marin.

app
|
|___ images
|
|___ fonts
|
|___ css
|
|___ *main.ts*
|   
|___ *main.component.ts*
|
|___ *index.html*
|
|___ components
|   |
|   |___ shared
|   |
|   |___ home
|   |
|   |___ about
|   |
|   |___ product
|
|___ services
|
|___ structures
Savaratkar
źródło
2
Ta odpowiedź jest stara. Używam mgechev/angular2-seedteraz z github do 3 moich projektów. To jest fantastyczne!!!
Savaratkar
Odpowiedź Savaratkara jest tutaj najlepsza, jednak pójdę dalej, tworząc zasoby dla starszych, w których znajdują się pliki js, css, obrazy, czcionki ... itd.
vicgoyso
10

Więc po dokładniejszym zbadaniu sprawy, zdecydowałem się na nieco poprawioną wersję metody 3 (mgechev / angular2-seed).

Zasadniczo przeniosłem komponenty do katalogu głównego poziomu, a następnie każda funkcja będzie w nim.

Marin Petkov
źródło
2

Może coś takiego jak ta struktura:

|-- app
     |-- modules
       |-- home
           |-- [+] components
           |-- pages
              |-- home
              |-- home.component.ts|html|scss|spec
           |-- home-routing.module.ts
           |-- home.module.ts
     |-- core
       |-- authentication
           |-- authentication.service.ts|spec.ts
       |-- footer
           |-- footer.component.ts|html|scss|spec.ts
       |-- guards
           |-- auth.guard.ts
           |-- no-auth-guard.ts
           |-- admin-guard.ts 
       |-- http
           |-- user
               |-- user.service.ts|spec.ts
           |-- api.service.ts|spec.ts
       |-- interceptors
           |-- api-prefix.interceptor.ts
           |-- error-handler.interceptor.ts
           |-- http.token.interceptor.ts
       |-- mocks
           |-- user.mock.ts
       |-- services
           |-- srv1.service.ts|spec.ts
           |-- srv2.service.ts|spec.ts
       |-- header
           |-- header.component.ts|html|scss|spec.ts
       |-- core.module.ts
       |-- ensureModuleLoadedOnceGuard.ts
       |-- logger.service.ts
     |-- shared
          |-- components
              |-- loader
                  |-- loader.component.ts|html|scss|spec.ts
          |-- buttons
              |-- favorite-button
                  |-- favorite-button.component.ts|html|scss|spec.ts
              |-- collapse-button
                  |-- collapse-button.component.ts|html|scss|spec.ts
          |-- directives
              |-- auth.directive.ts|spec.ts
          |-- pipes
              |-- capitalize.pipe.ts
              |-- safe.pipe.ts
     |-- configs
         |-- app-settings.config.ts
         |-- dt-norwegian.config.ts
     |-- scss
          |-- [+] partials
          |-- _base.scss
          |-- styles.scss
     |-- assets
Mile Mijatović
źródło
Dobry. Ale nie wiem, co należy przenieść do folderów componentsi pages? Na twoim przykładzie, co powinniśmy zachować w folderze module> home> components?
Jack
@Jack Użyj tego linku jako odniesienia - github.com/mathisGarberg/angular-folder-structure
Mile Mijatović
Dzięki, ale przykład po prostu używa strony jako komponentu. Potrzebuję jednak przykładu, w którym istnieją komponenty i strony bota, aby zobaczyć separację. Jakieś sugestie dotyczące strony github?
Jack
Proszę o pomoc?
Jack
Nie rozumiem Twojego pytania, otwórz powyższy link referencyjny i podążaj ścieżką angular-folder-structure/src/app/modules/, otwórz jeden z tych modułów i zbadaj strukturę folderów pojedynczego modułu.
Mile Mijatović
0

Ostatnio używam ng cli i naprawdę ciężko było znaleźć dobry sposób na uporządkowanie kodu.

Najbardziej wydajne, jakie do tej pory widziałem, pochodzi z repozytorium mrholek ( https://github.com/mrholek/CoreUI-Angular ).

Ta struktura folderów pozwala zachować porządek w projekcie głównym i uporządkować komponenty, pozwala uniknąć zbędnych (czasami bezużytecznych) konwencji nazewnictwa oficjalnego przewodnika po stylach.

Ponadto ta struktura jest przydatna do grupowego importu, gdy jest to potrzebne, i pozwala uniknąć 30 linii importu dla pojedynczego pliku.

src
|
|___ app
|
|   |___ components/shared
|   |   |___ header
|   |
|   |___ containers/layout
|   |   |___ layout1
|   |
|   |___ directives
|   |   |___ sidebar
|   |
|   |___ services
|   |   |___ *user.service.ts* 
|   | 
|   |___ guards
|   |   |___ *auth.guard.ts* 
|   |
|   |___ views
|   |   |___ about  
|   |
|   |___ *app.component.ts*
|   |
|   |___ *app.module.ts*
|   |
|   |___ *app.routing.ts*
|
|___ assets
|
|___ environments
|
|___ img
|   
|___ scss
|
|___ *index.html*
|
|___ *main.ts*
davidbonachera
źródło
0

Jeśli projekt jest mały i pozostanie mały, polecam uporządkowanie według typu (Metoda 2: ng-book2)

app
|- components
|  |- hero
|  |- hero-list
|  |- villain
|  |- ...
|- services
|  |- hero.service.ts
|  |- ...
|- utils
|- shared

Jeśli projekt będzie się rozwijał, powinieneś uporządkować swoje foldery według domeny (Metoda 3: mgechev / angular2-seed)

app
|- heroes
|  |- hero
|  |- hero-list
|  |- hero.service.ts
|- villains
|  |- villain
|  |- ...
|- utils
|- shared

Lepiej śledzić oficjalne dokumenty.
https://angular.io/guide/styleguide#application-structure-and-ngmodules

Andrew Luca
źródło
0

Proponuję następującą strukturę, która może naruszać niektóre istniejące konwencje.

Starałem się ograniczyć nadmiarowość nazw na ścieżce i ogólnie starałem się, aby nazwy były krótkie.

Nie ma więc / app / components / home / home.component.ts | html | css.

Zamiast tego wygląda to tak:

|-- app
    |-- users
        |-- list.ts|html|css
        |-- form.ts|html|css
    |-- cars
        |-- list.ts|html|css
        |-- form.ts|html|css
        |-- configurator.ts|html|css
    |-- app.component.ts|html|css
    |-- app.module.ts
    |-- user.service.ts
    |-- car.service.ts
|-- index.html
|-- main.ts
|-- style.css
yglodt
źródło