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
- Saiba como mapear componentes de AEM para componentes de SPA.
- Inspect como um componente do React usa propriedades dinâmicas transmitidas do AEM.
- 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.
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
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
-
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.
-
Selecione a guia JSON para um dos exemplos:
Você deve ver três propriedades:
text
,richText
e:type
.:type
é uma propriedade reservada que lista osling:resourceType
(ou caminho) do Componente AEM. O valor de:type
é o que é usado para mapear o componente AEM para o componente SPA.text
erichText
são propriedades adicionais expostas ao componente SPA. -
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
-
No IDE de sua escolha, abra o Projeto AEM para o SPA. Expanda o módulo
ui.frontend
e abra o arquivoText.js
emui.frontend/src/components/Text/Text.js
. -
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 usathis.props.richText
para determinar se o conteúdo a ser renderizado será rich text ou texto simples. O "conteúdo" real usado vem dethis.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 propriedadesrichText
etext
do modelo JSON anteriormente neste exercício. -
A seguir, abra
ui.frontend/src/components/import-components.js
e dê uma olhada noTextEditConfig
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. -
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 caminhowknd-spa-react/components/text
representa osling: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 comoprops
para o componente SPA.Você pode encontrar a definição do componente AEM
Text
emui.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.
-
No código do projeto, abra o arquivo
import-components.js
emui.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. -
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';
-
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 oMapTo
, exatamente como no exemplo de componenteText
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.
-
Na tela inicial do AEM, navegue até Ferramentas > Modelos > Reação do WKND SPA.
-
Selecione e abra o modelo de Página SPA para edição.
-
Selecione o Contêiner de layout e clique em seu ícone de política para editar a política:
-
Em Componentes Permitidos > Reação SPA WKND - Conteúdo > verificar Imagem, Teaser e Título.
Em Componentes Padrão > Adicionar mapeamento e escolha o componente Imagem - Reação SPA WKND - Conteúdo:
Insira um tipo MIME de
image/*
.Clique em Concluído para salvar as atualizações de política.
-
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:
Em Plug-ins > Estilos de parágrafo >, marque a caixa para Habilitar estilos de parágrafo:
Clique em Concluído para salvar a atualização de política.
Conteúdo do autor
-
Navegue até a Página inicial http://localhost:4502/editor.html/content/wknd-spa-react/us/en/home.html.
-
Agora você pode usar os componentes adicionais Imagem, Teaser e Título na página.
-
Você também pode editar o componente
Text
e adicionar outros estilos de parágrafo no modo tela cheia. -
Você também pode arrastar e soltar uma imagem do Localizador de ativos:
-
Experiência com os componentes Título e Teaser.
-
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.
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.
-
Em um navegador, navegue até http://localhost:4502/content/wknd-spa-react/us/en.model.json
O componente Contêiner de Layout tem um
sling:resourceType
dewcm/foundation/components/responsivegrid
e é reconhecido pelo Editor de SPA usando a propriedade:type
, exatamente como os componentesText
eImage
.Os mesmos recursos de redimensionamento de um componente usando o Modo de layout estão disponíveis com o Editor de SPA.
-
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:
-
Abra novamente o modelo JSON http://localhost:4502/content/wknd-spa-react/us/en.model.json e observe o
columnClassNames
como parte do JSON: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. -
Retorne ao IDE e no módulo
ui.apps
há uma biblioteca do lado do cliente definida emui.apps/src/main/content/jcr_root/apps/wknd-spa-react/clientlibs/clientlib-grid
. Abra o arquivoless/grid.less
.Este arquivo determina os pontos de interrupção (
default
,tablet
ephone
) 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 como1200px
e768px
. -
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:
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.
-
No Visual Studio Code IDE, verifique se você tem o VSCode AEM Sync instalado por meio da extensão do Marketplace:
-
Expanda o módulo ui.content no Gerenciador de projetos e navegue até
/conf/wknd-spa-react/settings/wcm/templates
. -
Clique com o botão direito do mouse na pasta
templates
e selecione Importar do Servidor AEM: -
Repita as etapas para importar o conteúdo, mas selecione a pasta políticas localizada em
/conf/wknd-spa-react/settings/wcm/templates/policies
. -
Inspect o arquivo
filter.xml
localizado emui.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 omode="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
eui.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.
-
Navegue até os exemplos de imagem na biblioteca de Componentes principais.
Propriedades de
src
,alt
etitle
são usadas para popular o componente SPAImage
.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
-
Em seguida, crie uma nova pasta chamada
Image
emui.frontend/src/components
. -
Abaixo da pasta
Image
crie um novo arquivo chamadoImage.js
. -
Adicionar as seguintes instruções
import
aImage.js
:code language-js import React, {Component} from 'react'; import {MapTo} from '@adobe/aem-react-editable-components';
-
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. -
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 propriedadessrc
,alt
etitle
passadas pelo modelo JSON. -
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 emui.apps
em:ui.apps/src/main/content/jcr_root/apps/wknd-spa-react/components/image
. -
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; }
-
Em
Image.js
, adicione uma referência ao arquivo na parte superior abaixo das instruçõesimport
:code language-js import React, {Component} from 'react'; import {MapTo} from '@adobe/aem-react-editable-components'; require('./Image.css');
-
Abra o arquivo
ui.frontend/src/components/import-components.js
e adicione uma referência ao novo componenteImage
:code language-js import './Page/Page'; import './Text/Text'; import './Container/Container'; import './ExperienceFragment/ExperienceFragment'; import './Image/Image'; //add reference to Image component
-
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.
-
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
-
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.