Bootstrap fjärr-SPA för SPA Editor

IMPORTANT
SPA-redigeraren har tagits bort för nya projekt. Det stöds fortfarande av Adobe för befintliga projekt, men bör inte användas för nya projekt. De redigerare som rekommenderas för hantering av headless-innehåll i AEM är nu:

Innan de redigerbara områdena kan läggas till i fjärr-SPA måste det startas med AEM SPA Editor JavaScript SDK och några andra konfigurationer.

Installera JS SDK npm-beroenden för AEM SPA Editor

Börja med att granska AEM SPA npm-beroenden för React-projektet och installera dem.

$ 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

Granska SPA-miljövariabler

Flera miljövariabler måste vara exponerade för fjärr-SPA så att de kan interagera med AEM.

  • Öppna fjärr-SPA-projekt på ~/Code/aem-guides-wknd-graphql/remote-spa-tutorial/react-app i din IDE

  • Öppna filen .env.development

  • Var särskilt uppmärksam på knapparna i filen och uppdatera efter behov:

    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
    

    Fjärrvariabler för SPA-miljö

    Kom ihåg att anpassade miljövariabler i React måste ha prefixet REACT_APP_.

    • REACT_APP_HOST_URI: schemat och värddatorn för den AEM-tjänst som fjärr-SPA ansluter till.

      • Det här värdet ändras baserat på om AEM-miljön (lokal, Dev, Stage eller Production) och AEM tjänsttyp (Författare kontra Publicera) ändras
    • REACT_APP_USE_PROXY: På så sätt undviker du CORS-problem under utvecklingen genom att tala om för responsutvecklingsservern att proxyköra AEM-begäranden som /content, /graphql, .model.json med modulen http-proxy-middleware.

    • REACT_APP_AUTH_METHOD: autentiseringsmetod för AEM-hanterade begäranden, alternativ är service-token, dev-token, basic eller lämna tomt för no-auth-användningsfall

      • Krävs för användning med AEM Author
      • Krävs eventuellt för användning med AEM Publish (om innehållet är skyddat)
      • Utvecklingar mot AEM SDK har stöd för lokala konton via Basic Auth. Det här är den metod som används i den här självstudien.
      • Använd åtkomsttoken när du integrerar med AEM as a Cloud Service
    • REACT_APP_BASIC_AUTH_USER: AEM username av SPA för autentisering när AEM-innehåll hämtas.

    • REACT_APP_BASIC_AUTH_PASS: AEM password av SPA för autentisering när AEM-innehåll hämtas.

Integrera ModelManager API

Med AEM SPA npm-beroenden tillgängliga för appen initierar du AEM ModelManager i projektets index.js innan ReactDOM.render(...) anropas.

ModelManager ansvarar för att ansluta till AEM för att hämta redigerbart innehåll.

  1. Öppna det fjärranslutna SPA-projektet i din IDE

  2. Öppna filen src/index.js

  3. Lägg till import ModelManager och initiera den före anropet root.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 />);
    

Filen src/index.js ska se ut så här:

src/index.js

Konfigurera en intern SPA-proxy

När du skapar en redigerbar SPA är det bäst att ställa in en intern proxy i SPA, som är konfigurerad att dirigera lämpliga begäranden till AEM. Detta görs genom att använda http-proxy-middleware npm-modulen, som redan är installerad av WKND-basens GraphQL-app.

  1. Öppna det fjärranslutna SPA-projektet i din IDE

  2. Öppna filen på src/proxy/setupProxy.spa-editor.auth.basic.js

  3. Uppdatera filen med följande kod:

    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();
        });
    };
    

    Filen setupProxy.spa-editor.auth.basic.js ska se ut så här:

    src/proxy/setupProxy.spa-editor.auth.basic.js

    Den här proxykonfigurationen gör två huvudsaker:

    1. Proxyservrar för specifika begäranden som gjorts till SPA (http://localhost:3000) till AEM http://localhost:4502

      • Det är bara proxybegäranden vars sökvägar matchar mönster som anger att de ska hanteras av AEM, enligt definitionen i toAEM(path, req).
      • SPA-sökvägar skrivs om till motsvarande AEM-sidor, enligt definitionen i pathRewriteToAEM(path, req)
    2. CORS-huvuden läggs till i alla begäranden om att tillåta åtkomst till AEM-innehåll, enligt definitionen av res.header("Access-Control-Allow-Origin", REACT_APP_HOST_URI);

      • Om detta inte läggs till inträffar CORS-fel när AEM-innehåll läses in i SPA-filen.
  4. Öppna filen src/setupProxy.js

  5. Granska raden som pekar på proxykonfigurationsfilen 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');
    ...
    

Observera att alla ändringar i src/setupProxy.js eller de refererade filerna kräver att SPA startas om.

Statisk SPA-resurs

Statiska SPA-resurser som WKND-logotypen och inläsningsgrafik måste ha sina src-URL:er uppdaterade för att de ska kunna läsas in från fjärranslutna SPA:s värd. Om den lämnas relativ och SPA läses in i SPA-redigeraren för redigering, används AEM-värddatorn som standard i stället för SPA, vilket resulterar i 404 begäranden enligt bilden nedan.

Brutna statiska resurser

För att lösa det här problemet måste du se till att en statisk resurs som hanteras av fjärr-SPA använder absoluta sökvägar som innehåller fjärr-SPA:ns ursprung.

  1. Öppna SPA-projektet i din utvecklingsmiljö

  2. Öppna din SPA-miljövariabelfil src/.env.development och lägg till en variabel för SPA:s offentliga URI:

    code language-none
    ...
    # The base URI the SPA is accessed from
    REACT_APP_PUBLIC_URI=http://localhost:3000
    

    När du distribuerar till AEM as a Cloud Service måste du göra samma sak för motsvarande .env-filer.

  3. Öppna filen src/App.js

  4. Importera SPA:s offentliga URI från SPA:s miljövariabler

    code language-javascript
    const {  REACT_APP_PUBLIC_URI } = process.env;
    
    function App() { ... }
    
  5. Använd WKND-logotypen <img src=.../> som prefix för REACT_APP_PUBLIC_URI för att tvinga fram upplösning mot SPA.

    code language-html
    <img src={REACT_APP_PUBLIC_URI + '/' +  logo} className="logo" alt="WKND Logo"/>
    
  6. Gör samma sak när du läser in bild i src/components/Loading.js

    code 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>);
        }
    }
    
  7. Och för två instanser av bakåtknappen i src/components/AdventureDetails.js

    code 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" />
        }
    }
    

Filerna App.js, Loading.js och AdventureDetails.js ska se ut så här:

Statiska resurser

AEM responsiva rutnät

För att ge stöd åt SPA Editors layoutläge för redigerbara områden i SPA måste vi integrera AEM responsiva CSS för stödraster i SPA. Oroa dig inte - det här rutnätssystemet gäller bara för de redigerbara behållarna, och du kan använda det rutnätssystem du väljer för att styra layouten för resten av SPA-filen.

Lägg till AEM Responsive Grid SCSS-filer i SPA.

  1. Öppna SPA-projektet i din utvecklingsmiljö

  2. Hämta och kopiera följande två filer till src/styles

    • _grid.scss
      • AEM Responsive Grid SCSS-generator
    • _grid-init.scss
      • Anropar _grid.scss med SPA:s specifika brytpunkter (skrivbord och mobil) och kolumnerna (12).
  3. Öppna src/App.scss och importera ./styles/grid-init.scss

    code language-scss
    ...
    @import './styles/grid-init';
    ...
    

Filerna _grid.scss och _grid-init.scss ska se ut så här:

AEM responsiv stödraster-SCSS

Nu innehåller SPA den CSS som krävs för att stödja AEM layoutläge för komponenter som läggs till i en AEM-behållare.

Verktygsklasser

Kopiera i följande verktygsklasser till ditt React-appprojekt.

  • RoutedLink.js till ~/Code/aem-guides-wknd-graphql/remote-spa-tutorial/react-app/src/components/editable/core/RoutedLink.js
  • EditorPlaceholder.js till ~/Code/aem-guides-wknd-graphql/remote-spa-tutorial/react-app/src/components/editable/core/util/EditorPlaceholder.js
  • withConditionalPlaceholder.js till ~/Code/aem-guides-wknd-graphql/remote-spa-tutorial/react-app/src/components/editable/core/util/withConditionalPlaceholder.js
  • withStandardBaseCssClass.js till ~/Code/aem-guides-wknd-graphql/remote-spa-tutorial/react-app/src/components/editable/core/util/withStandardBaseCssClass.js

Remote SPA-verktygsklasser

Starta SPA

Nu när SPA har startats för integrering med AEM kör vi SPA och ser hur det ser ut!

  1. På kommandoraden navigerar du till roten för SPA-projektet

  2. Starta SPA med de vanliga kommandona (om du inte redan har gjort det)

    code language-shell
    $ cd ~/Code/aem-guides-wknd-graphql/remote-spa-tutorial/react-app
    $ npm install
    $ npm run start
    
  3. Bläddra i SPA på http://localhost:3000. Allt borde se bra ut!

SPA körs på http://localhost:3000

Öppna SPA i AEM SPA Editor

När SPA körs på http://localhost:3000 kan vi öppna det med AEM SPA Editor. Inget är redigerbart i SPA än, detta validerar bara SPA i AEM.

  1. Logga in på AEM Author

  2. Navigera till Sites > WKND App > us > en

  3. Markera WKND-appens hemsida och tryck på Redigera så visas SPA-filen.

    Redigera startsida för WKND-program

  4. Växla till Förhandsgranska med lägesväljaren i det övre högra hörnet

  5. Klicka runt SPA

    SPA körs på http://localhost:3000

Grattis!

Du har startat fjärr-SPA för att vara AEM SPA Editor-kompatibel! Nu kan du:

  • Lägg till JS SDK npm-beroenden för AEM SPA Editor i SPA-projektet
  • Konfigurera dina SPA:s miljövariabler
  • Integrera ModelManager API med SPA
  • Konfigurera en intern proxy för SPA så att rätt innehållsbegäran dirigeras till AEM
  • Åtgärda problem med statiska SPA-resurser som åtgärdas i SPA-redigeraren
  • Lägg till AEM responsiv CSS för stödraster för layout i AEM redigerbara behållare

Nästa steg

Nu när vi har nått en nivå av kompatibilitet med AEM SPA Editor kan vi börja införa redigerbara områden. Vi tittar först på hur du placerar en fast redigerbar komponent i SPA.

recommendation-more-help
e25b6834-e87f-4ff3-ba56-4cd16cdfdec4