Bootstrap do SPA remoto para o editor SPA

Antes de ser possível adicionar as áreas editáveis ao SPA AEM remoto, ele deve ser inicializado com o SDK JavaScript do editor do SPA e algumas outras configurações.

AEM Instalar dependências npm do editor JS do SPA

AEM Primeiro, analise as dependências de SPA npm para o projeto React, e instale-as.

$ 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

Revisar variáveis de ambiente do SPA

Várias variáveis de ambiente devem ser expostas ao SPA remoto para que ele saiba como interagir com AEM.

  1. Abrir projeto SPA remoto em ~/Code/aem-guides-wknd-graphql/remote-spa-tutorial/react-app no IDE

  2. Abrir o arquivo .env.development

  3. No arquivo, preste atenção específica às chaves e atualize conforme necessário:

    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
    

    Variáveis de ambiente do SPA Remoto

    Lembre-se de que as variáveis de ambiente personalizadas no React devem receber o prefixo REACT_APP_.

    • REACT_APP_HOST_URI: o esquema e o host do serviço AEM ao qual o SPA Remoto se conecta.

      • Esse valor muda com base no tipo de serviço AEM (local, Desenvolvimento, Preparo ou Produção) e AEM (Autor vs. Publish)
    • REACT_APP_USE_PROXY: isso evita problemas do CORS durante o desenvolvimento, informando o servidor de desenvolvimento do react às solicitações do AEM do proxy, como /content, /graphql, .model.json usando o módulo http-proxy-middleware.

    • REACT_APP_AUTH_METHOD: método de autenticação para solicitações enviadas por AEM, as opções são 'service-token', 'dev-token', 'basic' ou deixe em branco para caso de uso sem autenticação

      • Obrigatório para uso com o AEM Author
      • Possivelmente necessário para uso com AEM Publish (se o conteúdo estiver protegido)
      • O desenvolvimento em relação ao SDK do AEM é compatível com contas locais via Autenticação básica. Este é o método usado neste tutorial.
      • Ao integrar com o AEM as a Cloud Service, use tokens de acesso
    • REACT_APP_BASIC_AUTH_USER: o AEM username do SPA para autenticar ao recuperar o conteúdo do AEM.

    • REACT_APP_BASIC_AUTH_PASS: a senha do AEM SPA para autenticar ao recuperar o conteúdo do AEM.

Integrar a API ModelManager

AEM Com as dependências SPA npm disponíveis para o aplicativo, inicializar AEM ModelManager no index.js do projeto antes de ReactDOM.render(...) ser chamado.

O ModelManager é responsável pela conexão com o AEM para recuperar o conteúdo editável.

  1. Abra o projeto do SPA remoto no IDE

  2. Abrir o arquivo src/index.js

  3. Adicionar importação ModelManager e inicializá-la antes da invocação 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 />);
    

O arquivo src/index.js deve ser semelhante a:

src/index.js

Configurar um proxy SPA interno

Ao criar um SPA editável, é melhor configurar um proxy interno no SPA, que seja configurado para rotear as solicitações apropriadas para o AEM. Isso é feito usando o módulo http-proxy-middleware npm, que já está instalado pelo aplicativo WKND GraphQL base.

  1. Abra o projeto do SPA remoto no IDE

  2. Abrir o arquivo em src/proxy/setupProxy.spa-editor.auth.basic.js

  3. Atualize o arquivo com o seguinte código:

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

    O arquivo setupProxy.spa-editor.auth.basic.js deve ser semelhante a:

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

    Essa configuração de proxy faz duas coisas principais:

    1. Solicitações específicas de proxy feitas ao SPA (http://localhost:3000) para AEM http://localhost:4502

      • Somente solicitações de proxy cujos caminhos correspondem a padrões que indicam que devem ser atendidos pelo AEM, conforme definido em toAEM(path, req).
      • Ele reescreve caminhos de SPA para suas páginas de AEM correspondentes, conforme definido em pathRewriteToAEM(path, req)
    2. Ele adiciona cabeçalhos CORS a todas as solicitações para permitir acesso a conteúdo AEM, conforme definido por res.header("Access-Control-Allow-Origin", REACT_APP_HOST_URI);

      • Se isso não for adicionado, erros do CORS ocorrem ao carregar o conteúdo de AEM no SPA.
  4. Abrir o arquivo src/setupProxy.js

  5. Revise a linha que aponta para o arquivo de configuração de 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');
    ...
    

Observe que qualquer alteração no src/setupProxy.js ou em seus arquivos referenciados requer a reinicialização do SPA.

Recurso estático de SPA

Os recursos estáticos de SPA, como o Logotipo WKND e o Carregamento de gráficos, precisam ter seus URLs src atualizados para forçá-los a serem carregados do host remoto SPA. Se relativo, quando o SPA é carregado no Editor SPA para criação, esses URLs assumem como padrão o uso do host do AEM SPA em vez do, resultando em 404 solicitações, conforme ilustrado na imagem abaixo.

Recursos estáticos desfeitos

Para resolver esse problema, faça com que um recurso estático hospedado pelo SPA remoto use caminhos absolutos que incluem a origem SPA remoto.

  1. Abra o projeto SPA no IDE

  2. Abra o arquivo de variáveis de ambiente SPA src/.env.development e adicione uma variável para o URI público SPA:

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

    Ao implantar no AEM as a Cloud Service, você precisa fazer o mesmo para os .env arquivos correspondentes.

  3. Abrir o arquivo src/App.js

  4. Importar o URI público do SPA das variáveis de ambiente SPA

    code language-javascript
    const {  REACT_APP_PUBLIC_URI } = process.env;
    
    function App() { ... }
    
  5. Prefixe o logotipo WKND <img src=.../> com REACT_APP_PUBLIC_URI para forçar a resolução contra o SPA.

    code language-html
    <img src={REACT_APP_PUBLIC_URI + '/' +  logo} className="logo" alt="WKND Logo"/>
    
  6. Faça o mesmo para carregar a imagem em 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. E para as duas instâncias do botão Voltar em 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" />
        }
    }
    

Os arquivos App.js, Loading.js e AdventureDetails.js devem ter a seguinte aparência:

Recursos estáticos

Grade responsiva AEM

Para dar suporte ao modo de layout do Editor de SPA para áreas editáveis no SPA, devemos integrar o CSS de Grade Responsiva do AEM ao SPA. Não se preocupe - esse sistema de grade é aplicável apenas aos contêineres editáveis e você pode usar o sistema de grade de sua escolha para direcionar o layout do restante do SPA.

Adicione os arquivos AEM Responsive Grid SCSS ao SPA.

  1. Abra o projeto SPA no IDE

  2. Baixe e copie os dois arquivos a seguir em src/styles

    • _grid.scss
      • O gerador de SCSS da grade responsiva AEM
    • _grid-init.scss
      • Invoca _grid.scss usando os pontos de interrupção específicos do SPA (desktop e dispositivos móveis) e colunas (12).
  3. Abrir src/App.scss e importar ./styles/grid-init.scss

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

Os arquivos _grid.scss e _grid-init.scss devem ter a seguinte aparência:

SCSS da Grade Responsiva do AEM

Agora, o SPA inclui o CSS necessário para oferecer suporte ao Modo de layout de AEM para componentes adicionados a um contêiner AEM.

Classes de utilitário

Copie as seguintes classes de utilitários no projeto de aplicativo React.

  • RoutedLink.js a ~/Code/aem-guides-wknd-graphql/remote-spa-tutorial/react-app/src/components/editable/core/RoutedLink.js
  • EditorPlaceholder.js a ~/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 to ~/Code/aem-guides-wknd-graphql/remote-spa-tutorial/react-app/src/components/editable/core/util/withStandardBaseCssClass.js

Classes de utilitário SPA remoto

Iniciar o SPA

Agora que o SPA está bootstrapped para integração com AEM, vamos executar o SPA e ver como ele se parece!

  1. Na linha de comando, navegue até a raiz do projeto SPA

  2. Inicie o SPA usando os comandos normais (se você ainda não tiver feito isso)

    code language-shell
    $ cd ~/Code/aem-guides-wknd-graphql/remote-spa-tutorial/react-app
    $ npm install
    $ npm run start
    
  3. Procurar o SPA em http://localhost:3000. Tudo deve ficar bem!

SPA em execução em http://localhost:3000

Abrir o SPA no Editor SPA do AEM

Com o SPA em execução em http://localhost:3000, vamos abri-lo usando o Editor SPA do AEM. Nada é editável no SPA ainda, isso só valida o SPA no AEM.

  1. Faça logon no AEM Author

  2. Navegue até Sites > Aplicativo WKND > us > en

  3. Selecione a Página Inicial do Aplicativo WKND e toque em Editar e o SPA será exibido.

    Editar Página Inicial do Aplicativo WKND

  4. Alternar para Visualização usando o alternador de modo no canto superior direito

  5. Clique ao redor do SPA

    SPA em execução em http://localhost:3000

Parabéns.

Você inicializou o SPA remoto para ser compatível com o Editor de SPA do AEM! Agora você sabe como:

  • Adicionar as dependências npm do SDK JS do SPA AEM Editor do ao projeto SPA
  • Configurar as variáveis de ambiente do SPA
  • Integrar a API ModelManager ao SPA
  • Configurar um proxy interno do SPA para que ele encaminhe as solicitações de conteúdo apropriadas para o AEM
  • Resolver problemas com recursos estáticos do SPA resolvidos no contexto do Editor de SPA
  • Adicionar CSS de grade responsiva do AEM para oferecer suporte à definição de layout em containers editáveis do AEM

Próximas etapas

AEM Agora que atingimos uma linha de base de compatibilidade com o SPA Editor, podemos começar a introduzir áreas editáveis. Primeiro, analisamos como colocar um componente editável fixo no SPA.

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