Bootstrap l’applicazione a pagina singola remota per l’editor di applicazioni a pagina singola
- Editor universale per la modifica visiva di contenuti headless.
- Editor frammenti di contenuto per la modifica di contenuti headless basata su modulo.
Prima di poter aggiungere le aree modificabili all’applicazione a pagina singola remota, è necessario avviarla con AEM SPA Editor JavaScript SDK e alcune altre configurazioni.
Installare le dipendenze npm di AEM SPA Editor JS SDK
Innanzitutto, controlla le dipendenze npm SPA di AEM per il progetto React e installale.
@adobe/aem-spa-page-model-manager: fornisce l'API per il recupero del contenuto da AEM.@adobe/aem-spa-component-mapping: fornisce l'API che mappa il contenuto di AEM ai componenti SPA.@adobe/aem-react-editable-componentsv2 : fornisce un'API per la creazione di componenti SPA personalizzati e implementazioni di uso comune, ad esempio il componente ReactAEMPage.
$ cd ~/Code/aem-guides-wknd-graphql/remote-spa-tutorial/react-app
$ npm install @adobe/aem-spa-page-model-manager
$ npm install @adobe/aem-spa-component-mapping
$ npm install @adobe/aem-react-editable-components
Rivedere le variabili di ambiente delle applicazioni a pagina singola
È necessario esporre diverse variabili di ambiente all’applicazione a pagina singola remota in modo che sappia come interagire con AEM.
-
Apri il progetto di applicazione a pagina singola remota in
~/Code/aem-guides-wknd-graphql/remote-spa-tutorial/react-appnell'IDE -
Apri il file
.env.development -
Nel file, presta particolare attenzione alle chiavi e, se necessario, aggiorna:
code language-none REACT_APP_HOST_URI=http://localhost:4502 REACT_APP_USE_PROXY=true REACT_APP_AUTH_METHOD=basic REACT_APP_BASIC_AUTH_USER=admin REACT_APP_BASIC_AUTH_PASS=admin
Ricorda che le variabili di ambiente personalizzate in React devono avere il prefisso
REACT_APP_.-
REACT_APP_HOST_URI: schema e host del servizio AEM a cui l'applicazione a pagina singola remota si connette.- Questo valore cambia in base all’eventuale ambiente AEM (locale, di sviluppo, stage o produzione) e al tipo di servizio AEM (authoring o pubblicazione)
-
REACT_APP_USE_PROXY: questo evita i problemi CORS durante lo sviluppo indicando al server di sviluppo react di inoltrare le richieste di AEM come/content, /graphql, .model.jsonutilizzando il modulohttp-proxy-middleware. -
REACT_APP_AUTH_METHOD: metodo di autenticazione per le richieste servite da AEM. Le opzioni sono 'service-token', 'dev-token', 'basic' o lascia vuoto per i casi di utilizzo senza autenticazione- Obbligatorio per l’utilizzo con AEM Author
- Possibile utilizzo con AEM Publish (se il contenuto è protetto)
- Lo sviluppo rispetto a AEM SDK supporta gli account locali tramite Autenticazione di base. Questo è il metodo utilizzato in questa esercitazione.
- Durante l'integrazione con AEM as a Cloud Service, utilizza token di accesso
-
REACT_APP_BASIC_AUTH_USER: AEM username dall'applicazione a pagina singola da autenticare durante il recupero del contenuto di AEM. -
REACT_APP_BASIC_AUTH_PASS: l'AEM password dall'applicazione a pagina singola da autenticare durante il recupero del contenuto di AEM.
-
Integrare l’API ModelManager
Con le dipendenze npm dell'applicazione a pagina singola AEM disponibili per l'app, inizializza ModelManager di AEM nel index.js del progetto prima che venga richiamato ReactDOM.render(...).
ModelManager è responsabile della connessione ad AEM per il recupero del contenuto modificabile.
-
Apri il progetto di applicazione a pagina singola remota nell’IDE
-
Apri il file
src/index.js -
Aggiungi l'importazione
ModelManagere inizializzala prima della chiamataroot.render(..),code language-javascript ... import { ModelManager } from "@adobe/aem-spa-page-model-manager"; // Initialize the ModelManager before invoking root.render(..). ModelManager.initializeAsync(); const container = document.getElementById('root'); const root = createRoot(container); root.render(<App />);
Il file src/index.js deve essere simile al seguente:
Configurare un proxy SPA interno
Durante la creazione di un'applicazione a pagina singola modificabile, è consigliabile impostare un proxy interno nell'applicazione a pagina singola, configurato per instradare le richieste appropriate ad AEM. Questa operazione viene eseguita utilizzando il modulo http-proxy-middleware npm, già installato dall'app GraphQL WKND di base.
-
Apri il progetto di applicazione a pagina singola remota nell’IDE
-
Apri il file in
src/proxy/setupProxy.spa-editor.auth.basic.js -
Aggiorna il file con il seguente codice:
code language-javascript const { createProxyMiddleware } = require('http-proxy-middleware'); const {REACT_APP_HOST_URI, REACT_APP_BASIC_AUTH_USER, REACT_APP_BASIC_AUTH_PASS } = process.env; /* Set up a proxy with AEM for local development In a production environment this proxy should be set up at the webserver level or absolute URLs should be used. */ module.exports = function(app) { /** * Filter to check if the request should be re-routed to AEM. The paths to be re-routed at: * - Starts with /content (AEM content) * - Starts with /graphql (AEM graphQL endpoint) * - Ends with .model.json (AEM Content Services) * * @param {*} path the path being requested of the SPA * @param {*} req the request object * @returns true if the SPA request should be re-routed to AEM */ const toAEM = function(path, req) { return path.startsWith('/content') || path.startsWith('/graphql') || path.endsWith('.model.json') } /** * Re-writes URLs being proxied to AEM such that they can resolve to real AEM resources * - The "root" case of `/.model.json` are rewritten to the SPA's home page in AEM * - .model.json requests for /adventure:xxx routes are rewritten to their corresponding adventure page under /content/wknd-app/us/en/home/adventure/ * * @param {*} path the path being requested of the SPA * @param {*} req the request object * @returns returns a re-written path, or nothing to use the @param path */ const pathRewriteToAEM = function (path, req) { if (path === '/.model.json') { return '/content/wknd-app/us/en/home.model.json'; } else if (path.startsWith('/adventure/') && path.endsWith('.model.json')) { return '/content/wknd-app/us/en/home/adventure/' + path.split('/').pop(); } } /** * Register the proxy middleware using the toAEM filter and pathRewriteToAEM rewriter */ app.use( createProxyMiddleware( toAEM, // Only route the configured requests to AEM { target: REACT_APP_HOST_URI, changeOrigin: true, // Pass in credentials when developing against an Author environment auth: `${REACT_APP_BASIC_AUTH_USER}:${REACT_APP_BASIC_AUTH_PASS}`, pathRewrite: pathRewriteToAEM // Rewrite SPA paths being sent to AEM } ) ); /** * Enable CORS on requests from the SPA to AEM * * If this rule is not in place, CORS errors will occur when running the SPA on http://localhost:3000 */ app.use((req, res, next) => { res.header("Access-Control-Allow-Origin", REACT_APP_HOST_URI); next(); }); };Il file
setupProxy.spa-editor.auth.basic.jsdeve essere simile al seguente:
Questa configurazione proxy esegue due operazioni principali:
-
Invia richieste specifiche effettuate all'applicazione a pagina singola (
http://localhost:3000) ad AEMhttp://localhost:4502- Esegue il proxy solo delle richieste i cui percorsi corrispondono a pattern che indicano che devono essere servite da AEM, come definito in
toAEM(path, req). - Riscrive i percorsi SPA nelle pagine AEM corrispondenti, come definito in
pathRewriteToAEM(path, req)
- Esegue il proxy solo delle richieste i cui percorsi corrispondono a pattern che indicano che devono essere servite da AEM, come definito in
-
Aggiunge intestazioni CORS a tutte le richieste per consentire l'accesso al contenuto di AEM, come definito da
res.header("Access-Control-Allow-Origin", REACT_APP_HOST_URI);- Se non viene aggiunto, si verificano errori CORS durante il caricamento del contenuto AEM nell’applicazione a pagina singola.
-
-
Apri il file
src/setupProxy.js -
Rivedere la riga che punta al file di configurazione proxy
setupProxy.spa-editor.auth.basic:code language-none ... case BASIC: // Use user/pass for local development with Local Author Env return require('./proxy/setupProxy.spa-editor.auth.basic'); ...
Eventuali modifiche apportate a src/setupProxy.js o ai relativi file di riferimento richiedono il riavvio dell'applicazione a pagina singola.
Risorsa SPA statica
Le risorse statiche di applicazioni a pagina singola, come il logo WKND e la grafica Loading, devono avere gli URL src aggiornati per forzarne il caricamento dall’host dell’applicazione a pagina singola remota. Se relativo, quando l’applicazione a pagina singola viene caricata nell’editor di applicazioni a pagina singola per l’authoring, per impostazione predefinita questi URL utilizzano l’host di AEM anziché l’applicazione a pagina singola, generando 404 richieste come illustrato nell’immagine seguente.
Per risolvere questo problema, fai in modo che una risorsa statica ospitata dall’applicazione a pagina singola remota utilizzi percorsi assoluti che includono l’origine dell’applicazione a pagina singola remota.
-
Apri il progetto SPA nell’IDE
-
Aprire il file delle variabili di ambiente dell'applicazione a pagina singola
src/.env.developmente aggiungere una variabile per l'URI pubblico dell'applicazione a pagina singola:code language-none ... # The base URI the SPA is accessed from REACT_APP_PUBLIC_URI=http://localhost:3000Durante la distribuzione in AEM as a Cloud Service, è necessario fare lo stesso per i file
.envcorrispondenti. -
Apri il file
src/App.js -
Importare l’URI pubblico dell’applicazione a pagina singola dalle variabili di ambiente dell’applicazione a pagina singola
code language-javascript const { REACT_APP_PUBLIC_URI } = process.env; function App() { ... } -
Aggiungi al logo WKND
<img src=.../>il prefissoREACT_APP_PUBLIC_URIper forzare la risoluzione rispetto all'applicazione a pagina singola.code language-html <img src={REACT_APP_PUBLIC_URI + '/' + logo} className="logo" alt="WKND Logo"/> -
Eseguire la stessa operazione per il caricamento dell'immagine in
src/components/Loading.jscode language-javascript const { REACT_APP_PUBLIC_URI } = process.env; class Loading extends Component { render() { return (<div className="loading"> <img src={REACT_APP_PUBLIC_URI + '/' + loadingIcon} alt="Loading..." /> </div>); } } -
E per le due istanze del pulsante Indietro in
src/components/AdventureDetails.jscode language-javascript const { REACT_APP_PUBLIC_URI } = process.env; function AdventureDetail(props) { ... render() { <img className="Backbutton-icon" src={REACT_APP_PUBLIC_URI + '/' + backIcon} alt="Return" /> } }
I file App.js, Loading.js e AdventureDetails.js dovrebbero avere un aspetto simile a:
Griglia reattiva AEM
Per supportare la modalità di layout dell’Editor SPA per le aree modificabili nell’SPA, è necessario integrare i CSS Griglia reattiva di AEM nell’SPA. Non preoccuparti: questo sistema di griglia è applicabile solo ai contenitori modificabili e puoi utilizzare il sistema di griglia desiderato per gestire il layout del resto dell’applicazione a pagina singola.
Aggiungi i file AEM Responsive Grid SCSS all’applicazione a pagina singola.
-
Apri il progetto SPA nell’IDE
-
Scaricare e copiare i due file seguenti in
src/styles- _grid.scss
- Il generatore SCSS di AEM Responsive Grid
- _grid-init.scss
- Richiama
_grid.scssutilizzando i punti di interruzione specifici dell'applicazione a pagina singola (desktop e mobile) e le colonne (12).
- Richiama
- _grid.scss
-
Apri
src/App.scsse importa./styles/grid-init.scsscode language-scss ... @import './styles/grid-init'; ...
I file _grid.scss e _grid-init.scss dovrebbero avere un aspetto simile a:
Ora l’applicazione a pagina singola include il CSS necessario per supportare la modalità di layout di AEM per i componenti aggiunti a un contenitore AEM.
Classi di utilità
Copia le seguenti classi di utilità nel progetto dell’app React.
- RoutedLink.js a
~/Code/aem-guides-wknd-graphql/remote-spa-tutorial/react-app/src/components/editable/core/RoutedLink.js - EditorPlaceholder.js in
~/Code/aem-guides-wknd-graphql/remote-spa-tutorial/react-app/src/components/editable/core/util/EditorPlaceholder.js - withConditionalPlaceholder.js a
~/Code/aem-guides-wknd-graphql/remote-spa-tutorial/react-app/src/components/editable/core/util/withConditionalPlaceholder.js - withStandardBaseCssClass.js a
~/Code/aem-guides-wknd-graphql/remote-spa-tutorial/react-app/src/components/editable/core/util/withStandardBaseCssClass.js
Avviare l’applicazione a pagina singola
Ora che l’applicazione a pagina singola è stata avviata per l’integrazione con AEM, eseguiamola e vediamo come si presenta.
-
Dalla riga di comando, passa alla directory principale del progetto SPA
-
Avvia l’applicazione a pagina singola utilizzando i comandi normali (se non l’hai già fatto)
code language-shell $ cd ~/Code/aem-guides-wknd-graphql/remote-spa-tutorial/react-app $ npm install $ npm run start -
Sfoglia l'applicazione a pagina singola in http://localhost:3000. Tutto dovrebbe avere un bell'aspetto!
Aprire l’applicazione a pagina singola nell’Editor SPA di AEM
Con l'applicazione a pagina singola in esecuzione su http://localhost:3000, apriamola utilizzando l'editor di applicazioni a pagina singola di AEM. Non è ancora possibile modificare nulla nell’applicazione a pagina singola; questa operazione convalida solo l’applicazione a pagina singola in AEM.
-
Accedi ad AEM Author
-
Passa a Sites > App WKND > us > en
-
Seleziona la home page dell'app WKND e tocca Modifica per visualizzare l'applicazione a pagina singola.
-
Passa a Anteprima utilizzando il commutatore modalità in alto a destra
-
Fai clic intorno all’applicazione a pagina singola
Congratulazioni.
Hai avviato l’applicazione a pagina singola remota per renderla compatibile con AEM SPA Editor. Ora sai come:
- Aggiungere le dipendenze npm JS SDK dell’Editor SPA di AEM al progetto SPA
- Configurare le variabili di ambiente dell’applicazione a pagina singola
- Integrare l’API ModelManager con l’applicazione a pagina singola
- Imposta un proxy interno per l’applicazione a pagina singola in modo che instradi le richieste di contenuto appropriate ad AEM
- Risolvere i problemi relativi alla risoluzione di risorse SPA statiche nel contesto dell’Editor SPA
- Aggiungi CSS griglia reattiva di AEM per supportare il layout nei contenitori modificabili di AEM
Passaggi successivi
Ora che abbiamo raggiunto una linea di base di compatibilità con l’Editor SPA di AEM, possiamo iniziare a introdurre aree modificabili. Viene innanzitutto esaminato come inserire un componente modificabile fisso nell'applicazione a pagina singola.