Фронтальная разработка за последнее десятилетие сильно выросла от чистого HTML и CSS-дизайна до таких тем, как высокая интерактивность, доступность, тестируемость и безопасность. Чтобы удовлетворить эти потребности, большинство групп разработчиков приложений проводят различия между командами разработчиков бэкэнда и фронтэнда.
В дополнение к этому функциональность приложения постоянно растет, и в определенный момент становится нецелесообразным объединять несколько команд в одной базе кода.
Термин «Micro Front-end» был модным словом для разбиения растущего кода переднего плана на простые в обслуживании части. Внешний интерфейс делится на несколько функций или частей. Эти части реализованы и развернуты независимыми командами. Это повышает тестируемость, возможность повторного использования и дает возможность выбирать разные технологии для каждого микро-интерфейса.
На этом я остановлюсь и, без дальнейших церемоний, давайте создадим примеры микро-интерфейсов с использованием угловых элементов.
Построение Micro Front-Ends
В этой статье мы создадим образец системы бронирования путешествий. Давайте раскрутим два проекта Angular с использованием CLI: travel-booking и flight-booking.
Нам понадобится несколько зависимостей для создания и запуска пользовательских элементов Angular. Установите следующие зависимости внутри бронирования рейса, используя следующие команды.
ng add @angular/elements
ng add ngx-build-plus
Эти зависимости также могут быть установлены через npm. @ angular / elements обеспечивает поддержку угловых элементов. ngx-build-plus — это инструмент для сборки Angular, который является расширением Angular CLI.
Примечание : вам может потребоваться обновить версию для модуля document-register-element до 1.8.1 в /flight-booking/package.json, как описано в этом выпуске .
Давайте также установим модуль http-сервера в проекте бронирования авиабилетов .
npm i -g http-server --save
Создайте компонент бронирования в flight-booking / src / app /. Давайте изменим компонент следующим образом:
заказывающий полет / ЦСИ / приложение / бронирование / booking.component.html
<!--The content below is only a placeholder and can be replaced.-->
<div style="text-align:center">
<a href="javascript:alert('Welcome to Flight Booking App!!');" style="font-size:25px;">{{ title }}</a>
</div>
летно-бронирование / ЦСИ / приложение / бронирование / booking.component.ts
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-flight-booking',
templateUrl: './booking.component.html',
styleUrls: ['./booking.component.scss']
})
export class BookingComponent implements OnInit {
title = 'Flight Booking App';
constructor() { }
ngOnInit() {
}
Давайте определим booking
компонент как пользовательский элемент в flight-booking / src / app / app.module.ts.
import { BrowserModule } from '@angular/platform-browser';
import { NgModule, Injector } from '@angular/core';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { createCustomElement } from '@angular/elements';
import { BookingComponent } from './booking/booking.component';
@NgModule({
declarations: [
AppComponent,
BookingComponent
],
imports: [
BrowserModule,
AppRoutingModule
],
providers: [],
bootstrap: [],
entryComponents: [
BookingComponent
]
})
export class AppModule {
constructor(private injector: Injector) {
}
ngDoBootstrap() {
const myCustomElement = createCustomElement(BookingComponent, { injector: this.injector });
customElements.define('app-flight-booking', myCustomElement);
}
}
Чтобы собрать проект в одном файле JS, нам нужно указать angular использовать модуль ngx-build-plus . Измените flight-booking / angular.json в трех местах следующим образом:
"architect": { "build": { "builder": "ngx-build-plus:build", ....
"serve": { "builder": "ngx-build-plus:dev-server", ...
"test": { "builder": "ngx-build-plus:karma",
Запуск проекта
Выполните следующую команду, чтобы собрать проект в один файл JS.
ng build --prod --output-hashing none --single-bundle true
--output-hashing none
позволит избежать хеширования имен файлов.
--single-bundle true
объединит все скомпилированные файлы в один файл JS.
Запустите сервер.
http-server ./dist/flight-booking -p 8081
Таким же образом создайте еще один пользовательский элемент train-booking
, и запустить сервер с портом 8082.
http-server ./dist/train-booking -p 8082
Упаковка пользовательского элемента
Давайте включим flight-booking
и train-booking
пользовательские элементы в приложение бронирования путешествий. Измените /travel-booking/index.html следующим образом.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>TravelBooking</title>
<base href="/">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="favicon.ico">
</head>
<body>
<app-root></app-root>
<div style="margin-bottom: 10px;" id="flight-booking-container"><app-flight-booking></app-flight-booking></div>
<div id="train-booking-container"><app-train-booking></app-train-booking></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/zone.js/0.9.1/zone.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/webcomponentsjs/2.2.10/custom-elements-es5-adapter.js"></script>
<script type="text/javascript" src="http://localhost:8081/main.js"></script>
<script type="text/javascript" src="http://localhost:8082/main.js"></script>
</body>
</html>
Здесь Angular требует зон . и custom-elements-es5-adapter.js обеспечивает поддержку пользовательских элементов в браузере. Мы также включили main.js из наших пользовательских элементов.
Измените travel-booking / angular.json, чтобы переопределить порт сервера по умолчанию.
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"options": {
"browserTarget": "travel-booking:build",
"port": 8080
}
…
Запуск основного приложения
Запустите приложение, используя ng serve
. Окончательное приложение будет выглядеть так:
Завершение
На простых примерах эта статья демонстрирует, как мы можем построить микро-интерфейсную архитектуру с использованием угловых элементов. Я надеюсь, вам понравилась моя статья. Дайте мне знать ваш опыт, если вы работаете с микро-интерфейсной архитектурой.
Как всегда, вы можете найти полный код в моем репозитории GitHub .