Angular поддерживает создание переиспользуемых библиотек на уровне фреймворка. Библиотека представляет собой изолированный набор компонентов, сервисов, директив и пайпов, предназначенных для повторного использования в разных приложениях.
Библиотека создаётся и собирается с помощью Angular CLI и имеет строгую структуру:
projects/
my-lib/
src/
lib/
my-lib.module.ts
components/
services/
public-api.ts
Ключевые элементы:
Angular CLI предоставляет встроенную поддержку:
ng generate library my-lib
В результате создаётся проект библиотеки, отделённый от основного приложения. Это позволяет:
Файл public-api.ts определяет, какие сущности будут
доступны потребителю библиотеки.
Пример:
export * from './lib/my-lib.module';
export * from './lib/components/button/button.component';
Всё, что не экспортировано, считается внутренней реализацией и недоступно извне.
Это обеспечивает:
Каждая библиотека должна предоставлять как минимум один
NgModule.
@NgModule({
declarations: [ButtonComponent],
imports: [CommonModule],
exports: [ButtonComponent]
})
export class MyLibModule {}
Особенности:
Сервисы в библиотеке регистрируются через
providedIn:
@Injectable({
providedIn: 'root'
})
export class ThemeService {}
Это позволяет:
При необходимости сервис может предоставляться через модуль библиотеки.
Angular библиотеки поддерживают:
Стили компонентов инкапсулируются через
ViewEncapsulation, что предотвращает конфликты.
@Component({
encapsulation: ViewEncapsulation.Emulated
})
Angular использует ng-packagr для сборки библиотек.
Результат включает:
.d.ts);Это обеспечивает совместимость с:
Angular библиотеки строго привязаны к версии Angular:
Пример package.json:
"peerDependencies": {
"@angular/core": "^17.0.0",
"@angular/common": "^17.0.0"
}
Подключение библиотеки происходит стандартным способом:
import { MyLibModule } from 'my-lib';
@NgModule({
imports: [MyLibModule]
})
export class AppModule {}
Angular воспринимает библиотеку как полноценный модуль, включая её в процесс компиляции и оптимизации.
Современные Angular библиотеки могут экспортировать standalone-компоненты без NgModule:
@Component({
standalone: true,
selector: 'lib-card',
imports: [CommonModule]
})
export class CardComponent {}
Это снижает связность и упрощает использование библиотеки в новых проектах.
Angular библиотеки используются для:
Они становятся фундаментом масштабируемых приложений, отделяя общее от прикладного и обеспечивая долгосрочную поддерживаемость кода.