Bibliotecas de clientes e fluxo de trabalho de front-end client-side-libraries
Saiba como as bibliotecas do lado do cliente ou clientlibs são usadas para implantar e gerenciar o CSS e o JavaScript para uma implementação do Adobe Experience Manager (AEM) Sites. Este tutorial também aborda como o módulo ui.frontend, um projeto webpack dissociado, pode ser integrado ao processo de compilação completo.
Pré-requisitos prerequisites
Revise as ferramentas e instruções necessárias para configurar um ambiente de desenvolvimento local.
Também é recomendável revisar o tutorial Noções básicas sobre componentes para entender os fundamentos das bibliotecas do lado do cliente e do AEM.
Projeto inicial
Verifique o código de linha base no qual o tutorial se baseia:
-
Confira a ramificação
tutorial/client-side-libraries-start
do GitHubcode language-shell $ cd aem-guides-wknd $ git checkout tutorial/client-side-libraries-start
-
Implante a base de código em uma instância de AEM local usando suas habilidades de Maven:
code language-shell $ mvn clean install -PautoInstallSinglePackage
note note NOTE Se estiver usando AEM 6.5 ou 6.4, anexe o perfil classic
a qualquer comando Maven.code language-shell $ mvn clean install -PautoInstallSinglePackage -Pclassic
Você sempre pode exibir o código concluído em GitHub ou conferir o código localmente alternando para a ramificação tutorial/client-side-libraries-solution
.
Objetivos
- Entenda como as bibliotecas do lado do cliente são incluídas em uma página por meio de um modelo editável.
- Saiba como usar o módulo
ui.frontend
e um servidor de desenvolvimento de webpack para desenvolvimento front-end dedicado. - Entenda o fluxo de trabalho completo de entrega de CSS e JavaScript compilados para uma implementação do Sites.
O que você vai criar what-build
Neste capítulo, você adiciona alguns estilos de linha de base para o site WKND e o Modelo de Página de Artigo para aproximar a implementação dos modelos de design de interface. Você usa um fluxo de trabalho avançado de front-end para integrar um projeto de webpack em uma biblioteca de cliente AEM.
Página de artigo com estilos de linha de base aplicados
Fundo background
As bibliotecas do lado do cliente fornecem um mecanismo para organizar e gerenciar arquivos CSS e JavaScript necessários para uma implementação do AEM Sites. As metas básicas para bibliotecas do lado do cliente ou clientlibs são:
- Armazene CSS/JS em arquivos pequenos separados para facilitar o desenvolvimento e a manutenção
- Gerenciar dependências em estruturas de terceiros de maneira organizada
- Minimize o número de solicitações do lado do cliente concatenando CSS/JS em uma ou duas solicitações.
Mais informações sobre o uso de Bibliotecas do Lado do Cliente podem ser encontradas aqui.
As bibliotecas do lado do cliente têm algumas limitações. Mais notavelmente, é um suporte limitado para linguagens de front-end populares como Sass, LESS e TypeScript. No tutorial, vamos ver como o módulo ui.frontend pode ajudar a resolver isso.
Implante a base de código inicial em uma instância de AEM local e navegue até http://localhost:4502/editor.html/content/wknd/us/en/magazine/guide-la-skateparks.html. Esta página não tem estilo. Vamos implementar bibliotecas do lado do cliente para a marca WKND para adicionar CSS e JavaScript à página.
Organização de bibliotecas do lado do cliente organization
A seguir, vamos explorar a organização das bibliotecas de clientes geradas pelo Arquétipo de projeto AEM.
Organização da biblioteca do lado do cliente de diagrama de alto nível e inclusão da página
-
Usando o VSCode ou outro IDE, abra o módulo ui.apps.
-
Expanda o caminho
/apps/wknd/clientlibs
para exibir as clientlibs geradas pelo arquétipo.Na seção abaixo, essas clientlibs são analisadas com mais detalhes.
-
A tabela a seguir resume as bibliotecas de clientes. Mais detalhes sobre incluindo as Bibliotecas de Clientes podem ser encontrados aqui.
table 0-row-3 1-row-3 2-row-3 3-row-3 4-row-3 Nome Descrição Notas clientlib-base
Nível básico de CSS e JavaScript necessário para o funcionamento do Site WKND incorpora bibliotecas de cliente dos Componentes principais clientlib-grid
Gera o CSS necessário para o Modo de Layout funcionar. Os pontos de interrupção de dispositivo móvel/tablet podem ser configurados aqui clientlib-site
Contém um tema específico do site para o site WKND Gerado pelo módulo ui.frontend
clientlib-dependencies
Incorpora qualquer dependência de terceiros Gerado pelo módulo ui.frontend
-
Observe que
clientlib-site
eclientlib-dependencies
são ignorados do controle do código-fonte. Isso ocorre por design, já que são gerados no momento da compilação pelo móduloui.frontend
.
Atualizar estilos base base-styles
Em seguida, atualize os estilos base definidos no módulo ui.frontend. Os arquivos no módulo ui.frontend
geram as bibliotecas clientlib-site
e clientlib-dependecies
que contêm o tema do Site e quaisquer dependências de terceiros.
Bibliotecas do lado do cliente não dão suporte a linguagens mais avançadas como Sass ou TypeScript. Há várias ferramentas de código aberto, como o NPM e o webpack, que aceleram e otimizam o desenvolvimento de front-end. O objetivo do módulo ui.frontend é poder usar essas ferramentas para gerenciar a maioria dos arquivos de origem front-end.
-
Abra o módulo ui.frontend e navegue até
src/main/webpack/site
. -
Abrir o arquivo
main.scss
main.scss
é o ponto de entrada para os arquivos Sass no móduloui.frontend
. Ele inclui o arquivo_variables.scss
, que contém uma série de variáveis de marca a serem usadas em diferentes arquivos Sass no projeto. O arquivo_base.scss
também está incluído e define alguns estilos básicos para elementos HTML. Uma expressão regular inclui os estilos de componentes individuais emsrc/main/webpack/components
. Outra expressão regular inclui os arquivos emsrc/main/webpack/site/styles
. -
Inspect o arquivo
main.ts
. Ele incluimain.scss
e uma expressão regular para coletar quaisquer arquivos.js
ou.ts
no projeto. Este ponto de entrada é usado pelos arquivos de configuração do webpack como ponto de entrada para todo o móduloui.frontend
. -
Inspect os arquivos abaixo de
src/main/webpack/site/styles
:Esses arquivos definem estilos para elementos globais no modelo, como o Cabeçalho, Rodapé e o contêiner de conteúdo principal. As regras de CSS nesses arquivos se destinam a diferentes elementos de HTML
header
,main
efooter
. Esses elementos HTML foram definidos por políticas no capítulo anterior Páginas e Modelos. -
Expanda a pasta
components
emsrc/main/webpack
e inspecione os arquivos.Cada arquivo mapeia para um Componente Principal como o Componente Acordeão. Cada Componente principal é criado com o Modificador de elemento de bloco ou a notação BEM para facilitar o direcionamento a classes CSS específicas com regras de estilo. Os arquivos abaixo de
/components
foram removidos pelo Arquétipo de Projeto AEM com as diferentes regras BEM para cada componente. -
Baixe o arquivo de Estilos Base WKND wknd-base-style-src-v3.zip e unzip.
Para acelerar o tutorial, vários arquivos Sass que implementam a marca WKND com base nos Componentes principais e na estrutura do Modelo de página do artigo são fornecidos.
-
Substituir o conteúdo de
ui.frontend/src
por arquivos da etapa anterior. O conteúdo do zip deve substituir as seguintes pastas:code language-plain /src/main/webpack /components /resources /site /static
Inspect os arquivos alterados para ver detalhes da implementação do estilo WKND.
Integração do Inspect ao ui.frontend ui-frontend-integration
Uma peça chave de integração incorporada ao módulo ui.frontend, aem-clientlib-generator pega os artefatos CSS e JS compilados de um projeto webpack/npm e os transforma em bibliotecas AEM do lado do cliente.
O Arquétipo de projeto AEM configura automaticamente essa integração. Em seguida, descubra como funciona.
-
Abra um terminal de linha de comando e instale o módulo ui.frontend usando o comando
npm install
:code language-shell $ cd ~/code/aem-guides-wknd/ui.frontend $ npm install
note note NOTE A execução de npm install
é necessária apenas uma vez, como depois de um novo clone ou geração do projeto. -
Abra
ui.frontend/package.json
e no comando scripts start adicione--env writeToDisk=true
.code language-json { "scripts": { "start": "webpack-dev-server --open --config ./webpack.dev.js --env writeToDisk=true", } }
-
Inicie o servidor de desenvolvimento do webpack no modo watch executando o seguinte comando:
code language-shell $ npm run watch
-
Isso compila os arquivos de origem do módulo
ui.frontend
e sincroniza as alterações com o AEM em 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
-
O comando
npm run watch
preenche o clientlib-site e clientlib-dependencies no módulo ui.apps que é sincronizado automaticamente com o AEM.note note NOTE Também há um perfil npm run prod
que minifica o JS e o CSS. Essa é a compilação padrão sempre que a compilação do webpack é acionada por meio do Maven. Mais detalhes sobre o módulo ui.frontend podem ser encontrados aqui. -
Inspect o arquivo
site.css
abaixo deui.frontend/dist/clientlib-site/site.css
. Este é o CSS compilado com base nos arquivos de origem Sass. -
Inspect o arquivo
ui.frontend/clientlib.config.js
. Este é o arquivo de configuração de um plug-in npm, aem-clientlib-generator que transforma o conteúdo de/dist
em uma biblioteca do cliente e a move para o móduloui.apps
. -
Inspect o arquivo
site.css
no módulo ui.apps emui.apps/src/main/content/jcr_root/apps/wknd/clientlibs/clientlib-site/css/site.css
. Esta deve ser uma cópia idêntica do arquivosite.css
do módulo ui.frontend. Agora que está no módulo ui.apps, ele pode ser implantado no AEM.note note NOTE Como o clientlib-site é compilado durante o tempo de compilação, usando npm ou maven, ele pode ser ignorado com segurança do controle do código-fonte no módulo ui.apps. Inspect o arquivo .gitignore
abaixo de ui.apps. -
Abra o artigo LA Skatepark no AEM em: http://localhost:4502/editor.html/content/wknd/us/en/magazine/guide-la-skateparks.html.
Agora você deve ver os estilos atualizados do artigo. Talvez seja necessário fazer uma atualização permanente para limpar todos os arquivos CSS armazenados em cache pelo navegador.
Está começando a parecer muito mais perto dos modelos!
note note NOTE As etapas executadas acima para criar e implantar o código ui.frontend no AEM são executadas automaticamente quando uma compilação Maven é acionada da raiz do projeto mvn clean install -PautoInstallSinglePackage
.
Fazer uma alteração de estilo
Em seguida, faça uma pequena alteração no módulo ui.frontend
para ver o npm run watch
implantar automaticamente os estilos na instância do AEM local.
-
No, o módulo
ui.frontend
abre o arquivo:ui.frontend/src/main/webpack/site/_variables.scss
. -
Atualize a variável de cor
$brand-primary
:code language-scsss //== variables.css //== Brand Colors $brand-primary: $pink;
Salve as alterações.
-
Retorne ao navegador e atualize a página AEM para ver as atualizações:
-
Reverta a alteração para a cor
$brand-primary
e pare a compilação do webpack usando o comandoCTRL+C
.
Inclusão de página e modelo page-inclusion
Em seguida, vamos analisar como as clientlibs são referenciadas na página do AEM. Uma prática recomendada comum no desenvolvimento da Web é incluir CSS no Cabeçalho do HTML <head>
e no JavaScript, antes de fechar a tag </body>
.
-
Navegue até o modelo de Página de Artigo em http://localhost:4502/editor.html/conf/wknd/settings/wcm/templates/article-page/structure.html
-
Clique no ícone Informações da página e, no menu, selecione Política da página para abrir a caixa de diálogo Política da página.
Informações da página > Política da página
-
Observe que as categorias para
wknd.dependencies
ewknd.site
estão listadas aqui. Por padrão, as clientlibs configuradas por meio da Política da página são divididas para incluir o CSS no cabeçalho da página e o JavaScript no final do corpo. Você pode listar explicitamente o JavaScript clientlib a ser carregado no Cabeçalho da página. Este é o caso parawknd.dependencies
.note note NOTE Também é possível referenciar wknd.site
ouwknd.dependencies
diretamente do componente de página, usando o scriptcustomheaderlibs.html
oucustomfooterlibs.html
. Usar o modelo oferece flexibilidade para que você possa escolher quais clientlibs serão usadas por modelo. Por exemplo, se você tiver uma biblioteca JavaScript pesada que só será usada em um modelo selecionado. -
Navegue até a página LA Skateparks criada usando o Modelo de Página de Artigo: http://localhost:4502/editor.html/content/wknd/us/en/magazine/guide-la-skateparks.html.
-
Clique no ícone Informações da página e, no menu, selecione Exibir como publicada para abrir a página do artigo fora do Editor de AEM.
-
Exiba a Origem da página de http://localhost:4502/content/wknd/us/en/magazine/guide-la-skateparks.html?wcmmode=disabled e você poderá ver as seguintes referências de clientlib no
<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>
Observe que clientlibs estão usando o ponto de extremidade proxy
/etc.clientlibs
. Você também deve ver que a seguinte clientlib inclui na parte inferior da página: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 Para o AEM 6.5/6.4, as bibliotecas do lado do cliente não são minificadas automaticamente. Consulte a documentação no Gerenciador de biblioteca de HTML para habilitar a minificação (recomendado). note warning WARNING É crítico, no lado da publicação, que as bibliotecas de clientes sejam não atendidas de /aplicativos, pois esse caminho deve ser restrito por motivos de segurança usando a seção de filtro do Dispatcher. A propriedade allowProxy da biblioteca do cliente garante que o CSS e o JS sejam atendidos a partir de /etc.clientlibs.
Próximas etapas next-steps
Saiba como implementar estilos individuais e reutilizar os Componentes principais usando o Sistema de estilos do Experience Manager. O Desenvolvimento com o Sistema de Estilos abrange o uso do Sistema de Estilos para estender os Componentes Principais com CSS específico da marca e configurações de política avançadas do Editor de Modelos.
Visualize o código concluído em GitHub ou revise e implante o código localmente em na ramificação Git tutorial/client-side-libraries-solution
.
- Clonar o repositório github.com/adobe/aem-wknd-guides.
- Confira a ramificação
tutorial/client-side-libraries-solution
.
Ferramentas e recursos adicionais additional-resources
DevServer do Webpack - Marcação Estática webpack-dev-static
No par de exercícios anteriores, vários arquivos Sass no módulo ui.frontend foram atualizados e, por meio de um processo de compilação, você pode ver que essas alterações foram refletidas no AEM. A seguir, vejamos uma técnica que usa um webpack-dev-server para desenvolver rapidamente os estilos de front-end em relação ao HTML static.
Essa técnica é útil se a maioria dos estilos e códigos de front-end for executada por um desenvolvedor de front-end dedicado que pode não ter acesso fácil a um ambiente AEM. Essa técnica também permite que o FED faça modificações diretamente no HTML, que podem então ser entregues a um desenvolvedor de AEM para serem implementados como componentes.
-
Copie a origem da página de artigo LA skatepark em http://localhost:4502/content/wknd/us/en/magazine/guide-la-skateparks.html?wcmmode=disabled.
-
Reabra o IDE. Cole a marcação copiada do AEM no
index.html
no módulo ui.frontend abaixo desrc/main/webpack/static
. -
Edite a marcação copiada e remova todas as referências 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>
Remova essas referências porque o servidor de desenvolvimento do webpack gera esses artefatos automaticamente.
-
Inicie o servidor de desenvolvimento do webpack a partir de um novo terminal executando o seguinte comando no módulo 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
-
Isso deve abrir uma nova janela do navegador em http://localhost:8080/ com marcação estática.
-
Edite o arquivo
src/main/webpack/site/_variables.scss
. Substitua a regra$text-color
pela seguinte:code language-diff - $text-color: $black; + $text-color: $pink;
Salve as alterações.
-
Você deve ver automaticamente as alterações refletidas automaticamente no navegador em http://localhost:8080.
-
Revise o arquivo
/aem-guides-wknd.ui.frontend/webpack.dev.js
. Contém a configuração de webpack usada para iniciar o webpack-dev-server. Ela faz proxy dos caminhos/content
e/etc.clientlibs
de uma instância de AEM em execução localmente. É assim que as imagens e outras clientlibs (não gerenciadas pelo código ui.frontend) são disponibilizadas.note caution CAUTION A origem de imagem da marcação estática aponta para um componente de imagem ativa em uma ocorrência de AEM local. As imagens aparecem quebradas se o caminho para a imagem mudar, se o AEM não for iniciado ou se o navegador não tiver se conectado à instância AEM local. Se estiver enviando para um recurso externo, também é possível substituir as imagens por referências estáticas. -
Você pode parar o servidor de webpack a partir da linha de comando digitando
CTRL+C
.
aemfed develop-aemfed
aemfed é uma ferramenta de linha de comando de código aberto que pode ser usada para acelerar o desenvolvimento de front-end. Ela é fornecida pelo aemsync, Browsersync e Rastreador de Log do Sling.
Em um alto nível, o aemfed
foi projetado para ouvir as alterações de arquivo no módulo ui.apps e sincronizá-las automaticamente diretamente com uma instância do AEM em execução. Com base nas alterações, um navegador local é atualizado automaticamente, acelerando o desenvolvimento de front-end. Ele também foi criado para funcionar com o rastreador de log do Sling para exibir automaticamente todos os erros do lado do servidor diretamente no terminal.
Se você estiver trabalhando muito dentro do módulo ui.apps, modificando scripts HTL e criando componentes personalizados, o aemfed pode ser uma ferramenta poderosa para ser usada. A documentação completa pode ser encontrada aqui.
Depuração de bibliotecas do lado do cliente debugging-clientlibs
Usar diferentes métodos de categorias e incorpora para incluir várias bibliotecas de clientes, pode ser complicado solucionar problemas. O AEM expõe várias ferramentas para ajudar nisso. Uma das ferramentas mais importantes é Recompilar Bibliotecas de Clientes, que força o AEM a recompilar qualquer arquivo MENOS e gerar o CSS.
-
Bibliotecas de Despejo - Lista as bibliotecas de clientes registradas na instância do AEM.
<host>/libs/granite/ui/content/dumplibs.html
-
Saída de teste - permite que um usuário veja a saída de HTML esperada de clientlib includes com base na categoria.
<host>/libs/granite/ui/content/dumplibs.test.html
-
Validação de dependências de bibliotecas - destaca todas as dependências ou categorias inseridas que não podem ser encontradas.
<host>/libs/granite/ui/content/dumplibs.validate.html
-
Recompilar Bibliotecas de Clientes - permite que um usuário force o AEM a recompilar as bibliotecas de clientes ou invalidar o cache das bibliotecas de clientes. Essa ferramenta é eficaz ao desenvolver com MENOS, pois isso pode forçar o AEM a recompilar o CSS gerado. Em geral, é mais eficaz Invalidar caches e executar uma atualização de página do que reconstruir as bibliotecas.
<host>/libs/granite/ui/content/dumplibs.rebuild.html