Een SPA integreren integrate-spa
Begrijp hoe de broncode voor een Toepassing van de Enige Pagina (SPA) die in Angular wordt geschreven met een Project van Adobe Experience Manager (AEM) kan worden geïntegreerd. Leer om moderne front-end hulpmiddelen, zoals een webpack dev server, te gebruiken om de SPA tegen AEM JSON model API snel te ontwikkelen.
Doelstelling
- Begrijp hoe het SPA project met AEM met cliënt-zijbibliotheken geïntegreerd is.
- Leer hoe u een lokale ontwikkelingsserver gebruikt voor speciale front-end ontwikkeling.
- Onderzoek het gebruik van a volmacht en statische mock dossier voor het ontwikkelen tegen het modelAPI van AEM JSON
Wat u gaat maken
In dit hoofdstuk wordt een eenvoudige Header
-component aan de SPA toegevoegd. Tijdens het ontwikkelen van deze statische Header
-component worden verschillende benaderingen voor AEM SPA ontwikkeling gebruikt.
de SPA wordt uitgebreid om een statische Header
component toe te voegen
Vereisten
Herzie het vereiste tooling en de instructies voor vestiging a lokale ontwikkelomgeving.
De code ophalen
-
Download het beginpunt voor deze zelfstudie via Git:
code language-shell $ git clone git@github.com:adobe/aem-guides-wknd-spa.git $ cd aem-guides-wknd-spa $ git checkout Angular/integrate-spa-start
-
Implementeer de basis van de code op een lokale AEM met Maven:
code language-shell $ mvn clean install -PautoInstallSinglePackage
Als het gebruiken van AEM 6.xhet
classic
profiel toevoegt:code language-shell $ mvn clean install -PautoInstallSinglePackage -Pclassic
U kunt de gebeëindigde code op GitHubaltijd bekijken of de code uit controleren plaatselijk door aan de tak Angular/integrate-spa-solution
te schakelen.
Integratiebenadering integration-approach
Er zijn twee modules gemaakt als onderdeel van het AEM project: ui.apps
en ui.frontend
.
De ui.frontend
module is a webpackproject dat alle SPA broncode bevat. Het grootste deel van de SPA ontwikkeling en tests vindt plaats in het webpack-project. Wanneer een productiebouwstijl wordt teweeggebracht, wordt het SPA gebouwd en gecompileerd gebruikend webpack. De gecompileerde artefacten (CSS en Javascript) worden gekopieerd in de ui.apps
module die dan aan AEM runtime wordt opgesteld.
A high-level afbeelding van de SPA integratie.
De extra informatie over het front-end bouwt kan hierworden gevonden.
Inspect de SPA integratie inspect-spa-integration
Daarna, inspecteer de ui.frontend
module om de SPA te begrijpen die door AEM archetype van het Projectauto-geproduceerd is.
-
In winde van uw keus open omhoog het AEM Project voor de SPA WKND. Dit leerprogramma zal winde van de Code van Visual Studiogebruiken.
-
Vouw de map
ui.frontend
uit en inspecteer deze. Het bestand openenui.frontend/package.json
-
Onder
dependencies
ziet u een aantal koppelingen die verwant zijn aan@angular
:code language-json "@angular/animations": "~9.1.11", "@angular/common": "~9.1.11", "@angular/compiler": "~9.1.11", "@angular/core": "~9.1.11", "@angular/forms": "~9.1.10", "@angular/platform-browser": "~9.1.10", "@angular/platform-browser-dynamic": "~9.1.10", "@angular/router": "~9.1.10",
De
ui.frontend
module is een toepassing van de Angulardie door het Angular CLI hulpmiddelwordt geproduceerd te gebruiken dat het verpletteren omvat. -
Er zijn ook drie afhankelijkheden voorafgegaan door
@adobe
:code language-json "@adobe/cq-angular-editable-components": "^2.0.2", "@adobe/cq-spa-component-mapping": "^1.0.3", "@adobe/cq-spa-page-model-manager": "^1.1.3",
De bovenstaande modules maken omhoog AEM de Redacteur JS SDK SPAen verstrekken de functionaliteit om het mogelijk te maken om SPA Componenten aan AEM Componenten in kaart te brengen.
-
In het
package.json
-bestand zijn verschillendescripts
gedefinieerd:code language-json "scripts": { "start": "ng serve --open --proxy-config ./proxy.conf.json", "build": "ng lint && ng build && clientlib", "build:production": "ng lint && ng build --prod && clientlib", "test": "ng test", "sync": "aemsync -d -w ../ui.apps/src/main/content" }
Deze manuscripten zijn gebaseerd op gemeenschappelijke Angular CLI bevelenmaar lichtjes gewijzigd om met het grotere AEM project te werken.
start
- voert de Angular-app lokaal uit met een lokale webserver. Deze is bijgewerkt om de inhoud van een lokale AEM-instantie te profileren.build
- compileert de Angular-app voor productiedistributie. De toevoeging van&& clientlib
is verantwoordelijk voor het kopiëren van de gecompileerde SPA naar de moduleui.apps
als een client-side bibliotheek tijdens een build. De npm module aem-clientlib-generatorwordt gebruikt om dit te vergemakkelijken.Meer details over de beschikbare manuscripten kunnen hierworden gevonden.
-
Inspect het bestand
ui.frontend/clientlib.config.js
. Dit configuratiedossier wordt gebruikt door aem-clientlib-generatorom te bepalen hoe te om de cliëntbibliotheek te produceren. -
Inspect het bestand
ui.frontend/pom.xml
. Dit dossier zet deui.frontend
omslag in a Gemaakt moduleom. Hetpom.xml
dossier is bijgewerkt om te gebruiken front-maven-pluginaan test en bouwt de SPA tijdens een Gemaakt bouwt. -
Inspect het bestand
app.component.ts
opui.frontend/src/app/app.component.ts
:code language-js import { Constants } from '@adobe/cq-angular-editable-components'; import { ModelManager } from '@adobe/cq-spa-page-model-manager'; import { Component } from '@angular/core'; @Component({ selector: '#spa-root', // tslint:disable-line styleUrls: ['./app.component.css'], templateUrl: './app.component.html' }) export class AppComponent { ... constructor() { ModelManager.initialize().then(this.updateData); } private updateData = pageModel => { this.path = pageModel[Constants.PATH_PROP]; this.items = pageModel[Constants.ITEMS_PROP]; this.itemsOrder = pageModel[Constants.ITEMS_ORDER_PROP]; } }
app.component.js
is het ingangspunt van de SPA.ModelManager
wordt geleverd door de AEM SPA Editor JS SDK. Het is verantwoordelijk voor het aanroepen en injecteren vanpageModel
(de JSON-inhoud) in de toepassing.
Een koptekstcomponent toevoegen header-component
Vervolgens voegt u een nieuwe component aan de SPA toe en implementeert u de wijzigingen in een lokale AEM-instantie om de integratie te zien.
-
Open een nieuw terminalvenster en navigeer naar de map
ui.frontend
:code language-shell $ cd aem-guides-wknd-spa/ui.frontend
-
Installeer Angular CLIglobaal dit wordt gebruikt om de componenten van de Angular te produceren evenals de toepassing van de Angular via het ng bevel te bouwen en te dienen.
code language-shell $ npm install -g @angular/cli
note caution CAUTION De versie van @angular/cli die door dit project wordt gebruikt is 9.1.7. Het wordt aanbevolen de Angular CLI-versies synchroon te houden. -
Maak een nieuwe
Header
-component door de Angular CLIng generate component
-opdracht uit te voeren vanuit de mapui.frontend
.code language-shell $ ng generate component components/header CREATE src/app/components/header/header.component.css (0 bytes) CREATE src/app/components/header/header.component.html (21 bytes) CREATE src/app/components/header/header.component.spec.ts (628 bytes) CREATE src/app/components/header/header.component.ts (269 bytes) UPDATE src/app/app.module.ts (1809 bytes)
Hierdoor wordt een skelet voor de nieuwe Angular Header-component in
ui.frontend/src/app/components/header
gemaakt. -
Open het
aem-guides-wknd-spa
project in winde van uw keus. Navigeer naar de mapui.frontend/src/app/components/header
. -
Open het bestand
header.component.html
en vervang de inhoud door:code language-html <!--/* header.component.html */--> <header className="header"> <div className="header-container"> <h1>WKND</h1> </div> </header>
Let op: dit geeft statische inhoud weer, dus voor deze component Angular is geen aanpassing van de gegenereerde standaard vereist
header.component.ts
. -
Open het dossier app.component.html bij
ui.frontend/src/app/app.component.html
. Voeg de lusapp-header
toe:code language-html <app-header></app-header> <router-outlet></router-outlet>
Dit omvat de component
header
boven alle pagina-inhoud. -
Open een nieuwe terminal, navigeer naar de map
ui.frontend
en voer de opdrachtnpm run build
uit:code language-shell $ cd ui.frontend $ npm run build Linting "angular-app"... All files pass linting. Generating ES5 bundles for differential loading... ES5 bundle generation complete.
-
Navigeer naar de map
ui.apps
. Onderui.apps/src/main/content/jcr_root/apps/wknd-spa-angular/clientlibs/clientlib-angular
zou u moeten zien de gecompileerde SPA dossiers van deui.frontend/build
omslag zijn gekopieerd.wordt geproduceerd
-
Ga terug naar de terminal en navigeer naar de map
ui.apps
. Voer het volgende Geweven bevel uit:code language-shell $ cd ../ui.apps $ mvn clean install -PautoInstallPackage ... [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 9.629 s [INFO] Finished at: 2020-05-04T17:48:07-07:00 [INFO] ------------------------------------------------------------------------
Hiermee wordt het
ui.apps
-pakket geïmplementeerd in een lokale actieve instantie van AEM. -
Open een browser lusje en navigeer aan http://localhost:4502/editor.html/content/wknd-spa-angular/us/en/home.html. De inhoud van de component
Header
die in de SPA wordt weergegeven, wordt nu weergegeven.
De stappen 7-9 worden uitgevoerd automatisch wanneer het teweegbrengen van een Maven bouwt van de wortel van het project (d.w.z. mvn clean install -PautoInstallSinglePackage
). U zou nu de grondbeginselen van de integratie tussen de SPA en AEM cliënt-zijbibliotheken moeten begrijpen. Text
-componenten kunt u nog wel bewerken en toevoegen in AEM, maar de Header
-component kan niet worden bewerkt.
Webpack Dev Server - Proxy de JSON API proxy-json
Zoals u in de vorige oefeningen ziet, duurt het maken van een build en het synchroniseren van de clientbibliotheek naar een lokale AEM enkele minuten. Dit is acceptabel voor de uiteindelijke test, maar niet ideaal voor het grootste deel van de SPA ontwikkeling.
A webpack dev serverkan worden gebruikt om de SPA snel te ontwikkelen. De SPA wordt aangedreven door een JSON-model dat door AEM wordt gegenereerd. In deze oefening is de inhoud JSON van een lopende instantie van AEM proxied in de ontwikkelingsserver die door het project van de Angularwordt gevormd.
-
Terugkeer aan winde en open het dossier proxy.conf.json bij
ui.frontend/proxy.conf.json
.code language-json [ { "context": [ "/content/**/*.(jpg|jpeg|png|model.json)", "/etc.clientlibs/**/*" ], "target": "http://localhost:4502", "auth": "admin:admin", "logLevel": "debug" } ]
De Angular appverstrekt een gemakkelijk mechanisme aan volmacht API verzoeken. De patronen die in
context
worden opgegeven, worden beschreven vialocalhost:4502
, de lokale AEM quickstart. -
Open het dossier index.html bij
ui.frontend/src/index.html
. Dit is het basisbestand voor HTML dat door de ontwikkelserver wordt gebruikt.Er is een vermelding voor
base href="/"
. De basismarkeringis kritiek voor app om relatieve URLs op te lossen.code language-html <base href="/">
-
Open een terminalvenster en navigeer naar de map
ui.frontend
. Voer de opdrachtnpm start
uit:code language-shell $ cd ui.frontend $ npm start > wknd-spa-angular@0.1.0 start /Users/dgordon/Documents/code/aem-guides-wknd-spa/ui.frontend > ng serve --open --proxy-config ./proxy.conf.json 10% building 3/3 modules 0 active[HPM] Proxy created: [ '/content/**/*.(jpg|jpeg|png|model.json)', '/etc.clientlibs/**/*' ] -> http://localhost:4502 [HPM] Subscribed to http-proxy events: [ 'error', 'close' ] ℹ 「wds」: Project is running at http://localhost:4200/webpack-dev-server/ ℹ 「wds」: webpack output is served from / ℹ 「wds」: 404s will fallback to //index.html
-
Open een nieuw browser lusje (als niet reeds geopend) en navigeer aan http://localhost:4200/content/wknd-spa-angular/us/en/home.html.
U moet dezelfde inhoud zien als in AEM, maar zonder dat een van de ontwerpmogelijkheden is ingeschakeld.
-
Keer terug naar winde en creeer een nieuwe omslag genoemd
img
bijui.frontend/src/assets
. -
Download en voeg het volgende WKND-logo toe aan de map
img
: -
Open header.component.html bij
ui.frontend/src/app/components/header/header.component.html
en omvat het embleem:code language-html <header class="header"> <div class="header-container"> <div class="logo"> <img class="logo-img" src="assets/img/wknd-logo-dk.png" alt="WKND SPA" /> </div> </div> </header>
Sparen de veranderingen in header.component.html.
-
Ga terug naar de browser. De wijzigingen in de app worden meteen weerspiegeld.
wordt toegevoegd
U kunt inhoudsupdates in AEM blijven maken en hen zien die in webpack dev server worden weerspiegeld, aangezien wij de inhoud proxying. Merk op dat de inhoudsveranderingen slechts zichtbaar in webpack dev server zijn.
-
Stop de lokale webserver met
ctrl+c
in de terminal.
Webpack Dev Server - Mock JSON API mock-json
Een andere manier om snel te ontwikkelen is het gebruik van een statisch JSON-bestand als JSON-model. Door de JSON te 'rokken' verwijderen we de afhankelijkheid van een lokale AEM. Het staat ook een front-end ontwikkelaar toe om het model JSON bij te werken om functionaliteit te testen en veranderingen in JSON API te drijven die dan door een achterste-eindontwikkelaar zou worden uitgevoerd.
De aanvankelijke opstelling van het model JSON vereist een lokale AEM instantie.
-
In browser navigeer aan http://localhost:4502/content/wknd-spa-angular/us/en.model.json.
Dit is de JSON die wordt geëxporteerd door AEM die de toepassing stuurt. Kopieer de JSON-uitvoer.
-
Terugkeer aan winde navigeert aan
ui.frontend/src
en voegt nieuwe omslagen genoemd mocks en json toe om de volgende omslagstructuur aan te passen:code language-plain |-- ui.frontend |-- src |-- mocks |-- json
-
Creeer een nieuw dossier genoemd en.model.json hieronder
ui.frontend/public/mocks/json
. Plak de output JSON van Stap 1 hier. -
Creeer een nieuw dossier proxy.mock.conf.json onder
ui.frontend
. Vul het bestand met het volgende:code language-json [ { "context": [ "/content/**/*.model.json" ], "pathRewrite": { "^/content/wknd-spa-angular/us" : "/mocks/json"} , "target": "http://localhost:4200", "logLevel": "debug" } ]
Deze proxyconfiguratie herschrijft aanvragen die beginnen met
/content/wknd-spa-angular/us
met/mocks/json
en die het overeenkomstige statische JSON-bestand leveren, bijvoorbeeld:code language-plain /content/wknd-spa-angular/us/en.model.json -> /mocks/json/en.model.json
-
Open het dossier angular.json. Voeg een nieuwe dev configuratie met een bijgewerkte activa serie toe om de gemaakte mocks omslag van verwijzingen te voorzien.
code language-json "dev": { "assets": [ "src/mocks", "src/assets", "src/favicon.ico", "src/logo192.png", "src/logo512.png", "src/manifest.json" ] },
Creërend een specifieke dev configuratie zorgt ervoor dat de mocks omslag slechts tijdens ontwikkeling wordt gebruikt en nooit aan AEM in een productie wordt opgesteld.
-
In het {dossier 0} angular.json, werk volgende de browserTarget configuratie bij om de nieuwe te gebruiken dev configuratie:
code language-diff ... "serve": { "builder": "@angular-devkit/build-angular:dev-server", "options": { + "browserTarget": "angular-app:build:dev" - "browserTarget": "angular-app:build" }, ...
-
Open het dossier
ui.frontend/package.json
en voeg een nieuw begin toe:mock bevel om het {dossier 3} proxy.mock.conf.json van verwijzingen te voorzien.code language-diff "scripts": { "start": "ng serve --open --proxy-config ./proxy.conf.json", + "start:mock": "ng serve --open --proxy-config ./proxy.mock.conf.json", "build": "ng lint && ng build && clientlib", "build:production": "ng lint && ng build --prod && clientlib", "test": "ng test", "sync": "aemsync -d -w ../ui.apps/src/main/content" }
Door een nieuwe opdracht toe te voegen, kunt u gemakkelijk schakelen tussen de proxyconfiguraties.
-
Als momenteel lopend, stop webpack dev server. Begin webpack dev server gebruikend het begin:mock manuscript:
code language-shell $ npm run start:mock > wknd-spa-angular@0.1.0 start:mock /Users/dgordon/Documents/code/aem-guides-wknd-spa/ui.frontend > ng serve --open --proxy-config ./proxy.mock.conf.json
Navigeer aan http://localhost:4200/content/wknd-spa-angular/us/en/home.htmlen u zou het zelfde SPA moeten zien maar de inhoud wordt nu getrokken uit het mock JSON- dossier.
-
Maak een kleine verandering in het {vroeger gecreeerd dossier 0} en.model.json. De bijgewerkte inhoud zou onmiddellijk in de webpack dev server moeten worden weerspiegeld.
Als u het JSON-model kunt manipuleren en de effecten op een live SPA kunt bekijken, kan een ontwikkelaar de JSON-model-API beter begrijpen. Het maakt ook zowel front-end als back-end ontwikkeling parallel mogelijk.
Stijlen met klasse toevoegen
Vervolgens wordt een bijgewerkte stijl toegevoegd aan het project. Dit project zal 🔗 steun van de Klasse voor een paar nuttige eigenschappen zoals variabelen toevoegen.
-
Open een eindvenster en stop webpack dev server als begonnen. Voer vanuit de
ui.frontend
-map de volgende opdracht in om de Angular-app bij te werken naar procesbestanden .scss .code language-shell $ cd ui.frontend $ ng config schematics.@schematics/angular:component.styleext scss
Hiermee werkt u het
angular.json
-bestand bij met een nieuwe vermelding onder aan het bestand:code language-json "schematics": { "@schematics/angular:component": { "styleext": "scss" } }
-
Installeer
normalize-scss
om de stijlen in verschillende browsers te normaliseren:code language-shell $ npm install normalize-scss --save
-
Ga terug naar de IDE en maak onder
ui.frontend/src
een nieuwe map met de naamstyles
. -
Maak een nieuw bestand onder
ui.frontend/src/styles
genaamd_variables.scss
en vult het met de volgende variabelen:code language-scss //_variables.scss //== Colors // //## Gray and brand colors for use across theme. $black: #202020; $gray: #696969; $gray-light: #EBEBEB; $gray-lighter: #F7F7F7; $white: #FFFFFF; $yellow: #FFEA00; $blue: #0045FF; //== Typography // //## Font, line-height, and color for body text, headings, and more. $font-family-sans-serif: "Helvetica Neue", Helvetica, Arial, sans-serif; $font-family-serif: Georgia, "Times New Roman", Times, serif; $font-family-base: $font-family-sans-serif; $font-size-base: 18px; $line-height-base: 1.5; $line-height-computed: floor(($font-size-base * $line-height-base)); // Functional Colors $brand-primary: $yellow; $body-bg: $white; $text-color: $black; $text-color-inverse: $gray-light; $link-color: $blue; //Layout $max-width: 1024px; $header-height: 75px; // Spacing $gutter-padding: 12px;
-
Wijzig de uitbreiding van het dossier styles.css bij
ui.frontend/src/styles.css
aan styles.scss. Vervang de inhoud door het volgende:code language-scss /* styles.scss * / /* Normalize */ @import '~normalize-scss/sass/normalize'; @import './styles/variables'; body { background-color: $body-bg; font-family: $font-family-base; margin: 0; padding: 0; font-size: $font-size-base; text-align: left; color: $text-color; line-height: $line-height-base; } body.page { max-width: $max-width; margin: 0 auto; padding: $gutter-padding; padding-top: $header-height; }
-
Werk angular.json bij en hernoem alle verwijzingen naar style.css met styles.scss. Er moeten drie verwijzingen zijn.
code language-diff "styles": [ - "src/styles.css" + "src/styles.scss" ],
Koptekststijlen bijwerken
Voeg daarna sommige merkspecifieke stijlen aan de component van de Kopbal toe gebruikend Sass.
-
Begin webpack dev server om de stijlen te zien die in real time bijwerken:
code language-shell $ npm run start:mock
-
Onder
ui.frontend/src/app/components/header
re-name header.component.css aan header.component.scss. Vul het bestand met het volgende:code language-scss @import "~src/styles/variables"; .header { width: 100%; position: fixed; top: 0; left:0; z-index: 99; background-color: $brand-primary; box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.24); } .header-container { display: flex; max-width: $max-width; margin: 0 auto; padding-left: $gutter-padding; padding-right: $gutter-padding; } .logo { z-index: 100; display: flex; padding-top: $gutter-padding; padding-bottom: $gutter-padding; } .logo-img { width: 100px; }
-
Update header.component.ts aan verwijzing header.component.scss:
code language-diff ... @Component({ selector: 'app-header', templateUrl: './header.component.html', - styleUrls: ['./header.component.css'] + styleUrls: ['./header.component.scss'] }) ...
-
Terugkeer aan browser en webpack dev server:
U zou de bijgewerkte stijlen nu moeten zien die aan de worden toegevoegd van de Kopbal component.
SPA updates voor AEM implementeren
De veranderingen die aan de Kopbal worden aangebracht zijn momenteel slechts zichtbaar door webpack dev server. Implementeer de bijgewerkte SPA om de wijzigingen te AEM.
-
Stop de webpack dev server.
-
Navigeer naar de hoofdmap van het project
/aem-guides-wknd-spa
en implementeer het project om het te AEM met Maven:code language-shell $ cd .. $ mvn clean install -PautoInstallSinglePackage
-
Navigeer aan http://localhost:4502/editor.html/content/wknd-spa-angular/us/en/home.html. U zou de bijgewerkte Kopbal met toegepast embleem en stijlen moeten zien:
Nu de bijgewerkte SPA in AEM is, kan het ontwerpen worden voortgezet.
Gefeliciteerd! congratulations
Gefeliciteerd, u hebt de SPA bijgewerkt en de integratie met AEM onderzocht! U kent nu twee verschillende benaderingen voor het ontwikkelen van de SPA tegen AEM JSON model API gebruikend a webpack dev server.
U kunt de gebeëindigde code op GitHubaltijd bekijken of de code uit controleren plaatselijk door aan de tak Angular/integrate-spa-solution
te schakelen.
Volgende stappen next-steps
SPA componenten van de Kaart aan AEM componenten- Leer hoe te om de componenten van de Angular aan Adobe Experience Manager (AEM) componenten met de AEM Redacteur JS SDK in kaart te brengen. Met componenttoewijzing kunnen auteurs dynamische updates uitvoeren naar SPA componenten in de AEM SPA Editor, net als bij traditionele AEM ontwerpen.