Integrare l’SPA developer-workflow
Comprendere come il codice sorgente di un’applicazione a pagina singola (SPA) scritto in React può essere integrato con un progetto Adobe Experience Manager (AEM). Scopri come utilizzare strumenti front-end moderni, come un server di sviluppo Webpack, per sviluppare rapidamente l’SPA contro l’API modello JSON dell’AEM.
Obiettivo
- Comprendere come il progetto SPA viene integrato con l’AEM con le librerie lato client.
- Scopri come utilizzare un server di sviluppo Webpack per lo sviluppo front-end dedicato.
- Esplorare l’utilizzo di proxy e statico finta file per lo sviluppo rispetto all’API del modello JSON AEM.
Cosa verrà creato
In questo capitolo verranno apportate diverse piccole modifiche all’SPA per comprendere come questo viene integrato con l’AEM.
Questo capitolo aggiungerà un semplice Header
all'SPA. Nel processo di costruzione di questo statico Header
componente vengono utilizzati diversi approcci allo sviluppo dell’SPA da parte dell’AEM.
L’SPA viene esteso per aggiungere un’ Header
componente
Prerequisiti
Esaminare gli strumenti e le istruzioni necessari per l'impostazione di un ambiente di sviluppo locale. Questo capitolo è una continuazione del Crea progetto capitolo, tuttavia, per seguire tutto ciò che serve è un progetto di lavoro SPA-abilitato AEM.
Approccio all’integrazione integration-approach
Nell’ambito del progetto AEM sono stati creati due moduli: ui.apps
e ui.frontend
.
Il ui.frontend
il modulo è un webpack progetto che contiene tutto il codice sorgente dell’SPA. La maggior parte dello sviluppo e dei test dell’SPA viene effettuata nel progetto webpack. Quando viene attivata una build di produzione, l’SPA viene generato e compilato utilizzando Webpack. Gli artefatti compilati (CSS e JavaScript) vengono copiati nel ui.apps
che viene quindi distribuito nel runtime AEM.
Rappresentazione di alto livello dell’integrazione dell’SPA.
Ulteriori informazioni sulla build front-end possono essere trovato qui.
Integrazione di Inspect con l’SPA inspect-spa-integration
Quindi, controlla ui.frontend
per comprendere l’SPA che è stato generato automaticamente dal Archetipo progetto AEM.
-
Nell’IDE che preferisci, apri il Progetto AEM. Questa esercitazione utilizzerà IDE codice Visual Studio.
-
Espandere ed esaminare
ui.frontend
cartella. Apri il fileui.frontend/package.json
-
Sotto
dependencies
ne dovresti vedere diversi relativi areact
tra cuireact-scripts
Il
ui.frontend
è un’applicazione React basata su Crea app React o CRA in breve. Ilreact-scripts
La versione indica la versione di CRA utilizzata. -
Esistono anche diverse dipendenze con prefisso
@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",
I moduli di cui sopra costituiscono SDK JS per l’editor SPA dell’AEM e fornire la funzionalità che consente di mappare i Componenti SPA ai Componenti AEM.
Sono inclusi anche Componenti WCM AEM - Implementazione React Core e Componenti WCM AEM - Editor SPA - Implementazione React Core. Si tratta di un set di componenti riutilizzabili dell’interfaccia utente mappati su componenti AEM predefiniti. Sono progettati per essere utilizzati così come sono e progettati per soddisfare le esigenze del progetto.
-
In
package.json
file sono presenti diversiscripts
definito:code language-json "scripts": { "start": "react-scripts start", "build": "react-scripts build && clientlib", "test": "react-scripts test", "eject": "react-scripts eject", }
Si tratta di script di build standard creati disponibile tramite l’app Create React.
L'unica differenza è l'aggiunta di
&& clientlib
albuild
script. Questa istruzione aggiuntiva è responsabile della copia dell'SPA compilato nelui.apps
come libreria lato client durante una generazione.Il modulo npm aem-clientlib-generator viene utilizzato per facilitare questa operazione.
-
Inspect il file
ui.frontend/clientlib.config.js
. Questo file di configurazione viene utilizzato da aem-clientlib-generator per determinare come generare la libreria client. -
Inspect il file
ui.frontend/pom.xml
. Questo file trasformaui.frontend
cartella in una Modulo Maven. Ilpom.xml
il file è stato aggiornato per utilizzare frontend-maven-plugin a test e build l’SPA durante una build Maven. -
Inspect il file
index.js
aui.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
è il punto di ingresso dell'SPA.ModelManager
è fornito dall’SDK JS dell’editor SPA dell’AEM. È responsabile della chiamata e dell’iniezione dellapageModel
(il contenuto JSON) nell’applicazione. -
Inspect il file
import-components.js
aui.frontend/src/components/import-components.js
. Questo file importa il predefinito Componenti core React e li rende disponibili per il progetto. Nel prossimo capitolo verrà esaminata la mappatura dei contenuti AEM sui componenti SPA.
Aggiungere un componente SPA statico static-spa-component
Quindi, aggiungi un nuovo componente all’SPA e implementa le modifiche in un’istanza AEM locale. Questo è un semplice cambiamento, giusto per illustrare come l'SPA viene aggiornato.
-
In
ui.frontend
modulo, sottoui.frontend/src/components
crea una nuova cartella denominataHeader
. -
Crea un file denominato
Header.js
sottoHeader
cartella. -
Popolare
Header.js
con le seguenti caratteristiche: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> ); } }
Il precedente è un componente React standard che genererà una stringa di testo statica.
-
Apri il file
ui.frontend/src/App.js
. Questo è il punto di ingresso dell'applicazione. -
Effettua i seguenti aggiornamenti a
App.js
per includere l'elemento staticoHeader
: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>
-
Apri un nuovo terminale e accedi al
ui.frontend
ed eseguire il comandonpm run build
comando: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
-
Accedi a
ui.apps
cartella. Sottoui.apps/src/main/content/jcr_root/apps/wknd-spa-react/clientlibs/clientlib-react
dovresti vedere che i file SPA compilati sono stati copiati dalui.frontend/build
cartella. -
Torna al terminale e passa alla
ui.apps
cartella. Esegui il seguente comando Maven: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] ------------------------------------------------------------------------
Verrà distribuito
ui.apps
in un'istanza locale in esecuzione dell'AEM. -
Apri una scheda del browser e passa a http://localhost:4502/editor.html/content/wknd-spa-react/us/en/home.html. Ora dovresti vedere il contenuto della sezione
Header
componente visualizzato nell’SPA.I passaggi precedenti vengono eseguiti automaticamente quando si attiva una build Maven dalla radice del progetto (ad esempio
mvn clean install -PautoInstallSinglePackage
). Ora dovresti comprendere le basi dell’integrazione tra l’SPA e le librerie lato client dell’AEM. Puoi comunque modificare e aggiungereText
componenti dell’AEM al di sotto delHeader
componente.
Server di sviluppo Webpack: proxy dell’API JSON proxy-json
Come visto negli esercizi precedenti, l’esecuzione di una build e la sincronizzazione della libreria client con un’istanza locale dell’AEM richiedono alcuni minuti. Questo è accettabile per i test finali, ma non è ideale per la maggior parte dello sviluppo dell'SPA.
A webpack-dev-server può essere utilizzata per sviluppare rapidamente l’SPA. L’SPA è guidato da un modello JSON generato dall’AEM. In questo esercizio il contenuto JSON di un’istanza in esecuzione dell’AEM è proxy nel server di sviluppo.
-
Torna all’IDE e apri il file
ui.frontend/package.json
.Cerca una riga simile alla seguente:
code language-json "proxy": "http://localhost:4502",
Il Crea app React fornisce un semplice meccanismo per proxy le richieste API. Tutte le richieste sconosciute vengono elaborate tramite proxy
localhost:4502
, il modulo di avvio rapido per l’AEM locale. -
Apri una finestra del terminale e passa a
ui.frontend
cartella. Esegui il comandonpm start
: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.
-
Apri una nuova scheda del browser (se non è già aperta) e passa a http://localhost:3000/content/wknd-spa-react/us/en/home.html.
Dovresti visualizzare gli stessi contenuti dell’AEM, ma senza le funzionalità di authoring abilitate.
note note NOTE A causa dei requisiti di sicurezza dell’AEM, dovrai aver effettuato l’accesso all’istanza AEM locale (http://localhost:4502) nello stesso browser ma in una scheda diversa. -
Torna all’IDE e crea un file denominato
Header.css
nelsrc/components/Header
cartella. -
Popolare il
Header.css
con le seguenti caratteristiche: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; }
-
Riapri
Header.js
e aggiungi la seguente riga come riferimentoHeader.css
:code language-diff //Header.js import React, {Component} from 'react'; + require('./Header.css');
Salva le modifiche.
-
Accedi a http://localhost:3000/content/wknd-spa-react/us/en/home.html per visualizzare le modifiche di stile riflesse automaticamente.
-
Apri il file
Page.css
aui.frontend/src/components/Page
. Apporta le seguenti modifiche per correggere la spaziatura:code language-css .page { max-width: 1024px; margin: 0 auto; padding: 12px; padding-top: 50px; }
-
Torna al browser all’indirizzo http://localhost:3000/content/wknd-spa-react/us/en/home.html. Dovresti vedere immediatamente le modifiche apportate all’app.
Puoi continuare a eseguire aggiornamenti dei contenuti in AEM e vederli riflessi in webpack-dev-server, dal momento che stiamo eseguendo il proxy del contenuto.
-
Arresta il server di sviluppo Webpack con
ctrl+c
nel terminale.
Distribuire gli aggiornamenti SPA all’AEM
Le modifiche apportate al Header
sono attualmente visibili solo tramite webpack-dev-server. Distribuire l’SPA aggiornato nell’AEM per visualizzare le modifiche.
-
Passa alla directory principale del progetto (
aem-guides-wknd-spa
) e implementa il progetto in AEM utilizzando Maven:code language-shell $ cd .. $ mvn clean install -PautoInstallSinglePackage
-
Accedi a http://localhost:4502/editor.html/content/wknd-spa-react/us/en/home.html. Dovresti visualizzare il
Header
e stili applicati.Ora che l’SPA aggiornato è in AEM, la creazione può continuare.
Congratulazioni. congratulations
Congratulazioni, hai aggiornato l’SPA ed esplorato l’integrazione con l’AEM! Ora sai come sviluppare l’SPA contro l’API del modello JSON dell’AEM utilizzando una webpack-dev-server.
Passaggi successivi next-steps
Mappare i componenti dell’SPA ai componenti dell’AEM - Scopri come mappare i componenti React ai componenti Adobe Experience Manager (AEM) con l’SDK JS dell’editor AEM SPA. La mappatura dei componenti consente agli utenti di apportare aggiornamenti dinamici ai componenti SPA nell’Editor SPA dell’AEM, in modo simile all’authoring AEM tradizionale.
(Bonus) Server di sviluppo Webpack - Mock dell’API JSON mock-json
Un altro approccio allo sviluppo rapido consiste nell’utilizzare un file JSON statico come modello JSON. "Deridendo" il JSON, rimuoviamo la dipendenza da un’istanza AEM locale. Consente inoltre a uno sviluppatore front-end di aggiornare il modello JSON per testare la funzionalità e apportare modifiche all’API JSON che verrebbero successivamente implementate da uno sviluppatore back-end.
L’impostazione iniziale del JSON fittizio richiedono un’istanza AEM locale.
-
Torna all’IDE e passa a
ui.frontend/public
e aggiungi una nuova cartella denominatamock-content
. -
Crea un nuovo file denominato
mock.model.json
sotto aui.frontend/public/mock-content
. -
Nel browser passa a http://localhost:4502/content/wknd-spa-react/us/en.model.json.
Questo è il JSON esportato dall’AEM che sta guidando l’applicazione. Copia l’output JSON.
-
Incolla l’output JSON dal passaggio precedente nel file
mock.model.json
. -
Apri il file
index.html
aui.frontend/public/index.html
. Aggiorna la proprietà dei metadati per il modello di pagina AEM per puntare a una variabile%REACT_APP_PAGE_MODEL_PATH%
:code language-html <!-- AEM page model --> <meta property="cq:pagemodel_root_url" content="%REACT_APP_PAGE_MODEL_PATH%" />
Utilizzo di una variabile per il valore della proprietà
cq:pagemodel_root_url
renderà più semplice passare dal modello proxy a quello json fittizio e viceversa. -
Apri il file
ui.frontend/.env.development
e apporta i seguenti aggiornamenti per commentare il valore precedente perREACT_APP_PAGE_MODEL_PATH
eREACT_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
-
Se è in esecuzione, arrestare webpack-dev-server. Avvia il webpack-dev-server dal terminale:
code language-shell $ cd ui.frontend $ npm start
Accedi a http://localhost:3000/content/wknd-spa-react/us/en/home.html e dovresti vedere l’SPA con lo stesso contenuto utilizzato negli proxy json.
-
Effettua una piccola modifica al
mock.model.json
file creato in precedenza. Dovresti vedere il contenuto aggiornato immediatamente riflesso nella webpack-dev-server.
La capacità di manipolare il modello JSON e di vedere gli effetti su un SPA in tempo reale può aiutare uno sviluppatore a comprendere l’API del modello JSON. Consente inoltre lo sviluppo sia front-end che back-end in parallelo.
Ora puoi attivare o disattivare la posizione in cui utilizzare il contenuto JSON attivando o disattivando le voci nel env.development
file:
# 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