Cosa sono le librerie lato client

I siti richiedono l’elaborazione lato client di risorse JavaScript e CSS e statiche, come icone e font web. Una clientlib è un meccanismo dell'AEM a cui fare riferimento (se necessario per categoria) e che serve tali risorse.

L’AEM raccoglie i file CSS e JavaScript del sito in un unico file, in una posizione centrale, per garantire che nell’output HTML sia inclusa solo una copia di qualsiasi risorsa. In questo modo si ottimizza l'efficienza della distribuzione e si consente la gestione centralizzata di tali risorse nell'archivio tramite proxy, mantenendo l'accesso sicuro.

Sviluppo front-end per AEM as a Cloud Service

Tutte le risorse JavaScript, CSS e altre risorse front-end devono essere mantenute nel modulo ui.frontend dell'Archetipo progetto AEM. La flessibilità dell’archetipo consente di utilizzare i moderni strumenti web a tua scelta per creare e gestire tali risorse.

L'archetipo può quindi compilare le risorse in singoli file CSS e JS, incorporandoli automaticamente in un cq:clientLibraryFolder nell'archivio.

Struttura delle cartelle della libreria lato client

Una cartella di libreria lato client è un nodo di repository di tipo cq:ClientLibraryFolder. La sua definizione nella notazione CND è

[cq:ClientLibraryFolder] > sling:Folder
  - dependencies (string) multiple
  - categories (string) multiple
  - embed (string) multiple
  - channels (string) multiple
  • I nodi cq:ClientLibraryFolder possono essere posizionati ovunque all'interno della sottostruttura /apps dell'archivio.
  • Utilizzare la proprietà categories del nodo per identificare le categorie di libreria a cui appartiene.

Ogni cq:ClientLibraryFolder è compilato con un set di file JS e/o CSS, insieme ad alcuni file di supporto (vedi sotto). Le proprietà importanti di cq:ClientLibraryFolder sono configurate come segue:

  • allowProxy: poiché tutte le clientlibs devono essere archiviate in apps, questa proprietà consente l'accesso alle librerie client tramite il servlet proxy. Consulta la sezione Individuazione di una cartella della libreria client e utilizzo del servlet delle librerie client proxy di seguito.
  • categories: identifica le categorie in cui rientra il set di file JS e/o CSS in cq:ClientLibraryFolder. La proprietà categories, essendo multivalore, consente a una cartella di libreria di far parte di più di una categoria (vedere di seguito per informazioni sull'utilità di questa proprietà).

Se la cartella della libreria client contiene uno o più file di origine che, in fase di esecuzione, vengono uniti in un singolo file JS e/o CSS. Il nome del file generato è il nome del nodo con estensione .js o .css. Ad esempio, il nodo della libreria denominato cq.jquery genera il file generato denominato cq.jquery.js o cq.jquery.css.

Le cartelle delle librerie client contengono i seguenti elementi:

  • File sorgente JS e/o CSS
  • Risorse statiche che supportano gli stili CSS, ad esempio icone, caratteri web e così via.
  • Un file js.txt e/o un file css.txt che identificano i file di origine da unire nei file JS e/o CSS generati

Architettura Clientlib

Creazione di cartelle di librerie lato client

Le librerie client devono trovarsi in /apps. Questa regola è necessaria per isolare meglio il codice dal contenuto e dalla configurazione.

Per rendere accessibili le librerie client in /apps, viene utilizzato un servlet proxy. Gli ACL sono ancora applicati nella cartella della libreria client, ma il servlet consente la lettura del contenuto tramite /etc.clientlibs/ se la proprietà allowProxy è impostata su true.

  1. Aprire CRXDE Lite in un browser Web (https://<host>:<port>/crx/de).

  2. Selezionare la cartella /apps e fare clic su Crea > Crea nodo.

  3. Immettere un nome per la cartella della libreria e nell'elenco Tipo selezionare cq:ClientLibraryFolder. Fare clic su OK e quindi su Salva tutto.

  4. Per specificare la categoria o le categorie a cui appartiene la libreria, selezionare il nodo cq:ClientLibraryFolder, aggiungere la seguente proprietà e quindi fare clic su Salva tutto:

    • Nome: categories
    • Tipo: String
    • Valore: il nome della categoria
    • Multiplo: selezionato
  5. Per rendere accessibili le librerie client tramite proxy in /etc.clientlibs, selezionare il nodo cq:ClientLibraryFolder, aggiungere la seguente proprietà e quindi fare clic su Salva tutto:

    • Nome: allowProxy
    • Tipo: booleano
    • Valore: true
  6. Se è necessario gestire risorse statiche, creare una sottocartella denominata resources sotto la cartella della libreria client.

    • Se si archiviano risorse statiche in un punto qualsiasi diverso dalla cartella resources, non è possibile farvi riferimento in un'istanza Publish.
  7. Aggiungere i file di origine alla cartella della libreria.

    • Questa operazione viene in genere eseguita dal processo di compilazione front-end dell'Archetipo progetto AEM.
    • Se necessario, è possibile organizzare i file di origine in sottocartelle.
  8. Selezionare la cartella della libreria client e fare clic su Crea > Crea file.

  9. Nella casella Nome file digitare uno dei seguenti nomi di file e fare clic su OK:

    • js.txt: Utilizzare questo nome di file per generare un file JavaScript.
    • css.txt: Utilizzare questo nome di file per generare un foglio di stile CSS.
  10. Apri il file e digita il testo seguente per identificare la directory principale del percorso dei file di origine:

    • #base=*[root]*
    • Sostituire [root] con il percorso della cartella che contiene i file di origine, relativo al file TXT. Ad esempio, utilizza il testo seguente quando i file di origine si trovano nella stessa cartella del file TXT:
      • #base=.
    • Il codice seguente imposta la radice come cartella denominata mobile sotto il nodo cq:ClientLibraryFolder:
      • #base=mobile
  11. Nelle righe sottostanti #base=[root], digitare i percorsi dei file di origine relativi alla radice. Posizionare ogni nome di file su una riga separata.

  12. Fare clic su Salva tutto.

Distribuzione di librerie lato client

Una volta che la cartella della libreria client è configurata come richiesta, è possibile richiedere clientlibs tramite proxy. Ad esempio:

  • Hai una libreria client in /apps/myproject/clientlibs/foo
  • È presente un'immagine statica in /apps/myprojects/clientlibs/foo/resources/icon.png

La proprietà allowProxy consente di richiedere:

  • clientlib tramite /etc.clientlibs/myprojects/clientlibs/foo.js
  • Immagine statica tramite /etc.clientlibs/myprojects/clientlibs/foo/resources/icon.png

Caricamento delle librerie client tramite HTL

Una volta memorizzate e gestite correttamente le clientlibs nella cartella della libreria client, è possibile accedervi tramite HTL.

Le librerie client vengono caricate tramite un modello helper fornito da AEM, accessibile tramite data-sly-use. In questo file sono disponibili modelli di supporto che possono essere richiamati tramite data-sly-call.

Ogni modello helper richiede un’opzione categories per fare riferimento alle librerie client desiderate. Tale opzione può essere una matrice di valori stringa o una stringa contenente un elenco di valori separati da virgola.

Consulta la documentazione di HTL per ulteriori dettagli sul caricamento di clientlibs tramite HTL.

Librerie client di Author e Publish

La maggior parte delle clientlibs è richiesta nell’istanza di pubblicazione dell’AEM. In altre parole, lo scopo della maggior parte delle clientlibs è quello di produrre l’esperienza dell’utente finale del contenuto. Per clientlibs nelle istanze di pubblicazione, è possibile utilizzare strumenti di compilazione front-end e distribuirli tramite cartelle di librerie client come descritto in precedenza.

Tuttavia, in alcuni casi le librerie client possono essere necessarie per personalizzare l’esperienza di authoring. Ad esempio, per personalizzare una finestra di dialogo potrebbe essere necessario distribuire piccoli bit di CSS o JS nell’istanza di authoring dell’AEM.

Gestione delle librerie client durante l’authoring

Se è necessario utilizzare le librerie client per l'authoring, è possibile creare le librerie client in /apps utilizzando gli stessi metodi utilizzati per la pubblicazione, ma scriverle direttamente in /apps/.../clientlibs/foo anziché creare un intero progetto per gestirlo.

Puoi quindi effettuare l’hook in JS per l’authoring aggiungendo le librerie client a una categoria di librerie client preconfigurata.

Strumenti di debug

AEM fornisce diversi strumenti per il debug e il test delle cartelle delle librerie client.

Scopri le librerie client

Il componente /libs/cq/granite/components/dumplibs/dumplibs genera una pagina di informazioni su tutte le cartelle delle librerie client nel sistema. Il nodo /libs/granite/ui/content/dumplibs ha il componente come tipo di risorsa. Per aprire la pagina, utilizza il seguente URL (modificando l’host e la porta come richiesto):

https://<host>:<port>/libs/granite/ui/content/dumplibs.test.html

Le informazioni includono il percorso e il tipo della libreria (CSS o JS) e i valori degli attributi della libreria, come categorie e dipendenze. Le tabelle successive nella pagina mostrano le librerie in ogni categoria e canale.

Vedi Output generato

Il componente dumplibs include un selettore di test che visualizza il codice sorgente generato per i tag ui:includeClientLib. La pagina include il codice per diverse combinazioni di attributi js, css e a tema.

  1. Per aprire la pagina Output test, utilizzare uno dei metodi seguenti:

    • Dalla pagina dumplibs.html, fai clic sul collegamento nel testo Fai clic qui per il test dell'output.
    • Apri il seguente URL nel browser web (utilizza un host e una porta diversi, a seconda delle necessità):
      • http://<host>:<port>/libs/granite/ui/content/dumplibs.html
    • La pagina predefinita mostra l’output per i tag senza alcun valore per l’attributo categorie.
  2. Per visualizzare l'output di una categoria, digitare il valore della proprietà categories della libreria client e fare clic su Invia query.

Caratteristiche aggiuntive della cartella della libreria client

Esistono diverse altre funzioni supportate dalle cartelle delle librerie client in AEM. Tuttavia, questi non sono richiesti su AEM as a Cloud Service e come tali il loro utilizzo è sconsigliato. Sono elencati qui per completezza.

WARNING
Queste funzioni aggiuntive delle cartelle delle librerie client non sono necessarie in AEM as a Cloud Service e pertanto il loro utilizzo è sconsigliato. Sono elencati qui per completezza.

Gestione librerie Adobe Granite HTML

È possibile controllare ulteriori impostazioni della libreria client tramite il pannello Adobe Granite HTML Library Manager della console di sistema in https://<host>:<port>/system/console/configMgr).

Proprietà cartella aggiuntive

Altre proprietà della cartella includono consentono il controllo delle dipendenze e degli incorporamenti, ma in genere non sono più necessari e il loro utilizzo è sconsigliato:

  • dependencies: questo è un elenco di altre categorie di librerie client da cui dipende la cartella della libreria. Ad esempio, dati due nodi cq:ClientLibraryFolder F e G, se un file in F richiede un altro file in G per funzionare correttamente, almeno uno dei categories di G deve essere tra i dependencies di F.
  • embed: utilizzato per incorporare il codice da altre librerie. Se il nodo F incorpora i nodi G e H, il HTML risultante è una concatenazione di contenuto dai nodi G e H.

Collegamento alle dipendenze

Quando il codice nella cartella della libreria client fa riferimento ad altre librerie, identifica le altre librerie come dipendenze. Il tag ui:includeClientLib che fa riferimento alla cartella della libreria client fa in modo che il codice HTML includa un collegamento al file di libreria generato e alle dipendenze.

Le dipendenze devono essere un altro cq:ClientLibraryFolder. Per identificare le dipendenze, aggiungere una proprietà al nodo cq:ClientLibraryFolder con i seguenti attributi:

  • Nome: dipendenze
  • Tipo: Stringa[]
  • Valori: il valore della proprietà Categories del nodo cq:ClientLibraryFolder da cui dipende la cartella della libreria corrente.

/etc/clientlibs/myclientlibs/publicmain, ad esempio, ha una dipendenza dalla libreria cq.jquery. La pagina che fa riferimento alla libreria client principale genera HTML che include il seguente codice:

<script src="/etc/clientlibs/foundation/cq.jquery.js" type="text/javascript">
<script src="/etc/clientlibs/mylibs/publicmain.js" type="text/javascript">

Incorporazione Di Codice Da Altre Librerie

Puoi incorporare il codice da una libreria client a un’altra libreria client. In fase di esecuzione, i file JS e CSS generati della libreria di incorporamento includono il codice della libreria incorporata.

L’incorporamento del codice è utile per fornire accesso alle librerie memorizzate in aree protette dell’archivio.

Cartelle Libreria Client Specifiche Per L'App

È consigliabile mantenere tutti i file relativi all'applicazione nella cartella dell'applicazione al di sotto di /apps. È inoltre consigliabile negare l'accesso alla cartella /apps ai visitatori del sito Web. Per soddisfare entrambe le best practice, crea una cartella della libreria client sotto la cartella /etc che incorpora la libreria client al di sotto di /apps.

Utilizzare la proprietà Categories per identificare la cartella della libreria client da incorporare. Per incorporare la libreria, aggiungere una proprietà al nodo cq:ClientLibraryFolder che incorpora, utilizzando i seguenti attributi di proprietà:

  • Nome: incorporato
  • Tipo: Stringa[]
  • Valore: il valore della proprietà Categories del nodo cq:ClientLibraryFolder da incorporare.

Utilizzo dell’incorporamento per ridurre al minimo le richieste

In alcuni casi è possibile che il HTML finale generato per la pagina tipica dall'istanza Publish includa un numero relativamente elevato di <script> elementi.

In questi casi, può essere utile combinare in un unico file tutto il codice libreria client richiesto, in modo da ridurre il numero di richieste avanti e indietro al caricamento della pagina. A questo scopo, puoi embed le librerie richieste nella libreria client specifica per l'app utilizzando la proprietà embed del nodo cq:ClientLibraryFolder.

Percorsi nei file CSS

Quando incorpori file CSS, il codice CSS generato utilizza i percorsi delle risorse relativi alla libreria di incorporamento. Ad esempio, la libreria /etc/client/libraries/myclientlibs/publicmain accessibile al pubblico incorpora la libreria client /apps/myapp/clientlib:

Il file main.css contiene il seguente stile:

body {
  padding: 0;
  margin: 0;
  background: url(images/bg-full.jpg) no-repeat center top;
  width: 100%;
}

Il file CSS generato dal nodo publicmain contiene il seguente stile, che utilizza l'URL dell'immagine originale:

body {
  padding: 0;
  margin: 0;
  background: url(../../../apps/myapp/clientlib/styles/images/bg-full.jpg) no-repeat center top;
  width: 100%;
}

Vedi File incorporati nell’output di HTML

Per tracciare l’origine del codice incorporato o per garantire che le librerie client incorporate producano i risultati previsti, puoi visualizzare i nomi dei file incorporati in fase di esecuzione. Per visualizzare i nomi dei file, aggiungi il parametro debugClientLibs=true all'URL della pagina Web. La libreria generata contiene @import istruzioni invece del codice incorporato.

Nell'esempio della precedente sezione Incorporazione di codice da altre librerie, la cartella della libreria client /etc/client/libraries/myclientlibs/publicmain incorpora la cartella della libreria client /apps/myapp/clientlib. L’aggiunta del parametro alla pagina web genera il seguente collegamento nel codice sorgente della pagina web:

<link rel="stylesheet" href="/etc/clientlibs/mycientlibs/publicmain.css">

L'apertura del file publicmain.css rivela il seguente codice:

@import url("/apps/myapp/clientlib/styles/main.css");
  1. Nella casella dell’indirizzo del browser web, aggiungi il testo seguente all’URL del tuo HTML:
    • ?debugClientLibs=true
  2. Al caricamento della pagina, visualizza l’origine della pagina.
  3. Fai clic sul collegamento fornito come href per l’elemento collegamento per aprire il file e visualizzare il codice sorgente.

Utilizzo dei preprocessori

AEM consente preprocessori collegabili e viene fornito con il supporto per Compressore YUI per CSS e JavaScript e Compilatore di chiusura Google (GCC) per JavaScript con YUI impostato come preprocessore predefinito dell'AEM.

I preprocessori collegabili consentono un utilizzo flessibile, tra cui:

  • Definizione di ScriptProcessors che possono elaborare origini script
  • I processori sono configurabili con opzioni
  • I processori possono essere utilizzati per la minimizzazione, ma anche per i casi non minimizzati
  • La libreria client può definire quale processore utilizzare
NOTE
Per impostazione predefinita, l’AEM utilizza il compressore YUI. Per un elenco dei problemi noti, consulta la documentazione GitHub per il compressore YUI. Il passaggio al compressore GCC per particolari clientlibs può risolvere alcuni problemi osservati durante l’utilizzo di YUI.
CAUTION
Non inserire una libreria minimizzata in una libreria client. Fornisci invece la libreria raw e, se è richiesta la minimizzazione, utilizza le opzioni dei preprocessori.

Utilizzo

È possibile scegliere di configurare la configurazione dei preprocessori per libreria client o a livello di sistema.

  • Aggiungere le proprietà multivalore cssProcessor e jsProcessor nel nodo clientlibrary
  • Oppure definisci la configurazione predefinita del sistema tramite la configurazione OSGi di HTML Library Manager

Una configurazione del preprocessore sul nodo clientlib ha la precedenza sulla configurazione OSGI.