Cómo usar

  1. Clonar el repositorio adobe/aem-guides-wknd-graphql:

    $ git clone git@github.com:adobe/aem-guides-wknd-graphql.git
    
  2. Vaya al subdirectorio web-component.

    $ cd aem-guides-wknd-graphql/web-component
    
  3. AEM Edite el archivo .../src/person.js para incluir los detalles de conexión de la:

    AEM En el objeto aemHeadlessService, actualice aemHost para que apunte a su servicio de Publish de.

    # 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
    

    AEM AEM Si se conecta a un servicio de autor de, en el objeto aemCredentials, proporcione las credenciales de usuario local de la cuenta de usuario de la cuenta de usuario.

    # For Basic auth, use AEM ['user','pass'] pair (for example, when connecting to local AEM Author instance)
    username=admin
    password=admin
    
  4. Abra un terminal y ejecute los comandos de aem-guides-wknd-graphql/web-component:

    $ npm install
    $ npm start
    
  5. Una nueva ventana del explorador abre la página del HTML estático que incrusta el componente web en http://localhost:8080.

  6. El componente web Información de persona se muestra en la página web.

El código

AEM A continuación se muestra un resumen de cómo se crea el componente web, cómo se conecta a las consultas 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 del 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)

AEM AEM AEM Este componente web se basa en una configuración CORS basada en la que se ejecuta en el entorno de destino de la y supone que la página host se ejecuta en http://localhost:8080 en modo de desarrollo y a continuación se muestra una configuración OSGi de CORS de ejemplo para el servicio de autor de la local.

AEM Revise configuraciones de implementación para obtener el servicio correspondiente de la aplicación de.

Experience Manager