Как работает структура проекта Angular?

Структура проекта Angular создаётся с помощью Angular CLI и организована по модульному принципу. Каждый функциональный блок обычно оформляется как отдельный Angular модуль, содержащий компоненты, сервисы и другие элементы, относящиеся к конкретной части приложения. Такая организация позволяет обеспечить масштабируемость, переиспользуемость и удобную поддержку крупных приложений.

Основные директории и файлы, создаваемые CLI (ng new my-app)

my-app/
├── src/
 ├── app/
  ├── app.component.ts
  ├── app.component.html
  ├── app.component.css
  ├── app.module.ts
 ├── assets/
 ├── environments/
  ├── environment.ts
  ├── environment.prod.ts
 ├── index.html
 ├── main.ts
 ├── styles.css
 ├── polyfills.ts
 ├── test.ts
├── angular.json
├── tsconfig.json
├── package.json

1. src/main.ts

Точка входа в приложение. Здесь происходит начальный bootstrap модуля AppModule:

import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app/app.module';
platformBrowserDynamic().bootstrapModule(AppModule)
.catch(err => console.error(err));

2. src/app/ — корневая логика приложения

В этой папке содержится:

  • app.module.ts — корневой модуль приложения.

  • app.component.ts — корневой компонент.

  • Подмодули, страницы, компоненты, сервисы и guard'ы.

Пример структуры:

app/
├── core/  singleton-сервисы, auth, interceptors
├── shared/  общие компоненты, директивы, pipes
├── features/
 ├── dashboard/
  ├── dashboard.module.ts
  ├── dashboard.component.ts
 ├── auth/
 ├── login/
 ├── register/
├── app.module.ts
├── app-routing.module.ts
├── app.component.ts

3. app.module.ts — корневой модуль

Регистрирует все модули и компоненты, необходимые на старте приложения.

@NgModule({
declarations: \[AppComponent\],
imports: \[BrowserModule, AppRoutingModule\],
bootstrap: \[AppComponent\]
})
export class AppModule {}

4. app.component.* — корневой компонент

Оборачивает всё приложение. Часто содержит <router-outlet>.

@Component({
selector: 'app-root',
templateUrl: './app.component.html'
})
export class AppComponent {}

5. app-routing.module.ts — маршрутизация

Отдельный файл для конфигурации маршрутов. Позволяет lazy loading, guards, параметры.

const routes: Routes = \[
{ path: '', component: HomeComponent },
{ path: 'dashboard', loadChildren: () => import('./features/dashboard/dashboard.module').then(m => m.DashboardModule) }
\];
@NgModule({
imports: \[RouterModule.forRoot(routes)\],
exports: \[RouterModule\]
})
export class AppRoutingModule {}

6. core/ — глобальные сервисы и singleton-логика

Модуль CoreModule импортируется только в AppModule, содержит:

  • AuthService, TokenInterceptor

  • Guard'ы (AuthGuard)

  • HTTP-интерсепторы

  • Logging, ErrorHandler

  • forRoot() pattern

core/
├── services/
├── interceptors/
├── guards/
├── core.module.ts

7. shared/ — переиспользуемые компоненты

Здесь находятся:

  • Переиспользуемые UI-компоненты (ButtonComponent, CardComponent)

  • Pipes, директивы (v-autofocus, ellipsis)

  • Шаблонные формы

  • Иконки, layout

Модуль SharedModule может импортироваться в любые другие модули.

@NgModule({
declarations: \[ButtonComponent, EllipsisPipe\],
exports: \[ButtonComponent, EllipsisPipe\],
imports: \[CommonModule\]
})
export class SharedModule {}

8. features/ — бизнес-логика

Каждая фича оформляется в виде модуля, содержащего компоненты, сервисы и роутинг.

features/
├── products/
 ├── products.module.ts
 ├── products-routing.module.ts
 ├── product-list.component.ts
 ├── product-detail.component.ts

Lazy loading достигается за счёт отдельных feature.module.ts.

9. assets/ — статические ресурсы

Содержит изображения, SVG, шрифты и любые файлы, которые должны быть доступны без обработки Webpack.

10. environments/ — конфигурации окружений

Используется Angular CLI для подстановки переменных окружения при сборке:

  • environment.ts — для разработки

  • environment.prod.ts — для продакшна

export const environment = {
production: false,
apiUrl: 'http://localhost:3000'
};
"fileReplacements": \[
{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.prod.ts"
}
\]

11. styles.css, angular.json, tsconfig.json

  • styles.css — глобальные стили (можно заменить на SCSS)

  • angular.json — конфигурация проекта (путь к стилям, сборка, окружения, ассеты)

  • tsconfig.json — TypeScript-конфигурация (strict, paths, aliases)

12. Подход к организации по масштабируемым уровням

Слой Назначение
AppModule Включает только корневые зависимости и роутинг
--- ---
CoreModule Singleton-сервисы и глобальные interceptors
--- ---
SharedModule Компоненты/пайпы, переиспользуемые во всех модулях
--- ---
FeatureModules Модули для бизнес-функций с изолированными роутами
--- ---

13. Условный пример дерева для большого проекта

app/
├── app.module.ts
├── app.component.ts
├── app-routing.module.ts
├── core/
 ├── services/
 ├── guards/
 └── core.module.ts
├── shared/
 ├── components/
 ├── pipes/
 └── shared.module.ts
├── features/
 ├── auth/
  ├── login.component.ts
  └── auth.module.ts
 ├── dashboard/
  ├── dashboard.component.ts
  └── dashboard.module.ts
├── state/
 ├── store.ts
 └── effects/
├── theme/
 ├── variables.scss
 └── base.scss

14. Рекомендации по структуре

  • Использовать строгое разделение Core/Shared/Feature

  • Все сервисы и interceptors — в Core

  • Все UI-компоненты — в Shared

  • Использовать lazy loading для Feature-модулей

  • Компоненты размещать рядом с шаблонами и стилями (.component.ts, .html, .scss)

  • Использовать barrel-файлы (index.ts) для упрощения импорта

  • Настроить alias'ы (paths в tsconfig.json) для путей импорта

  • Подключать ESLint и Prettier