Que tipo de estrutura de pastas deve ser usada com o Angular 2?

129

Eu sou um desenvolvedor do Angular 1 que está começando a aprender sobre o Angular 2. Existem muitos tipos diferentes de métodos de estrutura de pastas, dependendo do material de treinamento. Vou listar cada um abaixo e gostaria de receber as opiniões das pessoas sobre as quais devo usar e por quê. Além disso, se houver um método que não esteja listado, mas você achar que ele funciona melhor, sinta-se à vontade para listá-lo também.

Ao olhar para todos eles, o método 3 é como eu estava fazendo meus aplicativos Angular 1.

Método 1: início rápido do angular2

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

Estrutura da pasta:

insira a descrição da imagem aqui

Método 2: ng-book2

Fonte: https://www.ng-book.com/2/ (tem que pagar para ver os arquivos)

Estrutura da pasta:

insira a descrição da imagem aqui

Método 3: mgechev / angular2-seed

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

Estrutura da pasta:

insira a descrição da imagem aqui

Marin Petkov
fonte
1
Eu sinto que o método 2 é o mais eficiente, porque todos os componentes, serviços etc. devem ser mantidos em pastas separadas para facilitar a localização de arquivos posteriormente. Este é o método mais eficiente em um aplicativo muito complexo.
Bryan
Obrigado pela resposta @Bryan, qual você acha que é o motivo da pasta de caracteres? Nenhum dos outros 2 métodos o utiliza. Além disso, você tem uma opinião sobre app.ts vs main.ts para o arquivo principal?
Marin Petkov 12/02
Portanto, a semente que eu tenho usado recentemente foi para o guia de estilo, que é o method3 aqui. Estou confuso como isso é dimensionado, e por que há uma pasta compartilhada? não é o objetivo dessa estrutura para que qualquer componente / diretiva / canal / serviço possa ser compartilhado por alguém? É difícil para mim entender como encontrar diretivas / tubulações com facilidade. Com o formato do guia de estilo, você só precisa saber onde está localizado ou procurar em todas as pastas o serviço que você pensou que usaria apenas para clientes e agora você preciso dele para outras coisas.
8556 Gary
1
@ Gary - Então, a minha opinião sobre a pasta compartilhada para a semeadora é que qualquer coisa em compartilhada pode ser usada em classes localizadas no mesmo nível de pasta ou em qualquer subpasta. Você pode usar alguma classe em qualquer lugar? Claro que você pode, mas quando alguém novo olhar para o seu código, ele não saberá o que está acontecendo. Colocando classes que são usadas entre diferentes componentes / pastas dentro de compartilhadas, isso permite que o programador saiba que é usado em vários locais.
Marin Petkov
1
Nossa equipe recentemente passou por esse processo de decisão e achou este recurso muito útil: npmjs.com/package/awesome-angular2
theUtherSide

Respostas:

117

A diretriz oficial está lá agora. mgechev/angular2-seedtambém tinha alinhamento. veja # 857 .

Estrutura de aplicação angular 2

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

tsu1980
fonte
3
Não consigo encontrar onde a documentação sugere colocar um sinal de "+" antes do nome da pasta. Não me lembro o que isso significa, existe alguma explicação?
FacundoGFlores
qual é o objetivo de cada index.tsarquivo? é destinado ao roteamento?
Nicky
1
@FacundoGFlores significa que os componentes são carregados com preguiça.
charlie_pl
2
@Nicky O objetivo dos arquivos index.ts é simplificar as importações, não é necessário importar de cada arquivo, mas da pasta: por exemplo, importar {Hero, Sword, Shield} de 'app / heroes / hero'
charlie_pl
1
A imagem acima está desatualizada até agora. Por exemplo, ele não mostra a pasta "src", que se torna o pai da pasta "app".
Christoph
11

Eu vou usar este. Muito semelhante ao terceiro mostrado por @Marin.

app
|
|___ images
|
|___ fonts
|
|___ css
|
|___ *main.ts*
|   
|___ *main.component.ts*
|
|___ *index.html*
|
|___ components
|   |
|   |___ shared
|   |
|   |___ home
|   |
|   |___ about
|   |
|   |___ product
|
|___ services
|
|___ structures
Savaratkar
fonte
2
Esta resposta é antiga. Agora estou usando o mgechev/angular2-seedgithub em três dos meus projetos. É fantástico!!!
28416 Savaratkar
A resposta de Savaratkar é a melhor aqui, no entanto, irei mais além criando um ativo para onde js, css, imagens, fontes ... etc residem.
precisa saber é o seguinte
10

Então, depois de fazer mais investigações, acabei indo com uma versão ligeiramente revisada do método 3 (mgechev / angular2-seed).

Basicamente, mudei os componentes para um diretório de nível principal e, em seguida, cada recurso estará dentro dele.

Marin Petkov
fonte
2

Talvez algo como esta estrutura:

|-- 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ć
fonte
0

Ultimamente, tenho usado o ng cli e foi muito difícil encontrar uma boa maneira de estruturar meu código.

O mais eficiente que vi até agora vem do repositório mrholek ( https://github.com/mrholek/CoreUI-Angular ).

Essa estrutura de pastas permite manter seu projeto raiz limpo e estruturar seus componentes, evitando a convenção de nomenclatura redundante (às vezes inútil) do Guia de estilo oficial.

Além disso, essa estrutura é útil para agrupar a importação quando necessário e evitar 30 linhas de importação para um único arquivo.

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

Se o projeto for pequeno e permanecer pequeno, eu recomendaria estruturar por tipo (Método 2: ng-book2)

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

Se o projeto crescer, você deve estruturar suas pastas por domínio (Método 3: mgechev / angular2-seed)

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

Melhor seguir documentos oficiais.
https://angular.io/guide/styleguide#application-structure-and-ngmodules

Andrew Luca
fonte
0

Sugiro a seguinte estrutura, que pode violar algumas convenções existentes.

Eu estava me esforçando para reduzir a redundância de nomes no caminho e tentando manter os nomes curtos em geral.

Portanto, não há / app / components / home / home.component.ts | html | css.

Em vez disso, fica assim:

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