Quale tipo di struttura di cartelle dovrebbe essere usata con Angular 2?


129

Sono uno sviluppatore di Angular 1 che sta iniziando a conoscere Angular 2. Esistono molti tipi diversi di metodi di struttura delle cartelle a seconda del materiale di formazione. Ho intenzione di elencare ognuno di seguito e mi piacerebbe avere le opinioni delle persone su cui dovrei usare e perché. Inoltre, se esiste un metodo che non è elencato ma ritieni che funzioni meglio, non esitare a elencarlo.

Osservando tutti questi, il metodo n. 3 è praticamente come stavo facendo le mie app Angular 1.

Metodo 1: angular2-quickstart

Fonte: https://angular.io/guide/quickstart

Struttura delle cartelle:

inserisci qui la descrizione dell'immagine

Metodo 2: ng-book2

Fonte: https://www.ng-book.com/2/ ( devi pagare per vedere i file)

Struttura delle cartelle:

inserisci qui la descrizione dell'immagine

Metodo 3: mgechev / seme angolare2

Fonte: https://github.com/mgechev/angular2-seed

Struttura delle cartelle:

inserisci qui la descrizione dell'immagine


1
Ritengo che il Metodo 2 sia il più efficiente perché tutti i componenti, i servizi, ecc. Dovrebbero essere tenuti in cartelle separate per facilitare la ricerca dei file in un secondo momento. Questo è il metodo più efficiente in un'app molto complessa.
Bryan,

Grazie per la risposta @Bryan, quale pensi sia il motivo della cartella delle tipizzazioni? Nessuno degli altri 2 metodi lo usa. Inoltre, hai un'opinione su app.ts vs main.ts per il file principale?
Marin Petkov,

Quindi il seme che ho usato di recente è andato alla guida di stile che è method3 qui. Sono confuso su come si ridimensiona e perché esiste una cartella condivisa? non è l'intero punto di questo framework in modo tale che qualsiasi componente / direttiva / pipe / servizio possa essere condiviso da chiunque? È difficile per me capire come trovare facilmente direttive / pipe .. con il formato della guida di stile devi solo sapere dove si trova o cercare in ogni cartella quel servizio che pensavi di utilizzare solo per i clienti e ora ne ho bisogno per altre cose.
Gary

1
@Gary - Quindi la mia opinione sulla cartella condivisa per la seminatrice è che tutto ciò che è condiviso può essere usato in classi che si trovano allo stesso livello di cartella o in qualsiasi sottocartella. Puoi usare qualsiasi classe ovunque? Certo che puoi, ma quando qualcuno di nuovo guarda il tuo codice non saprà cosa sta succedendo. Inserendo le classi utilizzate tra diversi componenti / cartelle all'interno condivise, si comunica chiaramente al programmatore che viene utilizzato in più posizioni.
Marin Petkov,

1
Il nostro team ha recentemente seguito questo processo decisionale e ha trovato questa risorsa molto utile: npmjs.com/package/awesome-angular2
theUtherSide

Risposte:


117

La linea guida ufficiale è lì adesso. mgechev/angular2-seedaveva anche un allineamento con esso. vedi # 857 .

Angular 2 struttura dell'applicazione

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


3
Non riesco a trovare dove la documentazione suggerisce di mettere un segno "+" prima del nome della cartella. Non riesco a ricordare cosa significhi, c'è qualche spiegazione?
FacundoGFlores,

qual è lo scopo di ciascun index.tsfile? è pensato per il routing?
Nicky,

1
@FacundoGFlores significa che i componenti sono caricati lentamente.
charlie_pl,

2
@Nicky Lo scopo dei file index.ts è di semplificare le importazioni, non è necessario importare da ciascun file, ma dalla cartella: ad esempio importare {Hero, Sword, Shield} da 'app / heroes / hero'
charlie_pl

1
L'immagine sopra è ormai superata. Ad esempio, non mostra la cartella "src", che diventa il genitore della cartella "app".
Christoph,


11

Ho intenzione di usare questo. Molto simile al terzo mostrato da @Marin.

app
|
|___ images
|
|___ fonts
|
|___ css
|
|___ *main.ts*
|   
|___ *main.component.ts*
|
|___ *index.html*
|
|___ components
|   |
|   |___ shared
|   |
|   |___ home
|   |
|   |___ about
|   |
|   |___ product
|
|___ services
|
|___ structures

2
Questa risposta è vecchia. Sto usando mgechev/angular2-seedda Github ora, per 3 dei miei progetti. È fantastico!!!
Savaratkar,

La risposta di Savaratkar è la migliore qui, tuttavia andrò oltre creando un asset forlder dove risiedono js, ​​css, immagini, caratteri ... ecc.
vicgoyso,

10

Quindi, dopo aver fatto più ricerche, ho finito con una versione leggermente rivista del Metodo 3 (mgechev / angular2-seed).

Fondamentalmente ho spostato i componenti in una directory di livello principale e quindi ogni funzione sarà al suo interno.


2

Forse qualcosa come questa struttura:

|-- 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

0

Ultimamente sto usando ng cli, ed è stato davvero difficile trovare un buon modo per strutturare il mio codice.

Quello più efficiente che ho visto finora proviene dal repository mrholek ( https://github.com/mrholek/CoreUI-Angular ).

Questa struttura di cartelle ti consente di mantenere pulito il tuo progetto di root e strutturare i tuoi componenti, evita la convenzione di denominazione ridondante (a volte inutile) della Guida di stile ufficiale.

Inoltre, questa struttura è utile per raggruppare l'importazione quando è necessario ed evitare di avere 30 righe di importazione per un singolo file.

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*

0

Se il progetto è piccolo e rimarrà piccolo, consiglierei di strutturare per tipo (Metodo 2: ng-book2)

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

Se il progetto cresce, dovresti strutturare le tue cartelle per dominio (Metodo 3: mgechev / angular2-seed)

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

Meglio seguire i documenti ufficiali.
https://angular.io/guide/styleguide#application-structure-and-ngmodules


0

Suggerisco la seguente struttura, che potrebbe violare alcune convenzioni esistenti.

Mi sforzavo di ridurre la ridondanza dei nomi nel percorso e cercavo di ridurre i nomi in generale.

Quindi non esiste / app / componenti / home / home.component.ts | html | css.

Invece sembra così:

|-- 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.