Componente web
- Se aplica a:
- Experience Manager as a Cloud Service
- Temas:
- Fragmentos de contenido
Creado para:
- Principiante
- Desarrollador
AEM Headless as a Cloud Service
Las aplicaciones de ejemplo son una buena manera de explorar las capacidades sin encabezado de Adobe Experience Manager (AEM). Esta aplicación de componente web muestra cómo consultar contenido mediante las API de GraphQL de AEM utilizando consultas persistentes y representando una parte de la interfaz de usuario, todo ello realizado utilizando código JavaScript puro.
Ver el código fuente en GitHub
Requisitos previos
Las siguientes herramientas deben instalarse localmente:
Requisitos de AEM
El componente web funciona con las siguientes opciones de implementación de AEM.
- AEM as a Cloud Service
- Configuración local mediante AEM Cloud Service SDK
- Requiere JDK 11 (si se conecta a AEM 6.5 local o AEM SDK)
Esta aplicación de ejemplo depende de basic-tutorial-solution.content.zip que se va a instalar y de que se hayan implementado las configuraciones de implementación necesarias.
person.js
del componente web.Cómo usar
-
Clonar el repositorio
adobe/aem-guides-wknd-graphql
:$ git clone git@github.com:adobe/aem-guides-wknd-graphql.git
-
Vaya al subdirectorio
web-component
.$ cd aem-guides-wknd-graphql/web-component
-
Edite el archivo
.../src/person.js
para incluir los detalles de conexión de AEM:En el objeto
aemHeadlessService
, actualiceaemHost
para que apunte a su servicio de publicación de AEM.# AEM Server namespace aemHost=https://publish-p123-e456.adobeaemcloud.com # AEM GraphQL API and Persisted Query Details graphqlAPIEndpoint=graphql/execute.json projectName=my-project persistedQueryName=person-by-name queryParamName=name
Si se conecta a un servicio de AEM Author, en el objeto
aemCredentials
, proporcione las credenciales de usuario locales de AEM.# For Basic auth, use AEM ['user','pass'] pair (for example, when connecting to local AEM Author instance) username=admin password=admin
-
Abra un terminal y ejecute los comandos de
aem-guides-wknd-graphql/web-component
:$ npm install $ npm start
-
Una nueva ventana del explorador abre la página estática de HTML que incrusta el componente web en http://localhost:8080.
-
El componente web Información de persona se muestra en la página web.
El código
A continuación se muestra un resumen de cómo se crea el componente web, cómo se conecta a AEM sin encabezado para recuperar contenido mediante consultas persistentes de GraphQL y cómo se presentan esos datos. El código completo se encuentra en GitHub.
Etiqueta de HTML de componente web
Se agrega un componente web reutilizable (también conocido como elemento personalizado) <person-info>
a la página de HTML ../src/assets/aem-headless.html
. Admite los atributos host
y query-param-value
para controlar el comportamiento del componente. El valor del atributo host
invalida el valor aemHost
del objeto aemHeadlessService
en person.js
, y query-param-value
se usa para seleccionar a la persona que se va a procesar.
<person-info
host="https://publish-p123-e456.adobeaemcloud.com"
query-param-value="John Doe">
</person-info>
Implementación de componentes web
person.js
define la funcionalidad del componente web y a continuación se muestran los aspectos destacados de la misma.
Implementación del elemento PersonInfo
El objeto de clase del elemento personalizado <person-info>
define la funcionalidad mediante los métodos de ciclo de vida connectedCallback()
, adjuntando una raíz central, recuperando la consulta persistente de GraphQL y la manipulación DOM para crear la estructura DOM central interna del elemento personalizado.
// Create a Class for our Custom Element (person-info)
class PersonInfo extends HTMLElement {
constructor() {
...
// Create a shadow root
const shadowRoot = this.attachShadow({ mode: "open" });
...
}
...
// lifecycle callback :: When custom element is appended to document
connectedCallback() {
...
// Fetch GraphQL persisted query
this.fetchPersonByNamePersistedQuery(headlessAPIURL, queryParamValue).then(
({ data, err }) => {
if (err) {
console.log("Error while fetching data");
} else if (data?.personList?.items.length === 1) {
// DOM manipulation
this.renderPersonInfoViaTemplate(data.personList.items[0], host);
} else {
console.log(`Cannot find person with name: ${queryParamValue}`);
}
}
);
}
...
//Fetch API makes HTTP GET to AEM GraphQL persisted query
async fetchPersonByNamePersistedQuery(headlessAPIURL, queryParamValue) {
...
const response = await fetch(
`${headlessAPIURL}/${aemHeadlessService.persistedQueryName}${encodedParam}`,
fetchOptions
);
...
}
// DOM manipulation to create the custom element's internal shadow DOM structure
renderPersonInfoViaTemplate(person, host){
...
const personTemplateElement = document.getElementById('person-template');
const templateContent = personTemplateElement.content;
const personImgElement = templateContent.querySelector('.person_image');
personImgElement.setAttribute('src',
host + (person.profilePicture._dynamicUrl || person.profilePicture._path));
personImgElement.setAttribute('alt', person.fullName);
...
this.shadowRoot.appendChild(templateContent.cloneNode(true));
}
}
Registrar el elemento <person-info>
// Define the person-info element
customElements.define("person-info", PersonInfo);
Uso compartido de recursos de origen cruzado (CORS)
Este componente web se basa en una configuración CORS basada en AEM que se ejecuta en el entorno AEM de destino y supone que la página host se ejecuta en http://localhost:8080
en modo de desarrollo y a continuación se muestra un ejemplo de configuración CORS OSGi para el servicio AEM Author local.
Revise configuraciones de implementación para el servicio de AEM correspondiente.