De SPA integreren developer-workflow
Begrijp hoe de broncode voor een toepassing van de Enige Pagina (SPA) die in React 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 webpack-ontwikkelingsserver gebruikt voor speciale front-end ontwikkeling.
- Onderzoek het gebruik van a volmacht en statisch mock dossier voor het ontwikkelen tegen het modelAPI van AEM JSON.
Wat u gaat maken
In dit hoofdstuk brengt u enkele kleine wijzigingen aan in de SPA om te begrijpen hoe deze is geïntegreerd met AEM.
In dit hoofdstuk wordt een eenvoudige Header
-component aan de SPA toegevoegd. In het proces om deze statische Header
component uit te bouwen worden verscheidene benaderingen om SPA ontwikkeling te AEM 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. Dit hoofdstuk is een voortzetting van creeer het 1} hoofdstuk van het Project {, nochtans om langs allen te volgen u een werkend SPA-toegelaten AEM project nodig hebt.
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.
-
Open uw AEM Project in IDE van uw keuze. 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 verschillende koppelingen die verwant zijn aanreact
inclusiefreact-scripts
ui.frontend
is een React toepassing die op wordt gebaseerd Create React Appof CRA voor kort. De versiereact-scripts
geeft aan welke versie van CRA wordt gebruikt. -
Er zijn ook diverse afhankelijkheden die zijn voorafgegaan door
@adobe
:code language-json "@adobe/aem-react-editable-components": "~1.1.2", "@adobe/aem-spa-component-mapping": "~1.1.0", "@adobe/aem-spa-page-model-manager": "~1.3.3", "@adobe/aem-core-components-react-base": "1.1.8", "@adobe/aem-core-components-react-spa": "1.1.7",
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.
Ook inbegrepen zijn AEM Componenten WCM - Reageer de implementatie van de Kernen AEM Componenten WCM - de redacteur van de SPA - Reageer de implementatie van de Kern. Dit is een reeks herbruikbare UI-componenten die uit de doos AEM componenten worden toegewezen. Deze zijn ontworpen om ongewijzigd te worden gebruikt en worden vormgegeven om aan de behoeften van uw project te voldoen.
-
In het
package.json
-bestand zijn er verschillendescripts
gedefinieerd:code language-json "scripts": { "start": "react-scripts start", "build": "react-scripts build && clientlib", "test": "react-scripts test", "eject": "react-scripts eject", }
Dit zijn standaard bouwt manuscripten die beschikbaardoor Create React App worden gemaakt.
Het enige verschil is de toevoeging van
&& clientlib
aan hetbuild
-script. Deze extra instructie 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.
-
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
index.js
opui.frontend/src/index.js
:code language-js //ui.frontend/src/index.js ... document.addEventListener('DOMContentLoaded', () => { ModelManager.initialize().then(pageModel => { const history = createBrowserHistory(); render( <Router history={history}> <App history={history} cqChildren={pageModel[Constants.CHILDREN_PROP]} cqItems={pageModel[Constants.ITEMS_PROP]} cqItemsOrder={pageModel[Constants.ITEMS_ORDER_PROP]} cqPath={pageModel[Constants.PATH_PROP]} locationPathname={window.location.pathname} /> </Router>, document.getElementById('spa-root') ); }); });
index.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. -
Inspect het bestand
import-components.js
omui.frontend/src/components/import-components.js
. Dit dossier voert uit de doos Reageert de Componenten van de Kern in en stelt hen beschikbaar aan het project. We zullen de toewijzing van AEM inhoud aan SPA onderdelen in het volgende hoofdstuk controleren.
Een statische SPA toevoegen static-spa-component
Voeg vervolgens een nieuwe component aan de SPA toe en implementeer de wijzigingen in een lokale AEM. Dit is een eenvoudige wijziging, alleen om te laten zien hoe de SPA wordt bijgewerkt.
-
Maak onder
ui.frontend/src/components
in de moduleui.frontend
een nieuwe map met de naamHeader
. -
Maak een bestand met de naam
Header.js
onder de mapHeader
. -
Vul
Header.js
met het volgende:code language-js //Header.js import React, {Component} from 'react'; export default class Header extends Component { render() { return ( <header className="Header"> <div className="Header-container"> <h1>WKND</h1> </div> </header> ); } }
Hierboven bevindt zich een standaardcomponent React die een statische tekstreeks uitvoert.
-
Open het bestand
ui.frontend/src/App.js
. Dit is het ingangspunt van de toepassing. -
Voer de volgende updates uit in
App.js
om het statische objectHeader
op te nemen:code language-diff import { Page, withModel } from '@adobe/aem-react-editable-components'; import React from 'react'; + import Header from './components/Header/Header'; // This component is the application entry point class App extends Page { render() { return ( <div> + <Header /> {this.childComponents} {this.childPages} </div>
-
Open een nieuwe terminal, navigeer naar de map
ui.frontend
en voer de opdrachtnpm run build
uit:code language-shell $ cd aem-guides-wknd-spa $ cd ui.frontend $ npm run build ... Compiled successfully. File sizes after gzip: 118.95 KB (-33 B) build/static/js/2.489f399a.chunk.js 1.11 KB (+48 B) build/static/js/main.6cfa5095.chunk.js 806 B build/static/js/runtime-main.42b998df.js 451 B build/static/css/main.e57bbe8a.chunk.css
-
Navigeer naar de map
ui.apps
. Onderui.apps/src/main/content/jcr_root/apps/wknd-spa-react/clientlibs/clientlib-react
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-react/us/en/home.html. De inhoud van de component
Header
die in de SPA wordt weergegeven, wordt nu weergegeven.De bovenstaande stappen worden automatisch uitgevoerd wanneer u een Maven-build activeert vanuit de hoofdmap van het project (dat wil zeggen
mvn clean install -PautoInstallSinglePackage
). U zou nu de grondbeginselen van de integratie tussen de SPA en AEM cliënt-zijbibliotheken moeten begrijpen. U kuntText
-componenten nog steeds bewerken en toevoegen AEM onder de statischeHeader
-component.
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.
-
Keer terug naar winde en open het dossier
ui.frontend/package.json
.Zoek een lijn als deze:
code language-json "proxy": "http://localhost:4502",
creeer React Appeen gemakkelijk mechanisme aan volmacht API verzoeken. Alle onbekende aanvragen worden verlengd tot en met
localhost:4502
, de lokale AEM quickstart. -
Open een terminalvenster en navigeer naar de map
ui.frontend
. Voer de opdrachtnpm start
uit:code language-shell $ cd ui.frontend $ npm start ... Compiled successfully! You can now view wknd-spa-react in the browser. Local: http://localhost:3000 On Your Network: http://192.168.86.136:3000 Note that the development build is not optimized. To create a production build, use npm run build.
-
Open een nieuw browser lusje (als niet reeds geopend) en navigeer aan http://localhost:3000/content/wknd-spa-react/us/en/home.html.
U moet dezelfde inhoud zien als in AEM, maar zonder dat een van de ontwerpmogelijkheden is ingeschakeld.
note note NOTE Vanwege de beveiligingsvereisten voor AEM moet u zich in dezelfde browser maar op een ander tabblad aanmelden bij de lokale AEM (http://localhost:4502). -
Ga terug naar de IDE en maak een bestand met de naam
Header.css
in de mapsrc/components/Header
. -
Vul de
Header.css
met het volgende:code language-css .Header { background-color: #FFEA00; width: 100%; position: fixed; top: 0; left: 0; z-index: 99; box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.24); } .Header-container { display: flex; max-width: 1024px; margin: 0 auto; padding: 12px; } .Header-container h1 { letter-spacing: 0; font-size: 48px; }
-
Open
Header.js
opnieuw en voeg de volgende regel toe waarnaar moet worden verwezenHeader.css
:code language-diff //Header.js import React, {Component} from 'react'; + require('./Header.css');
Sla de wijzigingen op.
-
Navigeer aan http://localhost:3000/content/wknd-spa-react/us/en/home.htmlom de stijlveranderingen automatisch weerspiegeld te zien.
-
Open het bestand
Page.css
omui.frontend/src/components/Page
. Breng de volgende wijzigingen aan om de opvulling te herstellen:code language-css .page { max-width: 1024px; margin: 0 auto; padding: 12px; padding-top: 50px; }
-
Terugkeer aan browser in http://localhost:3000/content/wknd-spa-react/us/en/home.html. De wijzigingen in de app worden meteen weerspiegeld.
wordt toegevoegd
U kunt inhoudsupdates in AEM blijven maken en hen zien die in worden weerspiegeld webpack-dev-server, aangezien wij de inhoud proxying.
-
Stop de webpack-ontwikkelserver met
ctrl+c
in de terminal.
SPA updates voor AEM implementeren
De veranderingen die aan Header
worden aangebracht zijn momenteel slechts zichtbaar door webpack-dev-server. Implementeer de bijgewerkte SPA om de wijzigingen te AEM.
-
Navigeer aan de wortel van het project (
aem-guides-wknd-spa
) en stel het project op om AEM te gebruiken Maven:code language-shell $ cd .. $ mvn clean install -PautoInstallSinglePackage
-
Navigeer aan http://localhost:4502/editor.html/content/wknd-spa-react/us/en/home.html. De bijgewerkte
Header
en toegepaste stijlen worden weergegeven.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 weet nu hoe te om de SPA tegen AEM JSON modelAPI te ontwikkelen gebruikend a webpack-dev-server.
Volgende stappen next-steps
SPA componenten van de Kaart aan AEM componenten- Leer hoe te om componenten van het Antwoord aan de componenten van Adobe Experience Manager (AEM) met de AEM Redacteur JS SDK in kaart te brengen. Met componenttoewijzing kunnen gebruikers dynamische updates uitvoeren naar SPA componenten in de AEM SPA Editor, net als bij traditionele AEM ontwerpen.
(Bonus) 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.
-
Ga terug naar de IDE en navigeer naar
ui.frontend/public
en voeg een nieuwe map toe met de naammock-content
. -
Maak een nieuw bestand met de naam
mock.model.json
onderui.frontend/public/mock-content
. -
In browser navigeer aan http://localhost:4502/content/wknd-spa-react/us/en.model.json.
Dit is de JSON die wordt geëxporteerd door AEM die de toepassing stuurt. Kopieer de JSON-uitvoer.
-
Plak de JSON-uitvoer uit de vorige stap in het bestand
mock.model.json
. -
Open het bestand
index.html
omui.frontend/public/index.html
. Werk de eigenschap metadata voor het AEM paginamodel bij zodat deze naar een variabele verwijst%REACT_APP_PAGE_MODEL_PATH%
:code language-html <!-- AEM page model --> <meta property="cq:pagemodel_root_url" content="%REACT_APP_PAGE_MODEL_PATH%" />
Als u een variabele gebruikt voor de waarde van de
cq:pagemodel_root_url
, is het gemakkelijker om te schakelen tussen het proxymodel en het mock-jsmodel. -
Open het bestand
ui.frontend/.env.development
en voer de volgende updates uit om een opmerking te maken over de vorige waarde voorREACT_APP_PAGE_MODEL_PATH
enREACT_APP_API_HOST
:code language-diff + PUBLIC_URL=/ - PUBLIC_URL=/etc.clientlibs/wknd-spa-react/clientlibs/clientlib-react/resources - REACT_APP_PAGE_MODEL_PATH=/content/wknd-spa-react/us/en.model.json + REACT_APP_PAGE_MODEL_PATH=/mock-content/mock.model.json - REACT_APP_API_HOST=http://localhost:4502 + #REACT_APP_API_HOST=http://localhost:4502 REACT_APP_ROOT=/content/wknd-spa-react/us/en/home.html
-
Als momenteel lopend, stop webpack-dev-server. Begin webpack-dev-server van de terminal:
code language-shell $ cd ui.frontend $ npm start
Navigeer aan http://localhost:3000/content/wknd-spa-react/us/en/home.htmlen u zou de SPA met de zelfde inhoud moeten zien die in de volmacht json wordt gebruikt.
-
Breng een kleine wijziging aan in het
mock.model.json
-bestand dat u eerder hebt gemaakt. U zou de bijgewerkte inhoud onmiddellijk moeten zien die in wordt weerspiegeld webpack-dev-server.
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.
U kunt nu schakelen tussen de locatie waar de JSON-inhoud moet worden gebruikt door de items in het env.development
-bestand in en uit te schakelen:
# JSON API via proxy to AEM
#REACT_APP_PAGE_MODEL_PATH=/content/wknd-spa-react/us/en.model.json
#REACT_APP_API_HOST=http://localhost:4502
# JSON API via static mock file
REACT_APP_PAGE_MODEL_PATH=/mock-content/mock.model.json