Mapear componentes do SPA para componentes do AEM map-components

Saiba como mapear componentes do React para componentes do Adobe Experience Manager (AEM) com o SDK JS do editor do AEM SPA. O mapeamento de componentes permite que os usuários façam atualizações dinâmicas nos componentes do SPA no editor SPA AEM, de forma semelhante à criação tradicional do AEM.

Este capítulo detalha a API do modelo JSON do AEM e como o conteúdo JSON exposto por um componente AEM pode ser injetado automaticamente em um componente React como props.

Objetivo

  1. Saiba como mapear componentes de AEM para componentes de SPA.
  2. Inspect como um componente do React usa propriedades dinâmicas transmitidas do AEM.
  3. Saiba como usar os Componentes principais do AEM React prontos para uso.

O que você vai criar

Este capítulo inspeciona como o componente SPA Text fornecido é mapeado para o componente AEM Text. Os Componentes principais do React, como o componente SPA Image, são usados no SPA e criados no AEM. Os recursos prontos para uso das políticas do Contêiner de layout e Editor de modelos também podem ser usados para criar um modo de exibição um pouco mais variado na aparência.

Criação final de amostra de capítulo

Pré-requisitos

Revise as ferramentas e instruções necessárias para configurar um ambiente de desenvolvimento local. Este capítulo é uma continuação do capítulo Integrar o SPA. No entanto, para acompanhar tudo o que você precisa é de um projeto AEM habilitado para SPA.

Abordagem de mapeamento

O conceito básico é mapear um componente SPA para um componente AEM. Componentes do AEM, executar no lado do servidor, exportar conteúdo como parte da API do modelo JSON. O conteúdo JSON é consumido pelo SPA, executando no lado do cliente no navegador. Um mapeamento 1:1 entre componentes SPA e um componente AEM é criado.

Visão geral de alto nível do mapeamento de um componente AEM para um componente React

Visão geral de alto nível do mapeamento de um componente AEM para um componente React

Inspect, o componente de Texto

O Arquétipo de Projeto do AEM fornece um componente Text que é mapeado para o componente de Texto do AEM. Este é um exemplo de um componente conteúdo, no qual ele renderiza conteúdo do AEM.

Vamos ver como o componente funciona.

Inspect e o modelo JSON

  1. Antes de pular para o código SPA, é importante entender o modelo JSON que o AEM fornece. Navegue até a Biblioteca de Componentes principais e exiba a página do componente de Texto. A Biblioteca de componentes principais fornece exemplos de todos os componentes principais AEM.

  2. Selecione a guia JSON para um dos exemplos:

    Modelo JSON de texto

    Você deve ver três propriedades: text, richText e :type.

    :type é uma propriedade reservada que lista o sling:resourceType (ou caminho) do Componente AEM. O valor de :type é o que é usado para mapear o componente AEM para o componente SPA.

    text e richText são propriedades adicionais expostas ao componente SPA.

  3. Exiba a saída JSON em http://localhost:4502/content/wknd-spa-react/us/en.model.json. Você poderá encontrar uma entrada semelhante a:

    code language-json
    "text": {
        "id": "text-a647cec03a",
        "text": "<p>Hello World! Updated content!</p>\r\n",
        "richText": true,
        ":type": "wknd-spa-react/components/text",
        "dataLayer": {}
       }
    

Inspect do componente Texto SPA

  1. No IDE de sua escolha, abra o Projeto AEM para o SPA. Expanda o módulo ui.frontend e abra o arquivo Text.js em ui.frontend/src/components/Text/Text.js.

  2. A primeira área que vamos inspecionar é o class Text na linha ~40:

    code language-js
    class Text extends Component {
    
        get richTextContent() {
            return (<div
                    id={extractModelId(this.props.cqPath)}
                    data-rte-editelement
                    dangerouslySetInnerHTML={{__html: DOMPurify.sanitize(this.props.text)}} />
                    );
        }
    
        get textContent() {
            return <div>{this.props.text}</div>;
        }
    
        render() {
            return this.props.richText ? this.richTextContent : this.textContent;
        }
    }
    

    Text é um componente padrão do React. O componente usa this.props.richText para determinar se o conteúdo a ser renderizado será rich text ou texto simples. O "conteúdo" real usado vem de this.props.text.

    Para evitar um possível ataque XSS, o rich text é escapado por DOMPurify antes de usar dangerouslySetInnerHTML para renderizar o conteúdo. Lembre-se das propriedades richText e text do modelo JSON anteriormente neste exercício.

  3. A seguir, abra ui.frontend/src/components/import-components.js e dê uma olhada no TextEditConfig em ~linha 86:

    code language-js
    const TextEditConfig = {
    emptyLabel: 'Text',
    
        isEmpty: function(props) {
            return !props || !props.text || props.text.trim().length < 1;
        }
    };
    

    O código acima é responsável por determinar quando renderizar o espaço reservado no ambiente do autor do AEM. Se o método isEmpty retornar true, o espaço reservado será renderizado.

  4. Por fim, observe a chamada MapTo em ~line 94:

    code language-js
    export default MapTo('wknd-spa-react/components/text')(LazyTextComponent, TextEditConfig);
    

    MapTo é fornecido pelo SDK JS do Editor SPA AEM (@adobe/aem-react-editable-components). O caminho wknd-spa-react/components/text representa o sling:resourceType do componente AEM. Esse caminho corresponde ao :type exposto pelo modelo JSON observado anteriormente. MapTo cuida de analisar a resposta do modelo JSON e transmitir os valores corretos como props para o componente SPA.

    Você pode encontrar a definição do componente AEM Text em ui.apps/src/main/content/jcr_root/apps/wknd-spa-react/components/text.

Usar componentes principais do React

Componentes WCM do AEM - Implementação do React Core e Componentes WCM do AEM - Editor de Spa - Implementação do React Core. Trata-se de um conjunto de componentes reutilizáveis da interface do usuário que mapeiam para componentes AEM prontos para uso. A maioria dos projetos pode reutilizar esses componentes como ponto de partida para sua própria implementação.

  1. No código do projeto, abra o arquivo import-components.js em ui.frontend/src/components.
    Esse arquivo importa todos os componentes do SPA que são mapeados para componentes do AEM. Dada a natureza dinâmica da implementação do Editor de SPA, devemos fazer referência explícita a quaisquer componentes SPA que estejam vinculados a componentes com autor de AEM. Isso permite que um autor de AEM escolha usar um componente onde quiser no aplicativo.

  2. As seguintes declarações de importação incluem componentes SPA gravados no projeto:

    code language-js
    import './Page/Page';
    import './Text/Text';
    import './Container/Container';
    import './ExperienceFragment/ExperienceFragment';
    
  3. Há vários outros imports de @adobe/aem-core-components-react-spa e @adobe/aem-core-components-react-base. Eles estão importando os componentes principais do React e disponibilizando-os no projeto atual. Eles são mapeados para componentes AEM específicos do projeto usando o MapTo, exatamente como no exemplo de componente Text anterior.

Atualizar políticas de AEM

As políticas são um recurso dos modelos de AEM que fornece aos desenvolvedores e usuários avançados controle granular sobre quais componentes estão disponíveis para serem usados. Os Componentes principais do React estão incluídos no Código SPA, mas precisam ser ativados por meio de uma política antes de serem usados no aplicativo.

  1. Na tela inicial do AEM, navegue até Ferramentas > Modelos > Reação do WKND SPA.

  2. Selecione e abra o modelo de Página SPA para edição.

  3. Selecione o Contêiner de layout e clique em seu ícone de política para editar a política:

    política de contêiner de layout

  4. Em Componentes Permitidos > Reação SPA WKND - Conteúdo > verificar Imagem, Teaser e Título.

    Componentes atualizados disponíveis

    Em Componentes Padrão > Adicionar mapeamento e escolha o componente Imagem - Reação SPA WKND - Conteúdo:

    Definir componentes padrão

    Insira um tipo MIME de image/*.

    Clique em Concluído para salvar as atualizações de política.

  5. No Contêiner de Layout, clique no ícone política para o componente Texto.

    Crie uma nova política chamada Texto SPA WKND. Em Plugins > Formatação > marque todas as caixas para habilitar opções de formatação adicionais:

    Habilitar Formatação RTE

    Em Plug-ins > Estilos de parágrafo >, marque a caixa para Habilitar estilos de parágrafo:

    Habilitar estilos de parágrafo

    Clique em Concluído para salvar a atualização de política.

Conteúdo do autor

  1. Navegue até a Página inicial http://localhost:4502/editor.html/content/wknd-spa-react/us/en/home.html.

  2. Agora você pode usar os componentes adicionais Imagem, Teaser e Título na página.

    Componentes adicionais

  3. Você também pode editar o componente Text e adicionar outros estilos de parágrafo no modo tela cheia.

    Edição de Rich Text em Tela Inteira

  4. Você também pode arrastar e soltar uma imagem do Localizador de ativos:

    Arrastar e soltar imagem

  5. Experiência com os componentes Título e Teaser.

  6. Adicione suas próprias imagens via AEM Assets ou instale a base de código concluída para o site de referência WKND padrão. O site de referência da WKND inclui muitas imagens que podem ser reutilizadas no SPA da WKND. O pacote pode ser instalado usando o Gerenciador de Pacotes do AEM.

    Instalar wknd.all do Gerenciador de Pacotes

Inspect o contêiner de layout

O suporte para o Contêiner de layout é fornecido automaticamente pelo SDK do Editor de SPA AEM. O Contêiner de Layout, conforme indicado pelo nome, é um componente contêiner. Componentes de contêiner são componentes que aceitam estruturas JSON que representam outros componentes e os instanciam dinamicamente.

Vamos analisar mais detalhadamente o Contêiner de layout.

  1. Em um navegador, navegue até http://localhost:4502/content/wknd-spa-react/us/en.model.json

    API do modelo JSON - Grade responsiva

    O componente Contêiner de Layout tem um sling:resourceType de wcm/foundation/components/responsivegrid e é reconhecido pelo Editor de SPA usando a propriedade :type, exatamente como os componentes Text e Image.

    Os mesmos recursos de redimensionamento de um componente usando o Modo de layout estão disponíveis com o Editor de SPA.

  2. Retorne a http://localhost:4502/editor.html/content/wknd-spa-react/us/en/home.html. Adicione componentes adicionais de Imagem e tente redimensioná-los usando a opção Layout:

    Redimensionar imagem usando o modo Layout

  3. Abra novamente o modelo JSON http://localhost:4502/content/wknd-spa-react/us/en.model.json e observe o columnClassNames como parte do JSON:

    Nomes de Classe de Coluna

    O nome de classe aem-GridColumn--default--4 indica que o componente deve ter 4 colunas de largura com base em uma grade de 12 colunas. Mais detalhes sobre a grade responsiva podem ser encontrados aqui.

  4. Retorne ao IDE e no módulo ui.apps há uma biblioteca do lado do cliente definida em ui.apps/src/main/content/jcr_root/apps/wknd-spa-react/clientlibs/clientlib-grid. Abra o arquivo less/grid.less.

    Este arquivo determina os pontos de interrupção (default, tablet e phone) usados pelo Contêiner de Layout. Este arquivo deve ser personalizado de acordo com as especificações do projeto. Os pontos de interrupção estão definidos como 1200px e 768px.

  5. Você deve ser capaz de usar os recursos responsivos e as políticas de rich text atualizadas do componente Text para criar uma exibição como a seguinte:

    Criação final de amostra de capítulo

Parabéns. congratulations

Parabéns, você aprendeu a mapear componentes do SPA para componentes do AEM e usou os Componentes principais do React. Você também pode explorar os recursos responsivos do Contêiner de layout.

Próximas etapas next-steps

Navegação e Roteamento - Saiba como várias exibições no SPA podem ser suportadas pelo mapeamento para Páginas AEM com o SDK do Editor de SPA. A navegação dinâmica é implementada usando o Roteador React e os Componentes principais do React.

(Bônus) Configurações persistentes para o controle de origem bonus-configs

Em muitos casos, especialmente no início de um projeto AEM, é valioso manter as configurações, como modelos e políticas de conteúdo relacionadas, no controle de origem. Isso garante que todos os desenvolvedores trabalhem com o mesmo conjunto de conteúdo e configurações e possa garantir consistência adicional entre os ambientes. Quando um projeto atinge um determinado nível de maturidade, a prática de gerenciar modelos pode ser transferida para um grupo especial de usuários avançados.

As próximas etapas ocorrerão usando o IDE do Visual Studio Code e o VSCode AEM Sync, mas podem ser realizadas usando qualquer ferramenta e qualquer IDE que você tenha configurado para extrair ou importar conteúdo de uma instância local do AEM.

  1. No Visual Studio Code IDE, verifique se você tem o VSCode AEM Sync instalado por meio da extensão do Marketplace:

    Sincronização com AEM VSCode

  2. Expanda o módulo ui.content no Gerenciador de projetos e navegue até /conf/wknd-spa-react/settings/wcm/templates.

  3. Clique com o botão direito do mouse na pasta templates e selecione Importar do Servidor AEM:

    Modelo de importação do VSCode

  4. Repita as etapas para importar o conteúdo, mas selecione a pasta políticas localizada em /conf/wknd-spa-react/settings/wcm/templates/policies.

  5. Inspect o arquivo filter.xml localizado em ui.content/src/main/content/META-INF/vault/filter.xml.

    code language-xml
    <!--ui.content filter.xml-->
    <?xml version="1.0" encoding="UTF-8"?>
     <workspaceFilter version="1.0">
         <filter root="/conf/wknd-spa-react" mode="merge"/>
         <filter root="/content/wknd-spa-react" mode="merge"/>
         <filter root="/content/dam/wknd-spa-react" mode="merge"/>
         <filter root="/content/experience-fragments/wknd-spa-react" mode="merge"/>
     </workspaceFilter>
    

    O arquivo filter.xml é responsável por identificar os caminhos dos nós instalados com o pacote. Observe o mode="merge" em cada filtro que indica que o conteúdo existente não será modificado, somente o novo conteúdo será adicionado. Como os autores de conteúdo podem estar atualizando esses caminhos, é importante que uma implantação de código não substitua o conteúdo. Consulte a documentação do FileVault para obter mais detalhes sobre como trabalhar com elementos de filtro.

    Compare ui.content/src/main/content/META-INF/vault/filter.xml e ui.apps/src/main/content/META-INF/vault/filter.xml para entender os diferentes nós gerenciados por cada módulo.

(Bônus) Criar componente de imagem personalizado bonus-image

Um componente de Imagem SPA já foi fornecido pelos componentes principais do React. No entanto, se quiser praticar mais, crie sua própria implementação do React que mapeia para o AEM Componente de imagem. O componente Image é outro exemplo de um componente content.

Inspect, o JSON

Antes de pular para o código SPA, inspecione o modelo JSON fornecido pelo AEM.

  1. Navegue até os exemplos de imagem na biblioteca de Componentes principais.

    Componente principal de imagem JSON

    Propriedades de src, alt e title são usadas para popular o componente SPA Image.

    note note
    NOTE
    Há outras propriedades de Imagem expostas (lazyEnabled, widths) que permitem a um desenvolvedor criar um componente adaptável e de carregamento lento. O componente compilado neste tutorial é simples e não usa essas propriedades avançadas.

Implementar o componente de Imagem

  1. Em seguida, crie uma nova pasta chamada Image em ui.frontend/src/components.

  2. Abaixo da pasta Image crie um novo arquivo chamado Image.js.

    Arquivo Image.js

  3. Adicionar as seguintes instruções import a Image.js:

    code language-js
    import React, {Component} from 'react';
    import {MapTo} from '@adobe/aem-react-editable-components';
    
  4. Em seguida, adicione o ImageEditConfig para determinar quando mostrar o espaço reservado no AEM:

    code language-js
    export const ImageEditConfig = {
    
        emptyLabel: 'Image',
    
        isEmpty: function(props) {
            return !props || !props.src || props.src.trim().length < 1;
        }
    };
    

    O espaço reservado será exibido se a propriedade src não estiver definida.

  5. Em seguida, implemente a classe Image:

    code language-js
     export default class Image extends Component {
    
        get content() {
            return <img     className="Image-src"
                            src={this.props.src}
                            alt={this.props.alt}
                            title={this.props.title ? this.props.title : this.props.alt} />;
        }
    
        render() {
            if(ImageEditConfig.isEmpty(this.props)) {
                return null;
            }
    
            return (
                    <div className="Image">
                        {this.content}
                    </div>
            );
        }
    }
    

    O código acima renderizará um <img> com base nas propriedades src, alt e title passadas pelo modelo JSON.

  6. Adicione o código MapTo para mapear o componente React ao componente AEM:

    code language-js
    MapTo('wknd-spa-react/components/image')(Image, ImageEditConfig);
    

    Observe que a cadeia de caracteres wknd-spa-react/components/image corresponde ao local do componente AEM em ui.apps em: ui.apps/src/main/content/jcr_root/apps/wknd-spa-react/components/image.

  7. Crie um novo arquivo chamado Image.css no mesmo diretório e adicione o seguinte:

    code language-scss
    .Image-src {
        margin: 1rem 0;
        width: 100%;
        border: 0;
    }
    
  8. Em Image.js, adicione uma referência ao arquivo na parte superior abaixo das instruções import:

    code language-js
    import React, {Component} from 'react';
    import {MapTo} from '@adobe/aem-react-editable-components';
    
    require('./Image.css');
    
  9. Abra o arquivo ui.frontend/src/components/import-components.js e adicione uma referência ao novo componente Image:

    code language-js
    import './Page/Page';
    import './Text/Text';
    import './Container/Container';
    import './ExperienceFragment/ExperienceFragment';
    import './Image/Image'; //add reference to Image component
    
  10. Em import-components.js, comente a Imagem do Componente Principal do React:

    code language-js
    //MapTo('wknd-spa-react/components/image')(ImageV2, {isEmpty: ImageV2IsEmptyFn});
    

    Isso garantirá que nosso componente de Imagem personalizado seja usado no lugar.

  11. Na raiz do projeto, implante o código SPA no AEM usando Maven:

    code language-shell
    $ cd aem-guides-wknd-spa.react
    $ mvn clean install -PautoInstallSinglePackage
    
  12. Inspect o SPA no AEM. Todos os componentes de Imagem na página devem continuar a funcionar. O Inspect renderizou a saída e você deve ver a marcação do componente de Imagem personalizado em vez do componente principal do React.

    Marcação de componente de Imagem personalizada

    code language-html
    <div class="Image">
        <img class="Image-src" src="/content/image-src.jpg">
    </div>
    

    Marcação da imagem do componente principal do React

    code language-html
    <div class="cmp-image cq-dd-image">
        <img src="/content/image-src.jpg" class="cmp-image__image">
    </div>
    

    Esta é uma boa introdução à extensão e implementação de seus próprios componentes.

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