Librerie client e workflow front-end client-side-libraries
Scopri come le librerie o le clientlibs lato client vengono utilizzate per distribuire e gestire CSS e JavaScript per un’implementazione di Adobe Experience Manager (AEM) Sites. Questo tutorial illustra anche come integrare il modulo ui.frontend, un progetto webpack separato, nel processo di build end-to-end.
Prerequisiti prerequisites
Esaminare gli strumenti e le istruzioni necessari per configurare un ambiente di sviluppo locale.
Si consiglia inoltre di rivedere l'esercitazione sulle nozioni di base dei componenti per comprendere le nozioni di base delle librerie lato client e dell'AEM.
Progetto iniziale
Consulta il codice della riga di base su cui si basa l’esercitazione:
-
Controlla il ramo
tutorial/client-side-libraries-start
da GitHubcode language-shell $ cd aem-guides-wknd $ git checkout tutorial/client-side-libraries-start
-
Implementa la base di codice in un’istanza AEM locale utilizzando le tue competenze Maven:
code language-shell $ mvn clean install -PautoInstallSinglePackage
note note NOTE Se utilizzi AEM 6.5 o 6.4, aggiungi il profilo classic
a qualsiasi comando Maven.code language-shell $ mvn clean install -PautoInstallSinglePackage -Pclassic
Puoi sempre visualizzare il codice finito su GitHub o estrarre il codice localmente passando al ramo tutorial/client-side-libraries-solution
.
Obiettivi
- Scopri in che modo le librerie lato client vengono incluse in una pagina tramite un modello modificabile.
- Scopri come utilizzare il modulo
ui.frontend
e un server di sviluppo Webpack per lo sviluppo front-end dedicato. - Comprendi il flusso di lavoro end-to-end per distribuire CSS e JavaScript compilati a un’implementazione di Sites.
Cosa intendi creare what-build
In questo capitolo, aggiungi alcuni stili di base per il sito WKND e il modello della pagina dell'articolo per avvicinare l'implementazione ai modelli di progettazione dell'interfaccia utente. Puoi utilizzare un flusso di lavoro front-end avanzato per integrare un progetto Webpack in una libreria client AEM.
Pagina articolo con stili linea di base applicati
Informazioni di base background
Le librerie lato client forniscono un meccanismo per organizzare e gestire i file CSS e JavaScript necessari per un’implementazione AEM Sites. Gli obiettivi di base per le librerie lato client o clientlibs sono:
- Memorizza CSS/JS in piccoli file discreti per facilitarne lo sviluppo e la manutenzione
- Gestire le dipendenze da framework di terze parti in modo organizzato
- Riduci al minimo il numero di richieste lato client concatenando CSS/JS in una o due richieste.
Ulteriori informazioni sull'utilizzo di Librerie lato client sono disponibili qui.
Le librerie lato client presentano alcune limitazioni. In particolare, è un supporto limitato per i linguaggi front-end più popolari come Sass, LESS e TypeScript. Nell'esercitazione, vediamo in che modo il modulo ui.frontend può contribuire a risolvere questo problema.
Distribuire la base di codice iniziale in un'istanza AEM locale e passare a http://localhost:4502/editor.html/content/wknd/us/en/magazine/guide-la-skateparks.html. Questa pagina non è formattata. Implementiamo le librerie lato client per il brand WKND per aggiungere CSS e JavaScript alla pagina.
Organizzazione delle librerie lato client organization
Esaminiamo ora l'organizzazione delle clientlibs generate da Archetipo progetto AEM.
Diagramma di alto livello: organizzazione della libreria lato client e inclusione delle pagine
-
Utilizzando VSCode o un altro IDE, apri il modulo ui.apps.
-
Espandere il percorso
/apps/wknd/clientlibs
per visualizzare le clientlibs generate dall'archetipo.Nella sezione seguente, queste clientlibs sono esaminate in maggiore dettaglio.
-
Nella tabella seguente sono riepilogate le librerie client. Ulteriori dettagli su incluse le librerie client sono disponibili qui.
table 0-row-3 1-row-3 2-row-3 3-row-3 4-row-3 Nome Descrizione Note clientlib-base
Livello base di CSS e JavaScript necessario per il funzionamento del sito WKND incorpora le librerie client dei Componenti core clientlib-grid
Genera il file CSS necessario per il funzionamento della modalità Layout. I punti di interruzione per dispositivi mobili/tablet possono essere configurati qui clientlib-site
Contiene il tema specifico per il sito WKND Generato dal modulo ui.frontend
clientlib-dependencies
Incorpora qualsiasi dipendenza di terze parti Generato dal modulo ui.frontend
-
Si noti che
clientlib-site
eclientlib-dependencies
vengono ignorati dal controllo del codice sorgente. Questo è per progettazione, poiché questi sono generati in fase di build dal moduloui.frontend
.
Aggiorna stili di base base-styles
Aggiornare quindi gli stili di base definiti nel modulo ui.frontend. I file nel modulo ui.frontend
generano le librerie clientlib-site
e clientlib-dependecies
che contengono il tema del sito ed eventuali dipendenze di terze parti.
Le librerie lato client non supportano linguaggi più avanzati come Sass o TypeScript. Esistono diversi strumenti open source come NPM e webpack che accelerano e ottimizzano lo sviluppo front-end. L'obiettivo del modulo ui.frontend è quello di poter utilizzare questi strumenti per gestire la maggior parte dei file di origine front-end.
-
Apri il modulo ui.frontend e passa a
src/main/webpack/site
. -
Apri il file
main.scss
main.scss
è il punto di ingresso ai file Sass nel moduloui.frontend
. Include il file_variables.scss
, che contiene una serie di variabili del brand da utilizzare nei diversi file Sass del progetto. Il file_base.scss
è incluso e definisce alcuni stili di base per gli elementi HTML. Un'espressione regolare include gli stili dei singoli componenti insrc/main/webpack/components
. Un'altra espressione regolare include i file insrc/main/webpack/site/styles
. -
Inspect il file
main.ts
. Includemain.scss
e un'espressione regolare per raccogliere qualsiasi file.js
o.ts
nel progetto. Questo punto di ingresso viene utilizzato dai file di configurazione Webpack come punto di ingresso per l'intero moduloui.frontend
. -
Inspect i file sotto
src/main/webpack/site/styles
:Questi file contengono stili per gli elementi globali del modello, come il contenitore Intestazione, Piè di pagina e Contenuto principale. Le regole CSS in questi file sono destinate a diversi elementi HTML
header
,main
efooter
. Questi elementi HTML sono stati definiti dai criteri del precedente capitolo Pagine e modelli. -
Espandere la cartella
components
insrc/main/webpack
ed esaminare i file.Ogni file è associato a un componente core come Componente Pannello a soffietto. Ogni Componente core è generato con Block Element Modifier o notazione BEM per semplificare il targeting di classi CSS specifiche con regole di stile. I file sotto
/components
sono stati sottoposti a stubb da Archetipo di progetto AEM con diverse regole BEM per ogni componente. -
Scarica il file WKND Base Styles wknd-base-styles-src-v3.zip e unzip.
Per accelerare l’esercitazione, vengono forniti diversi file Sass che implementano il brand WKND in base ai Componenti core e alla struttura del modello per pagina dell’articolo.
-
Sovrascrivere il contenuto di
ui.frontend/src
con i file del passaggio precedente. Il contenuto del file ZIP deve sovrascrivere le seguenti cartelle:code language-plain /src/main/webpack /components /resources /site /static
Per visualizzare i dettagli dell’implementazione dello stile WKND, Inspect ha modificato i file.
Integrazione ui.frontend in Inspect ui-frontend-integration
Un elemento di integrazione chiave integrato nel modulo ui.frontend, aem-clientlib-generator, prende gli artefatti CSS e JS compilati da un progetto webpack/npm e li trasforma in librerie AEM lato client.
L’Archetipo progetto AEM configura automaticamente questa integrazione. Quindi, esplora come funziona.
-
Aprire un terminale della riga di comando e installare il modulo ui.frontend utilizzando il comando
npm install
:code language-shell $ cd ~/code/aem-guides-wknd/ui.frontend $ npm install
note note NOTE L'esecuzione di npm install
è necessaria una sola volta, ad esempio dopo un nuovo clone o una nuova generazione del progetto. -
Apri
ui.frontend/package.json
e nel script start aggiungi il comando--env writeToDisk=true
.code language-json { "scripts": { "start": "webpack-dev-server --open --config ./webpack.dev.js --env writeToDisk=true", } }
-
Avvia il server di sviluppo Webpack in modalità watch eseguendo il comando seguente:
code language-shell $ npm run watch
-
Compila i file di origine dal modulo
ui.frontend
e sincronizza le modifiche con AEM in http://localhost:4502code language-shell + jcr_root/apps/wknd/clientlibs/clientlib-site/js/site.js + jcr_root/apps/wknd/clientlibs/clientlib-site/js + jcr_root/apps/wknd/clientlibs/clientlib-site + jcr_root/apps/wknd/clientlibs/clientlib-dependencies/css.txt + jcr_root/apps/wknd/clientlibs/clientlib-dependencies/js.txt + jcr_root/apps/wknd/clientlibs/clientlib-dependencies http://admin:admin@localhost:4502 > OK + jcr_root/apps/wknd/clientlibs/clientlib-site/css + jcr_root/apps/wknd/clientlibs/clientlib-site/js/site.js http://admin:admin@localhost:4502 > OK
-
Il comando
npm run watch
popola infine il clientlib-site e le clientlib-dependencies nel modulo ui.apps, che viene quindi sincronizzato automaticamente con l'AEM.note note NOTE Esiste anche un profilo npm run prod
che minimizza JS e CSS. Questa è la compilazione standard ogni volta che la build del webpack viene attivata tramite Maven. Ulteriori dettagli sul modulo ui.frontend sono disponibili qui. -
Inspect il file
site.css
sottoui.frontend/dist/clientlib-site/site.css
. Si tratta del CSS compilato basato sui file di origine Sass. -
Inspect il file
ui.frontend/clientlib.config.js
. Questo è il file di configurazione per un plug-in npm, aem-clientlib-generator, che trasforma il contenuto di/dist
in una libreria client e lo sposta nel moduloui.apps
. -
Inspect ha aggiunto il file
site.css
nel modulo ui.apps inui.apps/src/main/content/jcr_root/apps/wknd/clientlibs/clientlib-site/css/site.css
. Deve essere una copia identica del filesite.css
dal modulo ui.frontend. Ora che si trova nel modulo ui.apps, può essere distribuito all'AEM.note note NOTE Poiché clientlib-site viene compilato durante il tempo di compilazione, utilizzando npm o maven, può essere ignorato dal controllo del codice sorgente nel modulo ui.apps. Inspect il file .gitignore
sotto ui.apps. -
Apri l'articolo LA Skatepark in AEM all'indirizzo: http://localhost:4502/editor.html/content/wknd/us/en/magazine/guide-la-skateparks.html.
Ora dovresti vedere gli stili aggiornati per l’articolo. Per cancellare i file CSS memorizzati nella cache dal browser potrebbe essere necessario eseguire un aggiornamento rapido.
Sta iniziando a sembrare molto più vicino ai modelli!
note note NOTE I passaggi sopra descritti per generare e distribuire il codice ui.frontend in AEM vengono eseguiti automaticamente quando viene attivata una build Maven dalla radice del progetto mvn clean install -PautoInstallSinglePackage
.
Modifica dello stile
Quindi, apportare una piccola modifica al modulo ui.frontend
per visualizzare npm run watch
distribuire automaticamente gli stili all'istanza AEM locale.
-
Dal modulo
ui.frontend
aprire il file:ui.frontend/src/main/webpack/site/_variables.scss
. -
Aggiorna la variabile di colore
$brand-primary
:code language-scsss //== variables.css //== Brand Colors $brand-primary: $pink;
Salva le modifiche.
-
Torna al browser e aggiorna la pagina AEM per visualizzare gli aggiornamenti:
-
Ripristinare la modifica al colore
$brand-primary
e arrestare la compilazione del webpack utilizzando il comandoCTRL+C
.
Inclusione di pagine e modelli page-inclusion
Quindi, esaminiamo come si fa riferimento alle clientlibs nella pagina AEM. Una best practice comune nello sviluppo web consiste nell'includere CSS nell'intestazione HTML <head>
e in JavaScript subito prima di chiudere il tag </body>
.
-
Passa al modello per pagina articolo in http://localhost:4502/editor.html/conf/wknd/settings/wcm/templates/article-page/structure.html
-
Fai clic sull'icona Informazioni pagina e nel menu seleziona Criterio pagina per aprire la finestra di dialogo Criterio pagina.
Informazioni pagina > Criterio pagina
-
Le categorie per
wknd.dependencies
ewknd.site
sono elencate qui. Per impostazione predefinita, le clientlibs configurate tramite Criterio pagina vengono suddivise in modo da includere il CSS nell’intestazione della pagina e il JavaScript alla fine del corpo. Puoi elencare esplicitamente la libreria client JavaScript da caricare nell’intestazione della pagina. Questo è il caso diwknd.dependencies
.note note NOTE È inoltre possibile fare riferimento direttamente a wknd.site
owknd.dependencies
dal componente page, utilizzando lo scriptcustomheaderlibs.html
ocustomfooterlibs.html
. L’utilizzo del modello offre flessibilità in quanto consente di scegliere quali clientlibs utilizzare per il modello. Ad esempio, se disponi di una libreria JavaScript pesante che verrà utilizzata solo su un modello selezionato. -
Passa alla pagina La Skateparks creata utilizzando il modello pagina articolo: http://localhost:4502/editor.html/content/wknd/us/en/magazine/guide-la-skateparks.html.
-
Fai clic sull'icona Informazioni pagina e nel menu seleziona Visualizza come pubblicato per aprire la pagina dell'articolo all'esterno dell'editor AEM.
-
Visualizza l'origine Pagina di http://localhost:4502/content/wknd/us/en/magazine/guide-la-skateparks.html?wcmmode=disabled e dovresti essere in grado di visualizzare i seguenti riferimenti clientlib in
<head>
:code language-html <head> ... <script src="/etc.clientlibs/wknd/clientlibs/clientlib-dependencies.lc-d41d8cd98f00b204e9800998ecf8427e-lc.min.js"></script> <link rel="stylesheet" href="/etc.clientlibs/wknd/clientlibs/clientlib-dependencies.lc-d41d8cd98f00b204e9800998ecf8427e-lc.min.css" type="text/css"> <link rel="stylesheet" href="/etc.clientlibs/wknd/clientlibs/clientlib-site.lc-78fb9cea4c3a2cc17edce2c2b32631e2-lc.min.css" type="text/css"> ... </head>
Notare che clientlibs sta utilizzando l'endpoint proxy
/etc.clientlibs
. Dovresti inoltre notare che la seguente libreria client include nella parte inferiore della pagina:code language-html ... <script src="/etc.clientlibs/wknd/clientlibs/clientlib-site.lc-7157cf8cb32ed66d50e4e49cdc50780a-lc.min.js"></script> <script src="/etc.clientlibs/wknd/clientlibs/clientlib-base.lc-53e6f96eb92561a1bdcc1cb196e9d9ca-lc.min.js"></script> ... </body>
note note NOTE Per AEM 6.5/6.4 le librerie lato client non vengono minimizzate automaticamente. Per abilitare la minimizzazione, consulta la documentazione su HTML Library Manager (scelta consigliata). note warning WARNING Per quanto riguarda la pubblicazione, è fondamentale che le librerie client siano non servite da /app, in quanto questo percorso deve essere limitato per motivi di sicurezza utilizzando la sezione filtro Dispatcher. La proprietà allowProxy della libreria client assicura che CSS e JS siano serviti da /etc.clientlibs.
Passaggi successivi next-steps
Scopri come implementare singoli stili e riutilizzare i Componenti core utilizzando il Sistema di stili di Experience Manager. Sviluppare con il sistema di stili include l'utilizzo del sistema di stili per estendere i componenti core con CSS specifici per il brand e configurazioni di criteri avanzate dell'Editor modelli.
Visualizza il codice finito in GitHub oppure rivedi e distribuisci il codice localmente in nel ramo Git tutorial/client-side-libraries-solution
.
- Clona l'archivio github.com/adobe/aem-wknd-guides.
- Controllare il ramo
tutorial/client-side-libraries-solution
.
Strumenti e risorse aggiuntivi additional-resources
Webpack DevServer - Markup statico webpack-dev-static
Nella coppia di esercizi precedente, diversi file Sass nel modulo ui.frontend sono stati aggiornati e attraverso un processo di compilazione, alla fine vedi che queste modifiche si riflettono nell'AEM. Esaminiamo ora una tecnica che utilizza un webpack-dev-server per sviluppare rapidamente gli stili front-end rispetto a static HTML.
Questa tecnica è utile se la maggior parte degli stili e del codice front-end viene eseguita da uno sviluppatore front-end dedicato che potrebbe non avere un facile accesso a un ambiente AEM. Questa tecnica consente inoltre alla FED di apportare modifiche direttamente alle HTML, che possono poi essere consegnate a uno sviluppatore AEM per implementarle come componenti.
-
Copia l'origine della pagina dell'articolo di skatepark LA all'indirizzo http://localhost:4502/content/wknd/us/en/magazine/guide-la-skateparks.html?wcmmode=disabled.
-
Riapri l’IDE. Incolla il markup copiato da AEM in
index.html
nel modulo ui.frontend sottosrc/main/webpack/static
. -
Modifica il markup copiato e rimuovi eventuali riferimenti a clientlib-site e clientlib-dependencies:
code language-html <!-- remove --> <script type="text/javascript" src="/etc.clientlibs/wknd/clientlibs/clientlib-dependencies.js"></script> <link rel="stylesheet" href="/etc.clientlibs/wknd/clientlibs/clientlib-dependencies.css" type="text/css"> <link rel="stylesheet" href="/etc.clientlibs/wknd/clientlibs/clientlib-site.css" type="text/css"> ... <script type="text/javascript" src="/etc.clientlibs/wknd/clientlibs/clientlib-site.js"></script>
Rimuovi questi riferimenti perché il server di sviluppo Webpack genera automaticamente questi artefatti.
-
Avvia il server di sviluppo Webpack da un nuovo terminale eseguendo il comando seguente dal modulo ui.frontend:
code language-shell $ cd ~/code/aem-guides-wknd/ui.frontend/ $ npm start > aem-maven-archetype@1.0.0 start code/aem-guides-wknd/ui.frontend > webpack-dev-server --open --config ./webpack.dev.js
-
Verrà aperta una nuova finestra del browser in http://localhost:8080/ con markup statico.
-
Modificare il file
src/main/webpack/site/_variables.scss
. Sostituire la regola$text-color
con quanto segue:code language-diff - $text-color: $black; + $text-color: $pink;
Salva le modifiche.
-
Dovresti vedere automaticamente le modifiche riflesse nel browser su http://localhost:8080.
-
Esaminare il file
/aem-guides-wknd.ui.frontend/webpack.dev.js
. Contiene la configurazione del webpack utilizzata per avviare il webpack-dev-server. Esegue il proxy dei percorsi/content
e/etc.clientlibs
da un'istanza dell'AEM in esecuzione locale. In questo modo vengono rese disponibili le immagini e altre clientlibs (non gestite dal codice ui.frontend).note caution CAUTION L’SRC immagine del markup statico punta a un componente immagine live su un’istanza AEM locale. Le immagini appaiono interrotte se il percorso cambia, se l’AEM non viene avviato o se il browser non ha effettuato l’accesso all’istanza AEM locale. Se si consegna a una risorsa esterna, è anche possibile sostituire le immagini con riferimenti statici. -
È possibile arrestare il server Webpack dalla riga di comando digitando
CTRL+C
.
aemfed develop-aemfed
aemfed è uno strumento da riga di comando open-source che può essere utilizzato per velocizzare lo sviluppo front-end. È alimentato da aemsync, Browsersync e Sling Log Tracer.
A un livello avanzato, aemfed
è progettato per ascoltare le modifiche dei file all'interno del modulo ui.apps e sincronizzarli automaticamente direttamente in un'istanza AEM in esecuzione. In base alle modifiche, un browser locale si aggiorna automaticamente, velocizzando così lo sviluppo front-end. È inoltre progettato per funzionare con Sling Log Tracer per visualizzare automaticamente eventuali errori lato server direttamente nel terminale.
Se lavori molto nel modulo ui.apps, modificando gli script HTL e creando componenti personalizzati, aemfed può essere uno strumento potente da utilizzare. La documentazione completa è disponibile qui.
Debug delle librerie lato client debugging-clientlibs
Se si utilizzano metodi diversi di categorie e incorpora per includere più librerie client, la risoluzione dei problemi può risultare laboriosa. L'AEM espone diversi strumenti per aiutarlo. Uno degli strumenti più importanti è Ricostruisci librerie client che obbliga l'AEM a ricompilare i file LESS e generare il CSS.
-
Dump librerie - Elenca le librerie client registrate nell'istanza AEM.
<host>/libs/granite/ui/content/dumplibs.html
-
Output di test - consente a un utente di visualizzare l'output HTML previsto di clientlib include in base alla categoria.
<host>/libs/granite/ui/content/dumplibs.test.html
-
Convalida dipendenze librerie - evidenzia le dipendenze o le categorie incorporate che non è possibile trovare.
<host>/libs/granite/ui/content/dumplibs.validate.html
-
Rigenera librerie client - consente a un utente di forzare l'AEM a rigenerare le librerie client o invalidare la cache delle librerie client. Questo strumento è efficace quando si sviluppa con MENO in quanto può costringere l’AEM a ricompilare il CSS generato. In generale, è più efficace annullare la validità delle cache ed eseguire quindi l’aggiornamento di una pagina anziché ricostruire le librerie.
<host>/libs/granite/ui/content/dumplibs.rebuild.html