Web-Komponente

[AEM Headless as a Cloud Service]{class="badge informative"}

Beispielanwendungen eignen sich hervorragend, um die Headless-Funktionen von Adobe Experience Manager (AEM) zu erkunden. Diese Web-Komponenten-Anwendung zeigt, wie Sie mithilfe der GraphQL-APIs von AEM Inhalte mit persistierten Abfragen abfragen und einen Teil der Benutzeroberfläche mit reinem JavaScript-Code rendern können.

Web-Komponente mit AEM Headless

Sie finden den Quell-Code auf GitHub.

Voraussetzungen prerequisites

Folgende Tools sollten lokal installiert werden:

AEM-Anforderungen

Die Web-Komponente funktioniert mit den folgenden AEM Bereitstellungsoptionen.

Für diese Beispielanwendung müssen basic-tutorial-solution.content.zip installiert und die erforderlichen Bereitstellungskonfigurationen vorhanden sein.

IMPORTANT
Die Web-Komponente ist für die Verbindung mit einer AEM Publish-Umgebung konzipiert. Sie kann jedoch Inhalte von AEM Author beziehen, wenn die Authentifizierung in der Datei person.js der Web-Komponente angegeben ist.

Informationen zur Verwendung

  1. Klonen Sie das Repository adobe/aem-guides-wknd-graphql:

    code language-shell
    $ git clone git@github.com:adobe/aem-guides-wknd-graphql.git
    
  2. Navigieren Sie zum Unterverzeichnis web-component.

    code language-shell
    $ cd aem-guides-wknd-graphql/web-component
    
  3. Bearbeiten Sie die Datei .../src/person.js so, dass sie die AEM-Verbindungsdetails enthält:

    Aktualisieren Sie im aemHeadlessService-Objekt den aemHost, sodass er auf Ihren AEM-Veröffentlichungs-Service verweist.

    code language-plain
    # 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
    

    Wenn Sie eine Verbindung zu einem Service von AEM Author herstellen, geben Sie im aemCredentials-Objekt lokale AEM-Benutzeranmeldeinformationen an.

    code language-plain
    # For Basic auth, use AEM ['user','pass'] pair (for example, when connecting to local AEM Author instance)
    username=admin
    password=admin
    
  4. Öffnen Sie ein Terminal und führen Sie die Befehle aus aem-guides-wknd-graphql/web-component aus:

    code language-shell
    $ npm install
    $ npm start
    
  5. In einem neuen Browserfenster wird die statische HTML-Seite geöffnet, in die die Web-Komponente unter http://localhost:8080 eingebettet ist.

  6. Die Web-Komponente Personeninformationen wird auf der Webseite angezeigt.

Der Code

Im Folgenden finden Sie eine Zusammenfassung, wie die Web-Komponente aufgebaut ist, wie sie mit AEM Headless verbunden wird, um Inhalte mithilfe von persistierten GraphQL-Abfragen abzurufen, und wie diese Daten präsentiert werden. Den vollständigen Code finden Sie unter GitHub.

HTML-Tag der Web-Komponente

Eine wiederverwendbare Web-Komponente (auch als benutzerdefiniertes Element bezeichnet) <person-info> wird der HTML-Seite ../src/assets/aem-headless.html hinzugefügt. Es unterstützt host und query-param-value-Attribute, um das Verhalten der Komponente zu fördern. Der Wert des host-Attributs überschreibt den aemHost-Wert des aemHeadlessService-Objekts in person.js, und query-param-value wird zur Auswahl der darzustellenden Person verwendet.

    <person-info
        host="https://publish-p123-e456.adobeaemcloud.com"
        query-param-value="John Doe">
    </person-info>

Implementierung von Web-Komponenten

Die person.js definiert die Funktionalität der Web-Komponente und im Folgenden sind die wichtigsten Highlights aufgeführt.

PersonInfo-Element-Implementierung

Das Klassenobjekt des benutzerdefinierten Elements <person-info> definiert die Funktionalität durch die Verwendung der connectedCallback()-Lebenszyklusmethoden, das Anhängen eines Schatten-Stammverzeichnisses, das Abrufen einer persistierten GraphQL-Abfrage und die DOM-Manipulation zur Erstellung der internen Schatten-DOM-Struktur des benutzerdefinierten Elements.

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

Registrieren Sie das <person-info>-Element

    // Define the person-info element
    customElements.define("person-info", PersonInfo);

Cross-Origin Resource Sharing (CORS)

Diese Web-Komponente beruht auf einer AEM-basierten CORS-Konfiguration, die in der AEM-Zielumgebung ausgeführt wird, und geht davon aus, dass die Host-Seite auf http://localhost:8080 im Entwicklungsmodus ausgeführt wird. Darunter finden Sie eine Beispielkonfiguration für CORS OSGi für den lokalen Service von AEM Author.

Bitte überprüfen Sie die Bereitstellungskonfigurationen für den jeweiligen AEM-Service.

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