ao.mpmn-digital.com
Novas receitas

Este servidor Qdoba vai além para ajudar um cliente com deficiência

Este servidor Qdoba vai além para ajudar um cliente com deficiência


We are searching data for your request:

Forums and discussions:
Manuals and reference books:
Data from registers:
Wait the end of the search in all databases.
Upon completion, a link will appear to access the found materials.


Um ato de gentileza entre um funcionário da Qdoba e um cliente regular deficiente foi filmado em Kentucky

Entre guerras, fome, protestos racialmente carregados e trens descarrilados, às vezes você só precisa restaurar sua fé na humanidade.

Um ato de bondade filmado em um Kentucky Qdoba está fazendo manchetes. Em particular, ele se tornou amigo de uma mulher que chama Qdoba de seu lugar favorito para comer e sempre pede a mesma coisa: uma salada de taco com molho picante e queijo para o almoço e um burrito com molho picante e queijo para o jantar.

Depois de ajudar a cliente, que está em uma cadeira móvel, a atravessar a fila e buscar seus guardanapos, Quarles perguntou se ela precisava de mais alguma coisa. Ela disse: "Na verdade, senhor, se você não se importa, pode me ajudar a comer?" Quarles não hesitou. Outro cliente viu a doce troca na câmera enquanto Quarles pacientemente ajudava a dar o burrito à sua cliente.

“Quero dizer, ela precisa de ajuda, e se eu não fosse fazer isso, ninguém iria”, Quarles disse ao sindicato Fox local. "Quem mais vai fazer isso?"

Desde então, o vídeo se tornou viral. Dr. David Jones, o cliente Qdoba que registrou a troca, tinha algumas idéias sobre isso:

"Ele não parou para pensar, 'Bem, devo ajudá-la, não é?' Ele apenas foi até lá, colocou as luvas e começou a alimentá-la, "Jones disse ao sindicato local da NBC. "Parece-me que se todos no mundo usassem o pequeno presente simples que têm para talvez beneficiar outra pessoa, pense como o mundo seria."


Este servidor Qdoba vai além para ajudar um cliente com deficiência - receitas

Como esta é a primeira vez que você faz login, autentique sua conta. Com qual telefone você gostaria de validar?

Como você gostaria de receber seu código de verificação?

Por favor, digite seu código de segurança aqui:

Economize 25% em todos os produtos doTERRAtornando-se um membro hoje.

Torne-se um membro

  • Desconto de 25% no produto
  • Ganhe pontos e produto grátis
  • Receba remessa mensal de seus produtos favoritos
  • Receba o kit inicial (valor de $ 35!)

Hóspede

Ficar excitado. a próxima vez que você fizer login, será com nossa nova experiência de login atualizada usando seu e-mail! Dê uma olhada na imagem abaixo para uma prévia.


Todos os sábados, “Dale e Ma”, como o garçom Joe Thomas os chama, vão a Springfield, Illinois, IHOP, onde ele trabalha. Enquanto o marido ajudava a esposa com os utensílios, seu café da manhã esfriava - até que Thomas saltou para ajudar, dizendo: "Eu cuido disso."

Isso foi há cinco anos, e Thomas, que está no IHOP há quase 12 anos, tem ajudado o casal desde então. Acontece que a mulher sofre da doença de Huntington, uma doença hereditária relativamente rara que afeta as células nervosas do cérebro, afetando os movimentos e a cognição. Ela consegue comer, digamos, uvas ou fatias de maçã, mas luta com os utensílios.

Thomas, 44, recentemente tirou alguns minutos de um movimentado turno do café da manhã para falar com a TODAY Food: “Eu sempre ajudei as pessoas, independentemente de quem quer que seja”, diz ele.

A compaixão está em sua natureza: Anteriormente, Thomas trabalhou como técnico de reabilitação, ajudando indivíduos com deficiência cognitiva e de desenvolvimento na transição para situações de vida independente. Ele também cuidou de sua mãe, que sofria de diabetes, até seu falecimento, há quase 10 anos.

Qualquer pessoa que já cuidou de outra pessoa que precisa de ajuda extra sabe como as menores tarefas diárias podem ser difíceis, e é provavelmente por isso que a internet coletivamente derramou depois que uma foto do gesto de Thomas se tornou viral esta semana.

Outra cliente, Keshia Dotson, tirou a foto depois de ver a ação gentil de Thomas recentemente.

O serviço de outras mesas não foi afetado enquanto Thomas ajudava o cliente idoso, Dotson disse ao TODAY Food: Outro garçom até entrou para verificar a mesa de Dotson "e pareceu feliz em fazê-lo", disse ela. "Ela até comentou sobre o quão doce ela pensava que era dele."

Como as empresas tendem a ouvir apenas quando as coisas dão errado, Dotson disse que queria destacar algo bom. “Meu motivo ao postar a foto foi tentar ajudar a reconhecer o garçom para sua empresa”, disse ela, “Eu normalmente tento entrar em contato quando experimento ou observo um bom atendimento ao cliente”.

Em sua própria vida, Dotson trabalha como coordenadora de programas para adultos e divulgação da Biblioteca Rochester em Rochester, Illinois, onde, ela diz, a equipe se esforça para ter um bom impacto na comunidade local.

“Também tentamos fazer o mesmo em nossas vidas pessoais, o que foi em parte o que me levou a tirar a foto.”

Uma porta-voz do IHOP, Stephanie Peterson, disse ao TODAY Food que tanto a empresa quanto o franqueado local, Larry McDonald, foram "tocados pelo ato gentil de Thomas", acrescentando: "De tudo o que ouvimos sobre Joe, é da natureza dele ir acima e além para seus convidados e este gesto simplesmente reflete quem ele é. Como marca, estamos extremamente orgulhosos dos momentos comoventes como este que acontecem em nossos restaurantes todos os dias. "

Quanto a Thomas, ele até foi abordado sobre um futuro na enfermagem desde que a foto se tornou viral. Ele não tem certeza de qual será seu próximo passo, ainda, embora diga que adoraria voltar ao trabalho como técnico de reabilitação um dia.

Nesse ínterim, ele planeja continuar ajudando Dale e Ma e está feliz por ter conhecido os clientes regulares tão bem. “Oh sim, nós voltamos”, disse ele. “Eles são um lindo casal. Pessoas bonitas."


Este servidor Qdoba vai além para ajudar um cliente com deficiência - receitas

Earl Alexander
Homewood Suites Keystone at the Crossing

Matt Anderson
The Children & rsquos Museum of Indianapolis

Ryann Ayers
French Lick Resort e amp Casino

Carlos Bartlett
St. Elmo Steak House

Joe Billerman
Indianapolis Public Transportation Corporation

Hector Bolanos
The Capital Grille

Arturo Boyzo
Restaurante Ram e cervejaria amp

Emily Bristol
Restaurante Rock Bottom e cervejaria amp

Nina Britton
The Westin Indianapolis

Delbert Brooks
Embassy Suites Downtown

Nancy Brunner
Crowne Plaza na Historic Union Station

Broch Buchanan
Mexa Crazy Greenwood

Chris Burgdoefer
Markey & rsquos Rental & amp Staging

Michael Burns
Churrascaria Shula e rsquos

Bobby Cassingham
Hilton Indianapolis

Laurie Christie
Zoológico de Indianápolis

Alvin Clark
Restaurantes Levy / Conseco Fieldhouse

Roderick Coleman
Indianapolis Marriott North

Cornelius Cooper
Restaurantes Levy / Conseco Fieldhouse

Floren Dedeaux
Skyline Club

Gene Dotts
Columbia Club

Kenny Duff
Indianapolis Marriott North

Susana Galarza
Holiday Inn Express Hotel & amp Suites City Center

Jeffrey Dugger
Bynum e rsquos Steakhouse

Debbie Flemming
Embassy Suites North

Faustino Flores
Courtyard by Marriott Northwest

John Fraction
Indianapolis Marriott Downtown

Clifford Fraser
Hoosier Park Racing e amp Casino

Zeke Garcia
The Capital Grille

Kevin Gearhart
Indiana Live! Cassino

Melissa Genrich
Sheraton Indianapolis City Centre

Evan Gibbons
Indiana Sports Corporation

Ramon Gonzalez
The Steakhouse Indianápolis de Morton

Joe Graham
Bynum's Steakhouse

Sara Grimes
French Lick Resort e amp Casino

Fred Griswold
Scotty's Brewhouse

Sean Hankerson
14 West Restaurant & amp Suites

West Hardy
Indianapolis Public Transportation Corporation

Rosa Hernandez
Residence Inn Northwest

Jerri Herr
Hampton Inn & amp Suites

Melissa Highbaugh
Holiday Inn Express South

Jeff Hilbert
The Free Enterprise System, Inc.

Eric Hinkle
Museu Eiteljorg de Índios Americanos e Arte Ocidental

Sandie Horner
Conner Prairie Interactive History Park

Kat Houston
Padaria e Café Paradise

Linda Huotilainen
Museu das Crianças de Indianápolis

Emma Johnson
Bife n batido

Louis Kattie
Enterprise Rent A Car

Pamela Kennson
Museu de Arte de Indianápolis

Amanda Kirby
Hoosier Park Racing e amp Casino

Jake Klinger
Conrad Indianapolis

Carol Knight
Hilton Garden Inn

Kevin Kosanke
Conrad Indianapolis

Andrew Lannerd
Orquestra Sinfônica de Indianápolis

Alice Laskowski
Pacers Sports & amp Entertainment

Joe Liddy
Limusines Carey de Indiana

Andrew Meyers
Scotty's Brewhouse

Carissa Miller
French Lick Resort e amp Casino

Kim Mills
Hyatt Regency Indianapolis

Monica Miranda
Omni Severin Hotel

Scott Moore
Mo's. Um lugar para bifes

Wilma Moore
Sociedade Histórica de Indiana

Deb New
Drum Corp International

Jim Nutt
Sotaque em Indianápolis

Herschel Parr
Aeroporto Crowne Plaza Indianapolis

Rachel Radez
Holiday Inn Express Northwest Indianápolis

Irma Rodarte
Omni Severin Hotel

Russell Roth
Hilton Indianapolis

Dave & quotRudy & quot Ruschhaupt
The Free Enterprise System, Inc.

Clara Sanchez
Hampton Inn Downtown

Natalie Scheiter
Indianapolis Marriott East

Rennie Schervish
Towne Park

Heidi Spencer
Bife n batido

Garth Stapleton
Indy Hostel

Amy Stewart
Harry e Izzy's

Megan Stuerenberg
Cambria Suites

Brad Takamura
Stir Crazy - Castleton

Kenneth Taylor
Barril de biscoito

Jessica Taylor
Alcatraz Brewing Company

Ahmed Touil
National Car Rental e Alamo Rent a Car

Christina Tsui
Ruth's Chris Steak House

Milo Vanek
Indiana Sports Corporation

Betty Jo Vanek
Indiana Sports Corporation

Pansey Weaver
Indiana Live! Cassino

Jill Whelan
Conner Prairie Interactive History Park

Frank wilson
Segway of Indiana, LLC

Jason Woolridge
Hotel Renaissance Indianapolis North

Dawn Young
Serviços de monitoramento eletrônico

Alvin & quotBlue & quot Clark & mdash Chefe de cozinha de confeitaria
Restaurantes Levy / Conseco Fieldhouse

O destinatário da ROSE, Alvin & quotBlue & quot Clark, pode ser qualificado como um dos caras mais fofos que você conhece. Isso é porque sua especialidade são sobremesas. E embora não esteja diretamente na linha de frente do serviço, não há dúvida de que suas criações culinárias trouxeram sorrisos aos rostos de milhares de visitantes e residentes ao longo dos anos. Porque - considere isso - este é seu 53º ano na indústria de hospitalidade. Foi uma jornada e tanto. Clark começou a fazer doces aos 17 anos, mas, por falta de educação formal, não sabia ler, o que o obrigou a memorizar mais de 600 receitas. Aos 35 anos, sua esposa e cinco filhos o ajudaram a aprender a ler. Sua carreira acabou levando-o aos restaurantes Levy no Conseco Fieldhouse, onde foi o chef pâtissier líder nos últimos cinco anos, fazendo todas as suas sobremesas do zero. Clark agora serve como mentor para funcionários mais jovens, incutindo-lhes paixão por seu ofício, o orgulho da criação e a satisfação do cliente. Em 1976, Clark foi certificado como o primeiro Chef de confeitaria afro-americano nos Estados Unidos. Ele também foi nomeado Chef do Ano pela American Culinary Federation.
& lt voltar ao topo & gt

Jeff Hilbert e Dave & quotRudy & quot Ruschhaupt & mdash Master Coach Operators
The Free Enterprise System Motor Coach Company

(Na foto à esquerda está Tonia Taylor-Hilbert, esposa de Jeff Hilbert, com Rudy Ruschhaupt.) Os vencedores do Prêmio ROSE, Jeff Hilbert e Dave & quotRudy & quot Ruschhaupt, compartilham o mesmo título: Master Coach Operators. Mestres, de fato. A dupla dinâmica ganha elogios de todos com quem entra em contato. Termos e frases como & quotprofissional, & quot & quotfriendly, & quot & quotcourteous, & quota joy & quot & quotacima no atendimento ao cliente & quot; quotalways excede a expectativa & quot e acima de tudo ñ & quotsafe & quot ñ estão entre a infinidade de comentários positivos que receberam daqueles que receberam servir. Quer sejam equipes esportivas, passeios escolares, grupos de jovens, excursões de lazer, fretamentos diurnos ou viagens estendidas a locais distantes, Ruschhaupt e Hilbert repetidamente vão além para oferecer um serviço excepcional. Eles se mostraram muito mais do que motoristas, mas guias, acompanhantes, conselheiros, comunicadores, protetores, bagageiros e solucionadores de problemas. Diz sua nomeadora, a Diretora de Vendas de Charter Kathey Morgan: “Nosso objetivo é impressionar os clientes e esses caras fazem exatamente isso. Wow! & Quot Hilbert tem impulsionado pelo Free Enterprise há mais de nove anos, enquanto Rudy está com o Free Enterprise há mais de 12 anos.
& lt voltar ao topo & gt

Charles & quotEric & quot Hinkle Coordenador de serviços educacionais & mdash
Museu Eiteljorg de Índios Americanos e Arte Ocidental

Os museus podem ser um lugar estático. Isto é, até que as portas se abram.
Então o caos pode reinar. Mas no Eiteljorg, o ganhador do prêmio ROSE, Eric Hinkle, é encarregado de trazer moderação à loucura, e seu sucesso em fazê-lo recebeu aplausos exemplares de visitantes, voluntários e colegas de trabalho. Hinkle supervisiona mais de 70 guias de museu. Ele combina guias com grupos. Ele planeja, agenda e confirma centenas de viagens para milhares de visitantes, desde o jardim de infância até estudantes universitários e adultos. Ele coordena as programações dos artistas visitantes para que possam ser organizadas viagens de divulgação a escolas e centros comunitários. He & rsquos na linha de frente em chamadas de campo e fornecendo informações. E ele faz tudo com um sorriso. Diz sua indicada, a diretora de educação Cathy Burton: “Ele faz tudo com bom humor, uma característica que mais de uma pessoa com quem conversei mencionou antes de qualquer outra coisa. Ele ri para si mesmo. Ele está muito satisfeito em fornecer um plano bem elaborado para grupos de visitantes. E se esse plano for desfeito, ele sempre encontra uma maneira de bolar um plano melhor. & Rdquo Hinkle é rotineiramente elogiado por sua pronta atenção às solicitações e por um acompanhamento e acompanhamento completos. Quer seja um passe de ônibus, informações sobre o almoço para um grupo escolar ou materiais do programa, a Hinkle está pronta para atender a qualquer necessidade. Melhor ainda, ele é um embaixador de Indianápolis em geral e de outras atrações do centro em particular. Embora Hinkle tenha trabalhado para a Eiteljorg nos últimos cinco anos, ele tem 20 anos no setor de hospitalidade, o que o tornou um ganhador vitalício do Prêmio ROSE.
& lt voltar ao topo & gt

Louis Kattie & mdash Gerente Assistente
Enterprise Rent A Car, Aeroporto Internacional de Indianápolis

Uma história diz tudo sobre o mérito do ganhador do Prêmio ROSE, Louis Kattie. Isso é porque é uma história e tanto sobre atendimento ao cliente extraordinário. Em dezembro passado, um cliente chegou à Enterprise Rent A Car no Aeroporto Internacional de Indianápolis. Ele estava aqui para visitar seu filho. Por ser deficiente, o cliente solicitou um carro com controles manuais de aceleração e frenagem. Infelizmente, devido a uma confusão de reservas, quando o cliente chegou, esse carro não estava disponível. E, como era sábado à noite, disseram-lhe que não haveria nenhum disponível pelo menos até segunda-feira. Compreensivelmente, o cliente estava chateado. Compreensivelmente, sem o carro especialmente equipado, ele ficaria efetivamente preso e incapaz de começar sua visita com seu filho. Foi então que Kattie soube da situação e deu um passo à frente. Ele disse que ao invés de ter transporte disponível para o cliente, ele se tornaria aquele transporte do cliente. Primeiro, ele providenciou um serviço de táxi para a casa em Mooresville onde o cliente ficaria. Então, na tarde seguinte, um domingo, Kattie chegou à casa em Mooresville para pegar o cliente. Estava nevando e as estradas estavam traiçoeiras, mas Kattie levou o cliente a Plainfield para buscar o filho e serviu como motorista até o final da noite. Na manhã seguinte, um carro especialmente equipado foi localizado. Mais uma vez, Kattie dirigiu até Mooresville, pegou o cliente e o devolveu à Enterprise, onde o carro estava esperando. O que Kattie nunca mencionou foi que ele realmente morava em Noblesville, cerca de 35 milhas de Mooresville. Quando o cliente soube que o gerente assistente havia feito uma viagem de ida e volta de 70 milhas, em um domingo de folga, em más condições das estradas, bem, nem é preciso dizer, ele ficou comovido com aquele nível de atendimento ao cliente. Kattie Louis está na Enterprise Rent a Car há dois anos e, de acordo com seu gerente, ele oferece um atendimento excepcional ao cliente como regra, não como exceção.
& lt voltar ao topo & gt

Pamela Kennson & mdash Docent
Museu de Arte de Indianápolis

Pamela Kennson, ganhadora do Prêmio ROSE, desempenha um papel fundamental no aprimoramento da experiência de milhares de visitantes anualmente a uma das atrações mais populares da área de Indianápolis, o Museu de Arte de Indianápolis. Em grande parte devido aos seus esforços, o número de visitas do público ao IMA quase quadruplicou. Kennson conseguiu isso expandindo as informações no calendário público para fornecer descrições específicas de passeios e exposições. Mas seu serviço vai além de meros números. Embora ela supervisione este programa docente voluntário do museu e rsquos - um docente, por falar nisso, é um guia - ela sempre é rápida em dar um passo à frente e assumir o papel de docente. Ela também supervisionou o uso de vídeo, permitindo que os docentes gravassem suas próprias sessões educacionais. Isso, por sua vez, permitiu que os docentes estivessem mais bem informados sobre as novas exposições e ideias para passeios. Kennson também defendeu a acessibilidade, em particular para aqueles com deficiência auditiva, certificando-se de desenvolver e fornecer dispositivos que auxiliem a habilidade auditiva. Pamela está no IMA há 11 anos.
& lt voltar ao topo & gt

Andrew Meyers Servidor & mdash, Host, Catering
Scotty's Brewhouse, 96th Street

Em apenas um ano na Scotty & rsquos Brewhouse, Andrew Meyers foi reconhecido como o funcionário da semana e o funcionário do mês. Agora ele adiciona um prêmio ROSE a essas distinções. Scotty & rsquos, gerente geral, John Cavanaugh, elogia Meyers por sua atitude infalivelmente otimista que afeta colegas de trabalho, gerentes e, principalmente, clientes. Enquanto trabalhava principalmente como servidor e host, Meyers também teve um impacto positivo nas operações de catering da Scotty & rsquos. He & rsquos citou como um dos principais motivos para um aumento de 400% nos negócios. Disse um cliente: & quotEle realmente dá grande atenção aos detalhes, sempre tem um sorriso no rosto e uma atitude super, como posso ajudar. & Quot Aqui estão alguns outros comentários dos clientes: & quotFez um trabalho fantástico.Várias pessoas comentaram sobre sua grandiosidade. & Quot & quotVocê foi eleito o MVP da semana. & Quot Meyers está com Scotty & rsquos há um ano e no setor de hospitalidade há mais de seis. Diz Cavanaugh, & quotSe Andrew não tinha ambições de frequentar a faculdade de direito da IU, devo promovê-lo a gerente. & Quot
& lt voltar ao topo & gt

Kim Mills Servidor de alimentos e bebidas & mdash
Hyatt Regency Indianapolis

Kim Mills, premiada com ROSE, foi nomeada associada do ano no Hyatt Regency Indianapolis em 2009. O hotel também possui uma equipe All-Star para reconhecer a excelência de serviço. Mills foi selecionada para esse time de All-Stars não menos que 18 vezes em seus 26 anos de carreira. É fácil perceber o porquê. Como instrutor líder para servidores e instrutor principal para todas as novas contratações, Mills vai além do básico para transmitir sua paixão, habilidade e conhecimento do trabalho. Uma de suas estagiárias escreveu: “Você torna o restaurante parte de sua família e trata a todos como se fossem seus filhos. Você tem um coração tão carinhoso e demonstra isso todos os dias. & Quot Não faz muito tempo, o restaurante do hotel foi visitado por um comprador secreto que fez o possível para sacudir Mills em uma manhã movimentada. Foi tudo em vão. O comprador secreto mais tarde descreveu o serviço da Mills & rsquo como impecável e disse que Mills, em particular, era "encantadora". Diz a gerente Laurie Butler: "Ela exemplifica liderança. A sinceridade de sua preocupação com os convidados e colegas de trabalho é realmente incrível. Ela trata o restaurante como se fosse sua casa. & Quot Como garçonete no Hyatt Regency Indianapolis desde 1984, Mills se qualificou como ganhador vitalício do prêmio ROSE.
& lt voltar ao topo & gt

Rachel Radez & mdash Agente de serviço a hóspedes / Coordenador de eventos especiais
Holiday Inn Express Northwest - Indianápolis

Ao nomear Rachel Radez para o prêmio ROSE de 2010, a gerente geral assistente Brandy McClaren disse que o problema não era apresentar exemplos específicos de sua excelência em serviços. O problema era determinar entre qual escolher. McClaren citou um casal recém-casado com um orçamento apertado que não podia pagar uma luxuosa lua de mel em um resort distante. Então, eles reservaram um quarto no Holiday Inn Express. E era apenas um quarto padrão, nem mesmo a suíte de lua de mel. Mas, ao fazer a reserva, Radez decidiu que "apenas um quarto" não seria suficiente. Para começar, ela fazia com que alguns colegas da equipe dessem ao casal uma alegre recepção quando chegassem. Então, mesmo sendo dia de folga, ela chegou para saudar o casal com vinho, flores e alguns outros itens românticos, que pagou com seu próprio dinheiro. Então, há o hóspede frequente que tem deficiência física e intelectual. Radez garante que ele tenha uma viagem de ida e volta para seu destino. Ela às vezes traz refeições caseiras para ele e atende seus pedidos especiais. Ainda outro hóspede de estadia prolongada está recebendo refeições caseiras entregues por Radez. Por que, o convidado perguntou? Resposta de Radez: & quotSei & rsquos faz um tempo que você voltou para casa, e todos deveriam ter uma refeição caseira de vez em quando. & Quot Qual é a popularidade de Radez entre os hóspedes do hotel? Considere isso ... vários convidados compareceram ao seu casamento ou enviaram cartões e presentes. Mesmo durante o check-in, a primeira pergunta que muitos hóspedes costumam fazer é: "Onde está Rachel?" A gerência do hotel diz que Radez tem sido parte integrante do aumento da pontuação geral de satisfação do hóspede em mais de 10 por cento no ano em que ela está empregada.
& lt voltar ao topo & gt

Irma Rodarte & mdash Room Attendant
Omni Severin Hotel

Você poderia falar sobre Irma Rodarte & rsquos quase 10 anos de serviço como atendente de quarto de hóspedes do Omni Severin Hotel. Você poderia falar sobre como ela atende a qualquer momento em que haja uma necessidade por causa de doença ou falta de pessoal. Você poderia falar sobre como ela vai além da limpeza dos quartos dos hóspedes para trabalhar no saguão, fazer o serviço noturno de arrumação de cama ou lavanderia. Você poderia falar sobre sua atitude otimista, como ela foi nomeada campeã de serviços de hotel por cinco anos consecutivos ou como ela treinou novos atendentes de quarto de hóspedes. Você poderia até falar sobre o fato de que vários convidados que retornam anualmente para eventos de alto nível em Indianápolis rotineiramente solicitam Rodarte como seu atendente de quarto de hóspedes. Só isso já qualificaria Rodarte para receber o Prêmio ROSE. Mas então também há isso. No ano passado, ela ajudou a salvar a vida de um hóspede. Certo dia, durante o serviço, Rodarte ouviu ruídos estranhos vindos de uma sala. Após investigação, ela descobriu um hóspede entrando em coma diabético. Ela rapidamente convocou a assistência de emergência e ficou com o hóspede até a chegada de ajuda médica. Pessoa certa. Lugar certo. Tempo certo. Vida salva. John Billstrand, diretor de recursos humanos, diz que Omni Severin e Indianápolis são lugares melhores porque o coração de Irma & rsquos para o serviço e as conexões genuínas que ela faz com os visitantes. A abnegação de Rodarte se estende à sua vida doméstica, onde ela prepara refeições para os necessitados ou cuida dos filhos dos vizinhos sempre que necessário.
& lt voltar ao topo & gt

Russ Roth & mdash Valet / Bell Captain
Hilton Indianapolis

Imagine a situação e a exasperação da família que estava hospedada no Hilton Indianápolis no dia de Natal para ficar perto de seu filho, que havia se submetido a uma cirurgia de câncer no dia anterior. Enquanto a família se dirigia ao veículo para ir ao hospital, eles descobriram que o veículo havia sido vandalizado, com as janelas quebradas. Sem saber o que fazer, eles procuraram o valet / capitão do sino Russ Roth, um ganhador do Prêmio ROSE de 2010. Em minutos, ele conseguiu que uma empresa de vidro consertasse o veículo, embora fosse dia de Natal. Ele ligou para um funcionário da manutenção, que aspirou o vidro quebrado do veículo. E enquanto a família aguardava o conserto, ele estacionou o veículo sob a cobertura do hotel para que ficasse protegido da neve que caía. Muito mais rápido do que se poderia esperar, a família estava a caminho do hospital. Essa é apenas uma das histórias que constituem o testemunho de Roth. Teve a equipe da NBA cujo ônibus passou por dificuldades mecânicas que ameaçavam atrasar sua saída para o Conseco Fieldhouse. A ação rápida da Roth & rsquos garantiu transporte alternativo e uma chegada oportuna. Outro autodenominado viajante mundial cita Roth & rsquos & quotserviço excepcional e disposição para ajudar de qualquer forma. & Quot Diz seu nominador, & quotEmbora seu cargo seja manobrista / capitão de sino, você pode encontrá-lo guardando bagagens, providenciando transporte, ajudando um hóspede no centro de negócios, na recepção fazendo o check-in e o check-out dos hóspedes e até estacionando os carros. Ele tem continuamente tomado a iniciativa de treinar em todas as facetas da hospitalidade ao seu alcance. & Quot Roth está no Hilton Indianápolis há dois anos e já foi promovido duas vezes. O Hilton Indianapolis afirma que o trabalho da Russ & rsquos permitiu ao hotel aumentar a satisfação dos hóspedes e as taxas de lealdade.
& lt voltar ao topo & gt

Kenneth & quotKT & quot Taylor Servidor & mdash
Cracker Barrel Old Country Store

Quando você chega na Cracker Barrel Old Country Store na North Michigan Road, se você tiver sorte de estar sentado em uma determinada seção, você não receberá apenas comida. Você será entretido pelo servidor de canto. Essa é a marca registrada do ganhador do Prêmio ROSE Kenneth & quotKT & quot Taylor. Talvez você já tenha ouvido falar de cantar para o jantar? Bem, KT dá a volta por cima. Ele canta junto com seu café da manhã. Existe até prova de vídeo. Um grupo de senhoras, brincando, pediu a Taylor que cantasse para elas. Quando ele começou, de fato, uma música, uma das garotas gravou em seu I-phone e postou no You Tube. O vídeo é intitulado, & quotBest Breakfast Ever. & Quot Como sempre acontece, o efeito viral do vídeo tomou conta, e agora KT tem rotineiramente clientes o solicitando. Ele foi contratado pela Cracker Barrel por 3-1 / 2 anos.
& lt voltar ao topo & gt

Jason Woolridge & mdash Configuração e servidor de banquete
Renaissance Indianapolis North

Às vezes, diz-se que a juventude é desperdiçada com os jovens. Esse não seria o caso com o recebedor do Prêmio ROSE, Jason Woolridge. Em pouco mais de um ano desde que se formou na Purdue University, Wooldridge se destacou para clientes e colegas de trabalho com sua atitude, ética de trabalho e maneira orientada para o serviço. Embora suas funções primárias sejam preparar um banquete e ele passar a maior parte do dia no "fundo da casa", isso não impediu Woolridge de causar uma impressão direta. Um banquete em que ele trabalhou gerou nada menos que 50 cartões de comentários cantando seus elogios. Seu nomeado, Diretor de RH Erin Hayek, observa que tudo começa com perspectivas, dizendo que seu temperamento é & quot150% positivo & quot e que a atitude positiva é & quotcontagiosa & quot. Hayek continua, & quotSeu serviço aos hóspedes é excelente todos os dias e seu serviço aos seus colegas de trabalho e gerentes é excelente a cada momento. Ele define excelência de serviço com sua positividade, seu compromisso com a perfeição, sua confiabilidade e alto nível de responsabilidade. Ele nasceu para receber este prêmio. & Quot
& lt voltar ao topo & gt


Enfermeira Ashley Jacobs, & # 8216Nunca fica chato & # 8217

Trabalhar na área médica sempre foi um acéfalo para Ashley Jacobs. E com cinco anos de enfermagem já em seu currículo, a jovem de 26 anos prevê uma longa e maravilhosa estrada de ajudar as pessoas, construir relacionamentos e muito mais pela frente.

Jacobs é uma das várias enfermeiras de área homenageadas pelo Times Leader para a semana de enfermeiras. Ela foi indicada por sua mãe, Angie, que disse que sua filha vai acima e além por aqueles de quem cuida.

& # 8220Ela é a enfermeira que você sempre deseja para sua família & # 8221 Angie escreveu em sua carta de indicação. & # 8220Ela é gentil, compassiva e prestativa tanto com seus pacientes quanto com seus colegas de trabalho. Ela dá 100% todos os dias. & # 8221

Atualmente, Jacobs trabalha como enfermeira em Wesley Village em Pittston. Admitindo que originalmente tinha planos de se tornar uma neurocirurgiã, Jacobs disse que mudou seu foco para a enfermagem por uma variedade de razões, incluindo o desejo de ser mais prática com os pacientes.

Além das interações diárias com os pacientes e de garantir que tudo corra bem nos bastidores, Jacobs observou que a enfermagem é um campo que oferece muitas portas a serem abertas. Como enfermeira, ela pode optar por trabalhar em qualquer lugar do mundo por meio de uma variedade de especialidades.

& # 8220Você pode realmente ir a qualquer lugar e fazer qualquer coisa como enfermeira, desde cardíaca a pediatria. É uma profissão que nunca fica entediante & # 8221 ela descreveu o campo.

Jacobs admitiu que ela não tem uma história ou memória específica que permaneça com ela. Em vez disso, ela vê toda a sua carreira de enfermagem como momentos de orgulho, dor e tudo o mais.

& # 8220Minha carreira inteira Tenho tantas famílias, residentes, colegas de trabalho e visitantes que tocam meu coração que não consigo escolher apenas um. Eu trabalhei à noite e fui para casa com o coração partido por um residente que gostaria de ter mais um dia, e eu & # 8217vei como pacientes de reabilitação saíram pela porta e seguiram com uma vida longa e saudável pela frente, & # 8221 ela explicou .

Em um momento em que a profissão se tornou o centro de várias manchetes nos últimos anos, Jacobs disse que se sentiu honrada e grata pela oportunidade de ajudar a mostrar tudo o que as enfermeiras fazem.

Para os alunos que se preparavam para entrar no campo, seu conselho era continuar tentando, estudar muito e tentar não procrastinar. Outra palavra de conselho? Permaneça gentil e compassivo, disse ela, para ajudar a fazer a diferença todos os dias.

No geral, entrar no campo da enfermagem ajudou a ensinar a Jacobs que cada segundo conta.

& # 8220Seja grato pelo que você tem, tantas pessoas têm tão pouco na vida e ainda têm um motivo para continuar & # 8221 ela disse. & # 8220Ver as pessoas em seu nível mais baixo pode deixá-lo sem graça, mas você aproveita cada dia, um e outro, e se elas podem continuar sorrindo & # 8211 eu também posso. & # 8221

Ashley Jacobs é enfermeira na Wesley Village em Jenkins Township.

Butch Comegys | Para Times Leader

Ashley Jacobs é enfermeira de reabilitação em Wesley Village em Jenkins Township. Foto de Butch Comegys / For Times Leader


Resolução

Para visualizar os arquivos de Ajuda de 32 bits com a extensão de arquivo .hlp no Windows, você precisará baixar e instalar o WinHlp32.exe do Centro de Download da Microsoft.

Notas importantes para baixar este programa

Abra os links usando o Internet Explorer.

Se você vir uma mensagem "Validação necessária" ao abrir a página de download, clique em Continuare siga as instruções na tela.

Quando for solicitado a baixar o arquivo, selecione o nome do arquivo que contém "x64" para versões de 64 bits do Windows ou "x86" para versões de 32 bits do Windows. Use as seguintes informações de detecção automática para fazer sua escolha.

O programa de Ajuda do Windows não é compatível com o Windows Server 2012 ou versões posteriores do Windows Server.

Se você encontrar problemas ao instalar o WinHlp32.exe ou usar a Ajuda, vá para a seção "Mais informações".


Somente para uso externo. Evite o contato direto com os olhos. Se ocorrer irritação na pele, interrompa o uso.

  • Os óleos essenciais CPTG de Olíbano, Sândalo Havaiano, Lavanda, Mirra, Helichrysum e Rosa desempenham um papel fundamental no apoio a uma pele com aparência saudável.
  • O complexo lipídico vai além de um hidratante típico, usando lipídios semelhantes aos encontrados naturalmente na pele em seu início.
  • Hidrata profundamente para reduzir o aparecimento de linhas finas e rugas.
  • A fórmula avançada combina os lipídios dos óleos de oliva, jojoba e macadâmia para produzir uma pele incrivelmente macia e suave.

Melhor momento de atendimento ao cliente na WDW

O Walt Disney World é bem conhecido por seu atendimento ao cliente (principalmente) incrível. E quero ouvir alguns dos seus momentos favoritos de quando um CM se esforçou para ajudá-lo a tornar sua viagem ainda mais memorável.

Então, naturalmente, vou começar com o meu próprio. Meus pais e meu irmão de 2 anos (recém-adotado) tínhamos reservas de personagens matinais no Cape May Cafe, e estávamos esperando um pouco, então pegamos um ônibus em nosso resort e fomos para o Epcot pegar um ônibus de conexão para o restaurante. Não conseguimos encontrar o ponto de ônibus do resort, então fomos ao escritório de transporte para obter instruções, dissemos a ela o que estávamos fazendo e ela disse que nos levaria no SUV da empresa até lá. Quando estávamos no carro, descobrimos que ela era a diretora de transporte do epcot. Fiquei chocado que ela reservou um tempo do seu dia para nos ajudar. Nós chegamos lá sem problemas

FettFan

Membro Conhecido

Não realmente WDW. mas podia contar, já que estávamos em um resort. Nós jantamos no Rainforest Cafe fora do Animal Kingdom. Nosso servidor era Larry. Ele foi INCRÍVEL, até mesmo ajudando meu avô deficiente a navegar pelo menu. Depois do jantar, quando ele nos trouxe a conta, ele posou conosco para algumas fotos.

Larry e o resto da equipe do Rainforest Cafe estavam no topo de seu jogo, e eu acho que o serviço deles realmente superou alguns dos restaurantes no parque. (Estou olhando para você Sci-Fi Dine In)

NemoRocks78

Apreendido

Pumbas Nakasak

Rumo à grande fuga.

Woody98

Membro Ativo

JIMINYCR

Membro Conhecido

Steviej

Membro Conhecido

Rcapolete

Membro Ativo

Bethymouse

Membro Conhecido

Bethymouse

Membro Conhecido

Big Phil

Membro Conhecido

Em 1995, meu pai perdeu o chapéu na Splash Mountain. Era um daqueles velhos chapéus do tipo "John Deere" que não valiam nada, mas ele ainda esperava recuperá-lo. Na saída, no final da noite, ele parou na prefeitura para relatar. Duas semanas depois, o chapéu chega pelo correio. Em 2009, a mesma coisa aconteceu com minha esposa. Acreditamos que foi em Pirates, onde ela perdeu seus óculos de sol. Novamente, não é um grande negócio, mas de qualquer forma eu disse a ela para relatar e ela os recebeu de volta pelo correio.

De um nível pessoal, eu realmente gostei de conversar com um jovem cavalheiro em One Man's Dream. Fiquei realmente fascinado com a quantidade de informações e lembranças na parte pré-show. Eu o procurei e perguntei se ele sabia onde um dos mapas originais de 1971 poderia ser encontrado. Ele não sabia, mas aconselhou que eu procurasse no Google. Ele então começou a falar longamente sobre a inauguração do parque em 1971. Ele era muito versado em tudo isso e não acho que ele tivesse mais de 20 anos. Foi com ele que soube que o Piratas foi forçado em 1973 por causa de grandes reclamações de não tê-lo. Ele diz que eles se apressaram demais, tornando o da Disneylândia muito superior. Havia apenas um monte de gotas de informação que ele compartilhou e ele não precisava fazer isso comigo. Eventualmente, eu tive que ser arrastado para longe da minha palestra sobre a Disney, já que o show estava começando

DizneyPryncess

Membro Conhecido

Stlbobby

Membro Conhecido

Já postei isso antes, mas parece um bom lugar para reiterar.

Há alguns anos, acho que foi em 2006, voei de St. Louis para Orlando e tive uma briga horrível com um passageiro que depois se transformou em uma discussão com um comissário de bordo. Fiquei extremamente chateado e mesmo depois de falar com o gerente do atendente e uma viagem festiva do Magical Express ao meu resort. Eu ainda estava visivelmente chateado.

Durante o check-in na SS, o CM perguntou se havia algo errado e eu disse a ela para não se preocupar com isso, a culpa era da companhia aérea. Ela continuou a perguntar sobre isso e eu assegurei a ela que não era culpa ou problema da Disney, mas eu dei a ela a versão resumida.

Meu quarto não estava pronto, então fui para o centro para almoçar e fazer compras. Quando finalmente cheguei ao meu quarto, cerca de três horas depois, havia uma pequena cesta de presentes e um bilhete dizendo que a gerência da SS não queria que minhas férias começassem mal e eles esperavam que as guloseimas ajudassem.

As guloseimas ajudaram e minhas férias melhoraram imediatamente. Meu problema não tinha nenhuma relação com qualquer coisa que a Disney fizesse, mas eles borrifaram um pouco de mágica para mim de qualquer maneira.

Vou dizer que tive sorte e consegui um dos melhores CM's por aí, gostaria de me lembrar do nome dela, e esse tipo de coisa não é 100%, mas também não desapareceu completamente como tantas vezes se apregoa.

Essa mulher foi apenas um dos muitos grandes CMs que encontrei em minhas visitas. Tenho algumas outras histórias incríveis que compartilharei mais tarde, se esta for bem recebida.

Eu só queria compartilhar essa história porque ela significou muito para mim na época e ainda me toca hoje.

Peculiaridade

Membro Conhecido

Já escrevi algumas vezes sobre grandes experiências. Eu tinha 3 anos e juro que Cinderela estava acenando do castelo e meu irmão gritou Cinderela - minha irmã quer conhecê-lo. Minutos depois, fui levado para encontrar CInderella em um M & ampG privado. Eu era uma criança, mas, olhando para trás, presumo que fosse um CM fazendo mágica.

Uma vez, quando minha família estava saindo do Seas com Nemo e minha filha mais nova chorou que queria continuar de novo. Eu estava planejando voltar para a fila quando um CM perguntou à minha filha de 3 anos o que a faria feliz e ela disse que voltaria na viagem. Bem, o CM nos levou por um caminho de volta para a frente da linha. Minha filha sorriu de orelha a orelha.

Outra vez, estávamos em um M & ampG ling para ver as fadas na velha cidade de Toon. Quando chegamos à frente, perguntamos quais fadas estavam lá e quais eram as que tínhamos acabado de ver. O CM perguntou quem queríamos ver e eu disse a ela Fawn ou Irridescia. Ela me chamou de lado e me disse que Fawn estaria lá após o próximo intervalo e me deu um cartão para trazer de volta para o caminho de volta, a fim de ser uma das primeiras a conhecer Fawn - minhas filhas pareciam membros da realeza.

Uma manhã na POFQ os ônibus estavam funcionando MUITO TARDE - havia 4 ônibus b2b HS, mas queríamos EPCOT. A CM parou a chamada para o transporte e abriu uma caixa mágica com bugigangas que ofereceu às minhas filhas para mantê-las felizes.

Na noite de Natal, íamos jantar de POFQ a CS. Estávamos pegando o ônibus para AK e depois transferindo para CS. O ônibus AK parou e nós éramos as únicas pessoas. Mencionamos para onde íamos e o motorista do ônibus nos levou direto para CS.

Acho que tenho mais centenas!

Taylor

Membro Conhecido

Weather_Lady

Membro Conhecido

Eu contei essa história por um fio diferente, mas para encurtar a história:

Meu marido e eu, minha irmã e o marido dela e meus pais viajamos juntos para WDW em 2005. Nós reservamos um pacote de uma semana, hospedando-nos em Coronado Springs, com um agente de viagens local de renome. Fizemos nossas reservas com quase um ano de antecedência e pagamos integralmente bem antes da data de vencimento. Infelizmente, o agente não tinha ideia do que ela estava fazendo. Ela nunca nos encaminhou nenhum Mickey Mail (nem sabíamos como pedir): apenas um livreto de cupons que ela imprimira no escritório que listava os detalhes de nossa reserva, que ela nos disse ser tudo de que precisaríamos. Nossa viagem foi tranquila, mas quando chegamos a Coronado Springs para fazer o check-in, o gerente de vendas disse que nunca tinha visto nada como os & quotcupons & quot que tínhamos e não sabia o que fazer com eles. Ela também não conseguiu encontrar nossa reserva no sistema. Depois de tentar pelo que pareceram horas (mas provavelmente foram 15 minutos), ela chamou um gerente, que tentou falar com nosso agente de viagens por telefone (mas não conseguiu, porque era sábado e o escritório de viagens estava fechado). seis de nós estávamos lá em prantos, cercados por nossa bagagem, pensando que as férias que havíamos economizado e economizado estavam evaporando diante de nossos olhos.

Foi quando o gerente salvou o dia. Ela olhou os itens impressos do nosso agente de viagens, inseriu as informações no computador como uma nova reserva, nos deu nossos cartões-chave com os bilhetes carregados e nos disse para desfazer as malas em nossos quartos e sair para curtir os parques, que ela iria Cuidaria de tudo com o nosso agente de viagens, e nos contataria se houvesse algum problema. Pelo que eu poderia dizer, ela estava literalmente acreditando na palavra de seis pessoas exaustos com algumas impressões sem sentido de uma agência de viagens que nós realmente reservamos e pagamos nossas férias!

O gerente foi fiel à sua palavra. Ela nos ligou na segunda-feira para dizer que finalmente entrou em contato com nosso agente e obteve os números de confirmação necessários para confirmar a reserva. (Acho que o agente soletrou o sobrenome do meu pai incorretamente ou algo assim, o que tornou a reserva impossível para o gerente de check-in encontrar.) Tudo o que sei é que esse gerente transformou um pesadelo de férias em um não-problema total com um varredura de sua mão (que estava, talvez, cheia de pó de pixie). Serei eternamente grato a ela, e à Disney em geral, por sua gentileza.


Você dá gorjeta a um barman ao encher um rosnador?

Eu só posso falar sobre como as coisas estão por aqui. Praticamente os únicos lugares que fazem rosquinhas são os pubs de cerveja. Eles não distribuem sua cerveja em garrafas, então um rosnador é a única maneira de levar um pouco para casa sem um barril e pode ser duvidoso conseguir um (eu nunca tentei ... risos).

Se eu estiver no pub tomando alguns drinques e quiser levar um growler para casa, então sim, certamente darei uma gorjeta. Se estou apenas correndo atrás de um rosnador, provavelmente não, e a razão é simples. Eu não dou gorjeta ao vendedor de bebidas por me vender um 6er, se um 6er estivesse disponível da cerveja específica, eu provavelmente não estaria enchendo de rosca. A exceção é se eu obtiver o serviço imediatamente e eles forem acima e além, então darei uma gorjeta, mas não como se estivesse sentado em um pub. Growlers IMO são um roubo 99% do tempo para começar. (não significa que eu não tenho nenhum lol)

Deflagratio

Membro Conhecido

GuldTuborg

Membro Apoiante

ChillWill

Membro Conhecido

Bovineblitz

Membro Conhecido

Nightbiker

Membro Conhecido
Membro Conhecido

Eu fui um barista, servidor, busser, bar back e bartender. Alguns ao mesmo tempo em empregos diferentes. Os baristas são os que mais trabalham, de longe, quando se trata de preparar bebidas. A maior coisa que percebi agora é que, servindo, servindo ou servindo em uma barra, você sempre pode escapar de clientes insignificantes. NÃO com bartending. Mas você diz: "Bem, não sou uma dessas pessoas". Um dia você será. Um dólar por cerveja é justo para uma gorjeta (ou menos, se esse for o troco restante). Se sua bebida requer um shaker ou mais de 3 ingredientes, 2 $ é justo.

O que a maioria das pessoas não percebe sobre o take away é que 9/10 vezes essa gorjeta vai para os cozinheiros. Portanto, a afirmação de "não estou dando gorjeta a alguém por me passar comida" é uma besteira completa. Que tal dar uma gorjeta ao cara que fez isso? Você sempre pode perguntar ao vendedor se a gorjeta vai para os cozinheiros.

Por último, todo o argumento de ninguém te dar gorjeta por fazer o seu trabalho também é uma falsa IMO. Se você quiser dicas, vá trabalhar no setor de serviços e receba muitos gritos. Se trabalhar em um bar fosse ótimo ou sem problemas, não teríamos bebidas do turno para levantar o moral.

Membro Conhecido

ESTE é o problema com todo o sistema. O que no mundo faria você dar gorjeta a alguém por oferecer um serviço menos do que perfeito.

Se eu fizer menos do que "bom" ou "cotas esperadas" no meu trabalho, recebo avisos, sou enviado para casa ou posso perder meu emprego - sem mencionar o fato de que, se não estiver no jogo, posso ser processado e alguém pode morrer.

Mlg5039

Membro Conhecido

Concordaram. Dar gorjetas mesmo quando o serviço é ruim reforça esse comportamento. A equipe de garçons e os bartenders realmente não vão se importar com seu nível de serviço se receberem continuamente dicas para um trabalho ruim.

Como você disse, em quase todas as outras profissões, eles seriam repreendidos por um desempenho inferior ao desejável.

Mas para o OP, sim, dou uma gorjeta de um dólar a um bom barman por encher um Growler fresco.

Rycov

Membro Conhecido
Membro Conhecido

Se o seu chefe não gosta do que você está fazendo, ele não pode te pagar. Eles podem mandá-lo para casa sem pagamento em cerca de 70% dos estados dos EUA.

Dar gorjeta é uma recompensa por se sair bem. Dar gorjeta a alguém que faz merda é como dar a seu cachorro um petisco por mijar no chão.

Seu TRABALHO é fornecer um bom serviço. Se eles não podem fazer seu trabalho, eles não recebem a recompensa de um pagamento extra de mim. Se eles se saírem bem, receberão uma boa gorjeta. MAS você não tem garantia de uma gorjeta.

Não é difícil fazer bem. Inferno, você poderia estragar tudo, mas se você apenas disser & quotSinto muito, eu vou consertar & quot em vez de passar a bola de costume, é o cozinheiro / barman / gerente / alguém que não seja culpa minha música e dança, você geralmente ainda estará muito bem.

De forma alguma, forma ou forma são dicas EXIGIDAS, mesmo se você me fornecer um serviço de baixa qualidade. Se você quiser ganhar mais de 2 dólares por hora (BTW, cerca de 50% dos estados exigem salários em torno do dobro do que para trabalhadores que recebem gorjeta), então faça o seu maldito trabalho.

Meramente encher um rosnador não significa que você receberá uma gorjeta. Parabéns, você fez a função mais básica do seu trabalho, aqui está uma recompensa!

Rycov

Membro Conhecido

Deflagratio

Membro Conhecido

Wildwest450

Banido

Tudo o que sei é que dar boas gorjetas resultou em MUITAS bebidas grátis e um serviço excelente. Um bom retorno para um pequeno investimento.

ChillWill

Membro Conhecido

ReverseApacheMaster

Banido

Não concordo com o conceito de tipping = salários, mas percebo que é assim que o sistema funciona. Não dou gorjeta a pessoas que não recebem salários com base em gorjetas, a menos que elas tenham ido além de suas obrigações de serviço. Acho ridículo e um pouco ofensivo quando vou a uma lanchonete e eles escrevem ou imprimem uma linha de gorjeta no recibo. Se você está ganhando US $ 8 / hora, não precisa de gorjeta pelos dois minutos que levou para preparar meu sanduíche e colocá-lo em um saco.

Também não acredito que um serviço ruim significa que ainda devo dar gorjeta ou perder tempo dizendo ao gerente que seus funcionários não estão fazendo seu trabalho. Afinal, essa é a função do gerente - gerenciar. Serviço de baixa qualidade significa apenas nenhuma dica. Pessoalmente, acho que se você for colocar uma linha no recibo do cartão de crédito que me permite ajustar o total, deve funcionar nos dois sentidos. Serviço realmente ruim significa em vez de somar ao total que eu deveria ser capaz de subtrair dele. No entanto, ainda não experimentei. Eu não recebo TÃO ruim de serviço há muito tempo.

Também acredito que o trabalho que se espera de você justifica mais uma dica. Se você servir minha mesa por uma hora anotando pedidos, trazendo bebidas / comida, enchendo água, etc., você merece uma gorjeta (e mais do que uma gorjeta) do que alguém que leva uma ligação de dois minutos para um pedido de entrega e mais dois minutos para telefonar. No entanto, geralmente dou gorjeta aos bartenders bem acima do normal, desde que o serviço seja bom. Eu levo em consideração a qualidade do serviço e o quão ocupado é. Se você tem todas as tabelas cheias em sua seção eu posso entender alguns espere. Se eu sou sua única mesa, meu copo de água não deveria ficar vazio.

Para o OP, sim, eu daria uma gorjeta para encher um rosnador como se estivesse pedindo uma cerveja. É praticamente a mesma coisa.

Rycov

Membro Conhecido

The_trout

Membro Conhecido

Faça três. Eu costumava ir ao Toad no início dos anos 90. Era um bar incrível e um dos poucos lugares onde você podia conseguir uma boa cerveja. Presumo que ainda seja incrível. Acho que estou velho demais para o pessoal da Alaxander St. hoje em dia.

No que diz respeito à gorjeta, sim. Eu também sigo a regra $ 1 / draft. Eu provavelmente iria com um cara em um rosnador. Se eu vou ficar lá por um tempo, vou verificar e dar uma gorjeta de no mínimo 10% para um serviço medíocre. Se eu tiver uma garçonete concorrendo para mim, ela receberá 15% +. Se uma rodada de $ 20 de bebidas misteriosamente desaparece da minha conta, um extra de $ 10 aparece misteriosamente na ponta.

Também fiz todo o trabalho de restauração, tudo desde a máquina de lavar louça ao barman e todos os pontos intermediários. Praticamente qualquer pessoa com quem você interage está trabalhando por muito menos do que o salário mínimo e depende de gorjetas para pagar suas contas.

Centro da cidade3641

Membro Conhecido

Eu sou um paramédico de profissão. Eu faço o trabalho porque adoro, não porque espero ficar rico. Isso é uma coisa boa, porque eu sou pago uma porcaria.

Eu trago pessoas de volta dos mortos e não posso receber gorjeta por isso. Eu também não espero.

Alguém pegando um copo e me servindo de uma bebida não tira um dinheirinho de mim apenas pelo esforço.

SE eles me derem bons conselhos, um ótimo serviço e tornarem a estadia agradável, vou dar uma gorjeta ok. Mas simplesmente existir e cumprir as funções básicas de seu trabalho não lhes dá alguns direitos especiais a uma gorjeta.

Você recebe mais do que alguns dólares por hora para fazer seu trabalho. Sempre dê gorjeta ao seu servidor se eles forem, pelo menos, adequados. Eu não me importo se você der uma gorjeta ao seu barman. Sim, mas pelo menos eles não estão contando totalmente com dicas.

Não posso acreditar que as pessoas que acham que devam dar gorjeta aos servidores, a menos que sejam incrivelmente boas. Fique em casa.

Membro Conhecido

Dar gorjeta aos cozinheiros foi obrigatório ou recomendado em todos os empregos que fiz em restaurantes. Geralmente cerca de 10% das gorjetas ou das vendas de alimentos. Se for a venda de comida, então é realmente uma pena para o barman, já que a maioria das pessoas não dá gorjeta ao pedir comida no bar.

A diferença é provavelmente que na sala de cirurgia todos ganham um salário mínimo integral.

ChshreCat

Membro Conhecido

Ferrugem

Membro Conhecido

A maioria dos bares que frequento tem o preço de suas cervejas em 4 dólares o litro, então, se eu pagar em dinheiro, sempre entrego um 5 e considero bom. Se eu executar uma conta, normalmente dou uma gorjeta de cerca de 5 dólares.

Sim, um barman está apenas enchendo os copos, enquanto um garçom / garçonete tem que fazer muito mais. Mas o barman também está tendo que lidar com muito mais pessoas que se tornam idiotas assim que a menor quantidade de álcool entra em seu sistema, então eu meio que tenho mais simpatia por eles. Principalmente nas noites de sexta e sábado. Além disso, muitos bares que já estive tiveram até 100 pessoas neles e apenas um bartender trabalhando, então ele está arrasando. Se estou fazendo com que ele reserve um tempo para encher um rosnador, definitivamente vou dar-lhe algo por isso. Provavelmente alguns dólares.

Dallasdb

Membro Conhecido

Espero que ninguém fique ofendido. Eu concordo totalmente que é idiota não dar gorjeta.

No entanto, existem certas áreas cinzentas quando se trata de tombamento. Eu também notei recentemente mais e mais lugares adicionando & quottip cups & quot na frente de seus registros.

Existem alguns restaurantes mexicanos de fast food / jantar casual em Denver que têm um copo de gorjeta ao lado da caixa registradora.

Eles são como um metrô, mas para burritos e tacos. É meio passo acima do fast food. Não estou com vontade de dar gorjeta por um burrito de & quotrápido & quot.

Para mim, essa é uma área cinzenta.

Thezepster

Membro Conhecido

Espero que ninguém fique ofendido. Eu concordo totalmente que é idiota não dar gorjeta.

No entanto, existem certas áreas cinzentas quando se trata de tombamento. Eu também notei recentemente mais e mais lugares adicionando & quottip cups & quot na frente de seus registros.

Existem alguns restaurantes mexicanos de fast food / jantar casual em Denver que têm um copo de gorjeta ao lado da caixa registradora.

Eles são como um metrô, mas para burritos e tacos. É meio passo acima do fast food. Não estou com vontade de dar gorjeta por um burrito de & quotrápido & quot.

Para mim, essa é uma área cinzenta.

Maluco

Membro Conhecido
Membro Conhecido

Skibb

Membro Conhecido

IffyG

Membro Conhecido

Rycov

Membro Conhecido

Dar gorjeta aos cozinheiros foi obrigatório ou recomendado em todos os empregos que fiz em restaurantes. Geralmente cerca de 10% das gorjetas ou das vendas de alimentos. Se for a venda de comida, então é realmente uma pena para o barman, já que a maioria das pessoas não dá gorjeta ao pedir comida no bar.

A diferença é provavelmente que na sala de cirurgia todos ganham um salário mínimo integral.

Rexbanner

Membro Conhecido

Trabalhei em um dos Starbucks mais movimentados dos EUA. Tínhamos seis funcionários trabalhando ao mesmo tempo - uma loja normal de alto volume tem 4 no máximo. A linha esteve fora da porta durante todo o tempo em que trabalhei. Tente olhar para uma fila de 30 bebidas para fazer. Isso é cerca de 30 bebidas mistas.

Você não consegue nenhuma simpatia de mim. Ganhei um salário mínimo. Trabalhei das 5h às 11h e fui para a aula até as 4h. Recebi ZERO gorjetas porque era uma franquia.

Metade dos bartenders com quem lidei são babacas arrogantes ou garotas que pensam que sentem saudades da Califórnia. Na semana passada, tentei comprar água em um clube por 5 dólares. A vadia estúpida não me disse que havia um mínimo de $ 30 até que eu perguntei a ela por que não havia nenhum valor em dólares para o total. Quando eu disse a ela que iria passar, ela colocou uma gorjeta de $ 250 no meu nome e falsificou minha assinatura depois. Há um mês, um barman se recusou a me servir porque eu só dei a ele 10% de gorjeta na primeira bebida que pedi. Na faculdade, havia um bar onde se você sinalizava que queria pedir de qualquer maneira, forma ou forma, você era cortado.

**** QUE. Eu dou 20% de gorjeta a todos os garçons. Os barmen devem ser gratos por qualquer coisa que eu ofereça a eles. Sempre dou gorjeta entre 10-20%. Você quer mais? Seja legal. Não seja um idiota. Na próxima vez que um desses idiotas tiver um problema, vou seriamente tentar fazer com que eles sejam demitidos.

Membro Conhecido

Se você realmente quer chorar comigo sobre como é difícil ser um servidor, sugiro que enfrente a realidade. Quando você crescer e conseguir um emprego de menino grande, podemos falar sobre empregos difíceis e circunstâncias tocantes.

Seu trabalho já resultou na vida ou morte de alguém meramente com base em sua tomada de decisão?

Seu trabalho é ir trabalhar, anotar um pedido, trazer o pedido de volta e limpar a merda da mesa. STFU.

Se você quer uma gorjeta, ganhe. E reclamar disso em ambientes como este é mais provável de fazer mais pessoas se protegerem.

Qhrumphf

Permaneça rude, permaneça rebelde, permaneça ativo

Iaefebs

Banido

Edb23

Membro Conhecido

já que todo mundo está fora do assunto de qualquer maneira.

Como cozinheiro profissional, minha opinião sobre os garçons é muito baixa. quase todos os servidores que funcionam na minha cozinha (trabalho neste lugar há algum tempo e já vi muitos servidores irem e virem) são um idiota absoluto. pedidos se perdem todos os dias, eles colocam ingressos para a coisa errada e depois me culpam quando eu cozinho o que eles pediram, etc.

Dito isso, cada pessoa que trabalha em um restaurante está se movendo o mais rápido que pode e explodindo, especialmente na hora do dia em que você provavelmente está comendo. Se eles são bons ou não em seu trabalho, está realmente mais relacionado com sua aptidão para o trabalho do que com seu esforço. Especialmente no caso de bussers (que dependem das dicas que você dá tanto quanto os servidores), eles estão trabalhando nesse trabalho não porque querem, mas geralmente porque estão em uma situação financeira ruim e é o primeiro emprego que veio ao redor. quer você concorde ou não com isso, todo americano (e a maioria dos europeus também) sabe que uma gorjeta é esperada, e não dar gorjeta a alguém porque não conseguiu acertar seu pedido especial ou não encheu seu copo de água no segundo que você terminou é uma coisa terrível de se fazer. essas pessoas estão arrasando para tentar garantir que VOCÊ se divirta. o ambiente não permite preguiça, então se alguém se move devagar, pode ter a ver com outra coisa. só porque não está lotado, não significa que os cozinheiros não tenham cinquenta ingressos em que estão trabalhando. e se alguém parece estar te mostrando atitude, pode ser porque um cozinheiro como eu simplesmente deu uma bronca nele por perder um ingresso bagunçado, ou porque pela décima segunda vez hoje algum cliente pediu um bife mal passado, comeu um bife mal passado, insistiu que era de fato médio ou até mesmo algo ridículo como bem passado (isso aconteceu hoje) e depois mandou de volta e não deu gorjeta porque eles pegaram o cozimento "errado" em seu bife. dê gorjeta ao seu servidor

Membro Conhecido

já que todo mundo está fora do assunto de qualquer maneira.

Como cozinheiro profissional, minha opinião sobre os garçons é muito baixa.quase todos os servidores que funcionam na minha cozinha (trabalho neste lugar há algum tempo e já vi muitos servidores irem e virem) são um idiota absoluto. pedidos se perdem todos os dias, eles colocam ingressos para a coisa errada e depois me culpam quando eu cozinho o que eles pediram, etc.

Dito isso, cada pessoa que trabalha em um restaurante está se movendo o mais rápido que pode e explodindo, especialmente na hora do dia em que você provavelmente está comendo. Se eles são bons ou não em seu trabalho, está realmente mais relacionado com sua aptidão para o trabalho do que com seu esforço. Especialmente no caso de bussers (que dependem das dicas que você dá tanto quanto os servidores), eles estão trabalhando nesse trabalho não porque querem, mas geralmente porque estão em uma situação financeira ruim e é o primeiro emprego que veio ao redor. quer você concorde ou não com isso, todo americano (e a maioria dos europeus também) sabe que uma gorjeta é esperada, e não dar gorjeta a alguém porque não conseguiu acertar seu pedido especial ou não encheu seu copo de água no segundo que você terminou é uma coisa terrível de se fazer. essas pessoas estão arrasando para tentar garantir que VOCÊ se divirta. o ambiente não permite preguiça, então se alguém se move devagar, pode ter a ver com outra coisa. só porque não está lotado, não significa que os cozinheiros não tenham cinquenta ingressos em que estão trabalhando. e se alguém parece estar te mostrando atitude, pode ser porque um cozinheiro como eu simplesmente deu uma bronca nele por perder um ingresso bagunçado, ou porque pela décima segunda vez hoje algum cliente pediu um bife mal passado, comeu um bife mal passado, insistiu que era de fato médio ou até mesmo algo ridículo como bem passado (isso aconteceu hoje) e depois mandou de volta e não deu gorjeta porque eles pegaram o cozimento "errado" em seu bife. dê gorjeta ao seu servidor

Nunca disse que não dou gorjeta porque acontecem erros, ou porque é movimentado ou lento.

Não vou dar gorjeta a alguém que me forneça um serviço de baixa qualidade. Absolutamente, não.

Isso não tem nada a ver com a qualidade da comida, o tempo que demorou para ser servida ou acertada. Algumas das minhas maiores dicas foram deixadas depois de um pedido estragado. Uma vez, e apenas uma vez na minha vida, pedi para falar com um gerente, e não foi porque meu pedido estava bagunçado. Era porque o servidor era um idiota. Como se eu o visse no bar, eu o acertaria no queixo.


Por exemplo: vou muito ao HuHot com minha esposa. Ela gosta da comida enigmática, acho hilário eu pagar a alguém 14 dólares para poder fazer a maior parte do trabalho. O servidor não lida com nenhuma refeição principal. Eles são ótimos, recebem pedidos de bebidas e trazem sals / arroz. É a mesma rotina indefinidamente. Mas toda vez que vou lá, recebo um servidor diferente (acho que a rotatividade é muito alta lá), e toda vez que o serviço é estupidamente ruim. As bebidas ficam secas por 15 minutos (mesmo depois de pedir uma recarga. Eu entendo que você está correndo, mas se alguém pedir, é só fazer), o arroz sai frio (isso é de uma panela de arroz, então se está frio, o que significa que eles o deixaram sentado por muito tempo. E espero que o garçom o esteja servindo, como a maioria dos lugares para acompanhar saladas e similares), ou minha bebida é a coisa errada.


Se um servidor não gosta de seu trabalho, siga em frente. Mercearias e caminhões de lixo também precisam de funcionários.

Certa vez, trabalhei como cozinheiro de linha, garçonete e até mesmo lavador de pratos em alguns restaurantes - de pizzarias a restaurantes 4 estrelas. Posso dizer que ganhei muito mais dinheiro quando fazia meu trabalho bem do que quando era um idiota rabugento.


Se você gostaria de ver uma atmosfera acelerada, eu ofereceria para deixá-lo fazer um longo turno comigo e talvez nós tenhamos um grande trauma em várias vítimas ou uma parada cardíaca em um maldito shopping.


Se tudo o que alguém fizesse fosse abrir a torneira e me passar um rosnador, talvez recebesse a diferença do dólar. Se eles me derem bons conselhos sobre uma bebida, oferecerem bons substitutos para uma bebida favorita ou dicas sobre algo novo, eles podem ganhar alguns dólares.

Se eles me fizerem sentir que não sou apenas mais um fanfarrão, provavelmente serão recompensados ​​generosamente. Se eles me fizerem sentir que deveria ter gasto meu dinheiro em outro lugar, provavelmente o farei.


Lista de verificação de desempenho de front-end 2021

Este guia foi gentilmente apoiado por nossos amigos do LogRocket, um serviço que combina monitoramento de desempenho de front-end, reprodução de sessão e análise de produto para ajudá-lo a construir melhores experiências para o cliente. LogRocket rastreia as principais métricas, incl. DOM completo, tempo para o primeiro byte, primeiro atraso de entrada, CPU do cliente e uso de memória. Obtenha uma versão de avaliação gratuita do LogRocket hoje.

O desempenho na web é uma fera complicada, não é? Como sabemos realmente onde estamos em termos de desempenho e o que exatamente nossos gargalos de desempenho são? É JavaScript caro, entrega lenta de fontes da web, imagens pesadas ou renderização lenta? Otimizamos o suficiente com trepidação de árvore, levantamento de escopo, divisão de código e todos os padrões de carregamento sofisticados com observador de interseção, hidratação progressiva, dicas de clientes, HTTP / 3, service workers e & mdash oh my & mdash edge workers? E, o mais importante, onde começamos a melhorar o desempenho e como estabelecemos uma cultura de desempenho de longo prazo?

Antigamente, o desempenho costumava ser um mero reflexão tardia. Muitas vezes adiado até o final do projeto, ele se resumia a minificação, concatenação, otimização de ativos e, potencialmente, alguns ajustes finos no arquivo de configuração do servidor. Olhando para trás agora, as coisas parecem ter mudado significativamente.

O desempenho não é apenas uma preocupação técnica: ele afeta tudo, desde a acessibilidade à usabilidade até a otimização do mecanismo de pesquisa e, ao incorporá-lo ao fluxo de trabalho, as decisões de design devem ser informadas por suas implicações de desempenho. O desempenho deve ser medido, monitorado e refinado continuamente, e a crescente complexidade da web apresenta novos desafios que tornam difícil acompanhar as métricas, porque os dados variam significativamente dependendo do dispositivo, navegador, protocolo, tipo de rede e latência (CDNs, ISPs, caches, proxies, firewalls, todos os balanceadores de carga e servidores desempenham um papel no desempenho).

Portanto, se criássemos uma visão geral de todas as coisas que devemos ter em mente ao melhorar o desempenho & mdash desde o início do projeto até o lançamento final do site & mdash, como seria isso? Abaixo você encontrará um (esperançosamente imparcial e objetivo) Lista de verificação de desempenho de front-end para 2021 & mdash uma visão geral atualizada dos problemas que você pode precisar considerar para garantir que seus tempos de resposta sejam rápidos, a interação do usuário seja tranquila e seus sites não consumam a largura de banda do usuário.

Índice


    Cultura de desempenho, Core Web Vitals, perfis de desempenho, CrUX, Lighthouse, FID, TTI, CLS, dispositivos.
    Orçamentos de desempenho, metas de desempenho, estrutura RAIL, orçamentos de 170KB / 30KB.
    Escolha de uma estrutura, custo de desempenho de linha de base, Webpack, dependências, CDN, arquitetura de front-end, CSR, SSR, CSR + SSR, renderização estática, pré-renderização, padrão PRPL.
    Brotli, AVIF, WebP, imagens responsivas, AV1, carregamento de mídia adaptável, compressão de vídeo, fontes da web, fontes do Google.
    Módulos JavaScript, padrão de módulo / nomódulo, agitação de árvore, divisão de código, levantamento de escopo, Webpack, serviço diferencial, web worker, WebAssembly, pacotes JavaScript, React, SPA, hidratação parcial, importação na interação, terceiros, cache.
    Carregamento lento, observador de interseção, renderização e decodificação de adiamento, CSS crítico, streaming, dicas de recursos, mudanças de layout, service worker.
    Grampeamento OCSP, certificados EV / DV, empacotamento, IPv6, QUIC, HTTP / 3.
    Fluxo de trabalho de auditoria, navegadores proxy, página 404, prompts de consentimento de cookie GDPR, CSS de diagnóstico de desempenho, acessibilidade.

(Você também pode baixar o PDF da lista de verificação (166 KB) ou o arquivo editável Apple Pages (275 KB) ou o arquivo .docx (151 KB). Boa otimização para todos!)

Preparação: planejamento e métricas

Micro-otimizações são ótimas para manter o desempenho no caminho certo, mas é fundamental ter metas claramente definidas em mente & mdash mensurável objetivos que influenciariam quaisquer decisões tomadas ao longo do processo. Existem alguns modelos diferentes, e os discutidos abaixo são bastante opinativos & mdash apenas certifique-se de definir suas próprias prioridades desde o início.

    Estabeleça uma cultura de desempenho.
    Em muitas organizações, os desenvolvedores de front-end sabem exatamente quais são os problemas subjacentes comuns e quais estratégias devem ser usadas para corrigi-los. No entanto, enquanto não houver um endosso estabelecido da cultura de desempenho, cada decisão se transformará em um campo de batalha de departamentos, dividindo a organização em silos. Você precisa da adesão das partes interessadas do negócio e, para consegui-lo, precisa estabelecer um estudo de caso ou uma prova de conceito sobre como a velocidade - especialmente Core Web Vitals que abordaremos em detalhes posteriormente - métricas de benefícios e indicadores-chave de desempenho (KPIs) com quem eles se preocupam.

Por exemplo, para tornar o desempenho mais tangível, você pode expor o impacto no desempenho da receita, mostrando a correlação entre a taxa de conversão e o tempo de carregamento do aplicativo, bem como o desempenho da renderização. Ou a taxa de rastreamento do bot de pesquisa (PDF, páginas 27–50).

Sem um forte alinhamento entre as equipes de desenvolvimento / design e negócios / marketing, o desempenho não vai se sustentar a longo prazo. Estude reclamações comuns que chegam ao atendimento ao cliente e à equipe de vendas, estude análises para altas taxas de rejeição e quedas de conversão. Explore como melhorar o desempenho pode ajudar a aliviar alguns desses problemas comuns. Ajuste o argumento de acordo com o grupo de partes interessadas com quem você está falando.

Execute experimentos de desempenho e avalie os resultados & mdash tanto no celular quanto no desktop (por exemplo, com o Google Analytics). Isso o ajudará a construir um estudo de caso feito sob medida para a empresa com dados reais. Além disso, o uso de dados de estudos de caso e experimentos publicados no WPO Stats ajudará a aumentar a sensibilidade dos negócios sobre por que o desempenho é importante e qual o impacto que isso tem na experiência do usuário e nas métricas de negócios. Afirmar que o desempenho é importante por si só não é suficiente, embora & mdash você também precise estabelecer algumas metas mensuráveis ​​e rastreáveis ​​e observá-las ao longo do tempo.

Como chegar lá? Em sua palestra sobre Construindo Desempenho para o Longo Prazo, Allison McKnight compartilha um estudo de caso abrangente de como ela ajudou a estabelecer uma cultura de desempenho na Etsy (slides). Mais recentemente, Tammy Everts falou sobre os hábitos de equipes de desempenho altamente eficazes em pequenas e grandes organizações.

Ao ter essas conversas nas organizações, é importante ter em mente que, assim como a UX é um espectro de experiências, o desempenho na web é uma distribuição. Como observou Karolina Szczur, "esperar que um único número seja capaz de fornecer uma classificação a que se deve aspirar é uma suposição falha". Portanto, as metas de desempenho precisam ser granulares, rastreáveis ​​e tangíveis.

Para ter uma boa primeira impressão do desempenho de seus concorrentes, você pode usar o Chrome UX Report (CrUX, um conjunto de dados RUM pronto, introdução em vídeo por Ilya Grigorik e guia detalhado por Rick Viscomi), ou Treo, uma ferramenta de monitoramento RUM que é alimentada por Chrome UX Report. Os dados são coletados dos usuários do navegador Chrome, de modo que os relatórios serão específicos do Chrome, mas eles fornecerão uma distribuição bastante completa do desempenho, mais importante, pontuações do Core Web Vitals, para uma ampla gama de visitantes. Observe que novos conjuntos de dados CrUX são lançados no segunda terça-feira de cada mês.

Como alternativa, você também pode usar:

Observação: Se você usar o Page Speed ​​Insights ou Page Speed ​​Insights API (não, não está obsoleto!), Você pode obter dados de desempenho do CrUX para páginas específicas em vez de apenas os agregados. Esses dados podem ser muito mais úteis para definir metas de desempenho para ativos como "página de destino" ou "lista de produtos". E se você estiver usando CI para testar os orçamentos, você precisa ter certeza de que seu ambiente testado corresponde a CrUX se você usou CrUX para definir a meta (obrigado Patrick Meenan!).

Se você precisar de ajuda para mostrar o motivo por trás da priorização de velocidade ou se quiser visualizar a queda ou aumento da taxa de conversão com desempenho mais lento, ou talvez precise defender uma solução de RUM em sua organização, Sergey Chernyshev construiu uma UX Speed ​​Calculator, uma ferramenta de código aberto que ajuda a simular dados e visualizá-los para orientar seu ponto de vista.

CrUX gera uma visão geral das distribuições de desempenho ao longo do tempo, com o tráfego coletado de usuários do Google Chrome. Você pode criar o seu próprio no Chrome UX Dashboard. (Visualização grande) Exatamente quando você precisa fazer um caso de desempenho para impulsionar seu ponto de vista: UX Speed ​​Calculator visualiza o impacto do desempenho nas taxas de rejeição, conversão e receita total e mdash com base em dados reais. (Visualização grande)

Às vezes, você pode querer ir um pouco mais fundo, combinando os dados vindos do CrUX com quaisquer outros dados que você já tenha para descobrir rapidamente onde estão as lentidões, pontos cegos e ineficiências para seus concorrentes ou para seu projeto. Em seu trabalho, Harry Roberts tem usado uma planilha de topografia de velocidade do site que ele usa para dividir o desempenho por tipos de página-chave e rastrear como as métricas-chave são diferentes entre elas. Você pode baixar a planilha como Planilhas Google, Excel, documento OpenOffice ou CSV.

Topografia da velocidade do site, com as principais métricas representadas para as principais páginas do site. (Visualização grande)

E se você quiser ir tudo a propósito, você pode executar uma auditoria de desempenho do Lighthouse em cada página de um site (via Lightouse Parade), com uma saída salva como CSV. Isso o ajudará a identificar quais páginas específicas (ou tipos de páginas) de seus concorrentes têm pior ou melhor desempenho e em que você pode querer concentrar seus esforços. (Para o seu próprio site, provavelmente é melhor enviar dados para um endpoint de análise!).

Com o Lighthouse Parade, você pode executar uma auditoria de desempenho do Lighthouse em cada página de um site, com uma saída salva como CSV. (Visualização grande)

Colete dados, configure uma planilha, economize 20% e defina suas metas (orçamentos de desempenho) Por aqui. Agora você tem algo mensurável para testar. Se você está mantendo o orçamento em mente e tentando enviar apenas a carga útil mínima para obter um tempo rápido de interação, então você está no caminho certo.

Precisa de recursos para começar?

  • Addy Osmani escreveu um artigo muito detalhado sobre como iniciar o orçamento de desempenho, como quantificar o impacto dos novos recursos e por onde começar quando o orçamento está acima do limite.
  • O guia de Lara Hogan sobre como abordar designs com um orçamento de desempenho pode fornecer dicas úteis para designers.
  • Harry Roberts publicou um guia sobre a configuração de uma planilha do Google para exibir o impacto de scripts de terceiros no desempenho, usando Request Map,
  • A Calculadora de Orçamento de Desempenho de Jonathan Fielding, a calculadora de orçamento de desempenho de Katie Hempenius e as Calorias do Navegador podem ajudar na criação de orçamentos (graças a Karolina Szczur pelo aviso).
  • Em muitas empresas, os orçamentos de desempenho não devem ser aspiracionais, mas sim pragmáticos, servindo como um sinal de espera para evitar escorregar além de um certo ponto. Nesse caso, você poderia escolher seu pior ponto de dados nas últimas duas semanas como um limite e partir daí. Orçamentos de desempenho, pragmaticamente mostra a você uma estratégia para conseguir isso.
  • Além disso, faça o orçamento de desempenho e o desempenho atual visível configurando painéis com gráficos relatando tamanhos de construção. Existem muitas ferramentas que permitem isso: painel SiteSpeed.io (código aberto), SpeedCurve e Caliber são apenas algumas delas, e você pode encontrar mais ferramentas em perf.rocks.

Depois de definir um orçamento, incorpore-o ao processo de construção com Webpack Performance Hints and Bundlesize, Lighthouse CI, PWMetrics ou Sitespeed CI para aplicar orçamentos em solicitações pull e fornecer um histórico de pontuação em comentários de RP.

Para expor os orçamentos de desempenho para toda a equipe, integre os orçamentos de desempenho no Lighthouse via Lightwallet ou use o LHCI Action para uma integração rápida do Github Actions. E se precisar de algo personalizado, você pode usar webpagetest-charts-api, uma API de endpoints para construir gráficos a partir dos resultados do WebPagetest.

A consciência de desempenho não deve vir apenas de orçamentos de desempenho. Assim como o Pinterest, você pode criar um personalizado eslint regra que proíbe a importação de arquivos e diretórios que são conhecidos por serem altamente dependentes e aumentariam o pacote. Configure uma lista de pacotes “seguros” que podem ser compartilhados por toda a equipe.

Além disso, pense nas tarefas críticas do cliente que são mais benéficas para o seu negócio. Estude, discuta e defina o aceitável limites de tempo para ações críticas e estabelecer marcas de tempo do usuário "pronto para UX" que toda a organização aprovou. Em muitos casos, as jornadas do usuário afetarão o trabalho de muitos departamentos diferentes, portanto, o alinhamento em termos de tempos aceitáveis ​​ajudará a apoiar ou evitar discussões de desempenho no futuro. Certifique-se de que os custos adicionais de recursos e recursos adicionados sejam visíveis e compreendidos.

Alinhe os esforços de desempenho com outras iniciativas de tecnologia, que vão desde novos recursos do produto sendo construído até a refatoração e o alcance de novos públicos globais. Portanto, sempre que ocorre uma conversa sobre desenvolvimento posterior, o desempenho também faz parte dessa conversa. É muito mais fácil atingir as metas de desempenho quando a base de código é nova ou está apenas sendo refatorada.

Além disso, como Patrick Meenan sugeriu, vale a pena planeje uma sequência de carregamento e compensações durante o processo de design. Se você priorizar com antecedência quais peças são mais críticas e definir a ordem em que devem aparecer, também saberá o que pode ser atrasado. O ideal é que essa ordem também reflita a sequência de suas importações CSS e JavaScript, portanto, lidar com elas durante o processo de construção será mais fácil. Além disso, considere qual deve ser a experiência visual em estados "intermediários", enquanto a página está sendo carregada (por exemplo, quando as fontes da web ainda não foram carregadas).

Depois de estabelecer uma forte cultura de desempenho em sua organização, procure ser 20% mais rápido do que você antes para manter as prioridades intactas com o passar do tempo (obrigado, Guy Podjarny!) Mas considere os diferentes tipos e comportamentos de uso de seus clientes (que Tobias Baldauf chamou de cadência e coortes), junto com o tráfego de bots e os efeitos da sazonalidade.

Planejamento, planejamento, planejamento. Pode ser tentador entrar em algumas otimizações rápidas "fáceis de alcançar" no início & mdash e pode ser uma boa estratégia para ganhos rápidos & mdash, mas será muito difícil manter o desempenho como uma prioridade sem planejamento e definição realista, empresa -objetivos de desempenho personalizados.

O que isso significa? Em vez de focar no tempo de carregamento da página inteira (via carregando e DOMContentLoaded timings, por exemplo), priorizam o carregamento da página conforme percebido por seus clientes. Isso significa focar em um conjunto ligeiramente diferente de métricas. Na verdade, escolher a métrica certa é um processo sem vencedores óbvios.

Com base na pesquisa de Tim Kadlec e nas notas de Marcos Iglesias em sua palestra, métricas tradicionais podem ser agrupados em alguns conjuntos. Normalmente, precisaremos de todos eles para obter uma imagem completa do desempenho e, no seu caso específico, alguns deles serão mais importantes do que outros.

  • Métricas baseadas em quantidade medir o número de solicitações, peso e uma pontuação de desempenho. Bom para disparar alarmes e monitorar mudanças ao longo do tempo, mas não tão bom para entender a experiência do usuário.
  • Métricas de marco use estados durante a vida útil do processo de carregamento, por ex. Tempo para o primeiro byte e Tempo para interação. Bom para descrever a experiência do usuário e monitoramento, não tão bom para saber o que acontece entre os marcos.
  • Métricas de renderização fornecer uma estimativa de quão rápido o conteúdo é renderizado (por exemplo, Iniciar renderização Tempo, Índice de velocidade) Bom para medir e ajustar o desempenho de renderização, mas não tão bom para medir quando importante o conteúdo aparece e pode interagir.
  • Métricas personalizadas medir um determinado evento personalizado para o usuário, por exemplo, Hora de primeiro tweet do Twitter e PinnerWaitTime do Pinterest. Bom para descrever a experiência do usuário com precisão, não tão bom para dimensionar as métricas e comparar com os concorrentes.

Para completar o quadro, normalmente procuramos métricas úteis entre todos esses grupos. Normalmente, os mais específicos e relevantes são:

    (TTI)
    O ponto em que o layout foi estabilizado, as principais webfonts são visíveis e o thread principal está disponível o suficiente para lidar com a entrada do usuário & mdash basicamente a marca de tempo quando um usuário pode interagir com a IU. As principais métricas para entender quanto esperar um usuário tem que experimentar para usar o site sem atrasos. Boris Schapira escreveu uma postagem detalhada sobre como medir o TTI de maneira confiável. (FID), ou Capacidade de resposta de entrada
    O momento em que um usuário interage pela primeira vez com seu site até o momento em que o navegador é realmente capaz de responder para essa interação. Complementa muito bem o TTI, pois descreve a parte que faltava na imagem: o que acontece quando um usuário realmente interage com o site. Pretende ser apenas uma métrica RUM. Existe uma biblioteca JavaScript para medir o FID no navegador. (LCP)
    Marca o ponto na linha do tempo de carregamento da página quando o conteúdo importante provavelmente foi carregado. A suposição é que o elemento mais importante da página é o maior visível na janela de visualização do usuário. Se os elementos forem renderizados acima e abaixo da dobra, apenas a parte visível será considerada relevante. (TBT)
    Uma métrica que ajuda a quantificar o gravidade de quão não interativa uma página é antes de se tornar confiavelmente interativo (ou seja, o encadeamento principal ficou livre de quaisquer tarefas executando mais de 50 ms (tarefas longas) por pelo menos 5s). A métrica mede a quantidade total de tempo entre a primeira pintura e o tempo de interação (TTI) em que o encadeamento principal foi bloqueado por tempo suficiente para evitar a resposta de entrada. Não é de se admirar, então, que um baixo TBT seja um bom indicador de bom desempenho. (obrigado, Artem, Phil) (CLS)
    A métrica destaca a frequência com que os usuários têm experiências inesperadas mudanças de layout (refluxos) ao acessar o site. Examina instável elementos e seu impacto na experiência geral. Quanto menor a pontuação, melhor.
    Mede a rapidez com que o conteúdo da página é preenchido visualmente, quanto menor a pontuação, melhor. A pontuação do índice de velocidade é calculada com base no velocidade do progresso visual, mas é apenas um valor calculado. Também é sensível ao tamanho da janela de visualização, então você precisa definir uma variedade de configurações de teste que correspondem ao seu público-alvo. Observe que está se tornando menos importante com o LCP se tornando uma métrica mais relevante (obrigado, Boris, Artem!).
  • Tempo de CPU gasto
    Uma métrica que mostra com que frequência e quanto tempo o thread principal está bloqueado, trabalhando na pintura, renderização, script e carregamento. O alto tempo de CPU é um indicador claro de um mal-humorado experiência, ou seja, quando o usuário experimenta um atraso perceptível entre sua ação e uma resposta. Com o WebPageTest, você pode selecionar "Capture Dev Tools Timeline" na guia "Chrome" para expor a divisão do thread principal à medida que ele é executado em qualquer dispositivo usando WebPageTest.
    Assim como com o Tempo de CPU gasto, esta métrica, proposta por Stoyan Stefanov, explora o impacto do JavaScript na CPU. A ideia é usar a contagem de instruções da CPU por componente para entender seu impacto na experiência geral, isoladamente. Pode ser implementado usando Puppeteer e Chrome.
    Embora muitas métricas apresentadas acima expliquem quando um determinado evento acontece, o FrustrationIndex de Tim Vereecke analisa o lacunas entre as métricas em vez de examiná-las individualmente. Ele analisa os principais marcos percebidos pelo usuário final, como Título é visível, Primeiro conteúdo é visível, Visualmente pronto e Página parece pronta e calcula uma pontuação que indica o nível de frustração ao carregar uma página. Quanto maior a lacuna, maior a chance de o usuário ficar frustrado. Potencialmente, um bom KPI para a experiência do usuário. Tim publicou uma postagem detalhada sobre o FrustrationIndex e como ele funciona.
    Se o seu site depende da receita gerada pela publicidade, é útil acompanhar o peso do código relacionado ao anúncio. O script de Paddy Ganti constrói dois URLs (um normal e outro bloqueando os anúncios), solicita a geração de uma comparação de vídeo via WebPageTest e relata um delta.
    Conforme observado pelos engenheiros da Wikipedia, os dados de quanto variância existe em seus resultados pode informar o quão confiáveis ​​seus instrumentos são, e quanta atenção você deve prestar a desvios e outlers. Grande variação é um indicador de ajustes necessários na configuração. Também ajuda a compreender se certas páginas são mais difíceis de medir de forma confiável, por exemplo, devido a scripts de terceiros que causam variações significativas. Também pode ser uma boa ideia rastrear a versão do navegador para entender os picos de desempenho quando uma nova versão do navegador é lançada.
    Métricas personalizadas são definidas por suas necessidades de negócios e experiência do cliente. Requer que você identifique importante píxeis, crítico scripts, necessário CSS e relevante ativos e medir a rapidez com que são entregues ao usuário. Para isso, você pode monitorar o Hero Rendering Times ou usar a API de desempenho, marcando timestamps específicos para eventos que são importantes para o seu negócio. Além disso, você pode coletar métricas personalizadas com WebPagetest executando JavaScript arbitrário no final de um teste.

Observe que a primeira pintura significativa (FMP) não aparece na visão geral acima. Ele costumava fornecer uma visão sobre a rapidez com que as saídas do servidor algum dados. O FMP longo geralmente indicava que o JavaScript estava bloqueando o thread principal, mas também poderia estar relacionado a problemas de back-end / servidor. No entanto, a métrica foi descontinuada recentemente porque parece não ser precisa em cerca de 20% dos casos. Ele foi efetivamente substituído pelo LCP, que é mais confiável e mais fácil de entender. Não é mais compatível com o Lighthouse. Verifique novamente as métricas e recomendações de desempenho centradas no usuário mais recentes apenas para ter certeza de que você está na página segura (obrigado, Patrick Meenan).

Steve Souders tem uma explicação detalhada de muitas dessas métricas. É importante notar que, embora o tempo de interação seja medido pela execução de auditorias automatizadas no chamado ambiente de laboratório, O primeiro atraso de entrada representa o real experiência do usuário, com real usuários experimentando um atraso perceptível. Em geral, é provavelmente uma boa ideia sempre medir e acompanhar os dois.

Dependendo do contexto de seu aplicativo, as métricas preferidas podem ser diferentes: por exemplo, para a interface do usuário do Netflix TV, a capacidade de resposta da entrada principal, o uso da memória e o TTI são mais críticos e, para a Wikipedia, as primeiras / últimas alterações visuais e as métricas de tempo gasto da CPU são mais importantes.

Observação: tanto o FID quanto o TTI não levam em consideração o comportamento de rolagem, a rolagem pode acontecer de forma independente, uma vez que está fora do thread principal, portanto, para muitos sites de consumo de conteúdo, essas métricas podem ser muito menos importantes (obrigado, Patrick!).

Para cada um deles, o Google recomenda uma série de metas de velocidade aceitáveis. Pelo menos 75% de todas as visualizações de página deve exceder o Bom alcance para passar nesta avaliação. Essas métricas ganharam força rapidamente e com Core Web Vitals se tornando sinais de classificação para a Pesquisa Google em maio de 2021 (Atualização do algoritmo de classificação da Experiência da Página), muitas empresas voltaram sua atenção para suas pontuações de desempenho.

Vamos analisar cada um dos principais pontos vitais da Web, um por um, junto com técnicas e ferramentas úteis para otimizar suas experiências com essas métricas em mente. (É importante notar que você terminará com melhores pontuações do Core Web Vitals seguindo um conselho geral neste artigo.)

    (LCP) & lt 2,5 seg.
    Mede o carregando de uma página e relata o tempo de renderização do maior imagem ou bloco de texto que é visível na janela de visualização. Conseqüentemente, o LCP é afetado por tudo que está adiando a renderização de informações importantes - sejam tempos de resposta lentos do servidor, bloqueio de CSS, JavaScript em andamento (original ou de terceiros), carregamento de fonte da web, renderização cara ou operações de pintura, preguiçoso - imagens carregadas, telas de esqueleto ou renderização do lado do cliente.

Para uma boa experiência, LCP deve ocorrer dentro de 2,5 s de quando a página começa a carregar pela primeira vez. Isso significa que precisamos renderizar a primeira parte visível da página o mais cedo possível. Isso exigirá CSS crítico personalizado para cada modelo, orquestrando o & lthead & gt -order e pré-buscando ativos essenciais (vamos abordá-los mais tarde).

O principal motivo para uma pontuação LCP baixa geralmente são as imagens. Para entregar um LCP em & lt2.5s em Fast 3G & mdash hospedado em um servidor bem otimizado, tudo estático sem renderização do lado do cliente e com uma imagem proveniente de uma imagem dedicada CDN & mdash significa que o o tamanho máximo teórico da imagem é apenas cerca de 144 KB. É por isso que as imagens responsivas são importantes, bem como o pré-carregamento de imagens críticas com antecedência (com pré-carregamento).

Dica rápida: para descobrir o que é considerado LCP em uma página, em DevTools você pode passar o mouse sobre o emblema LCP em "Timings" no Painel de Desempenho (obrigado, Tim Kadlec!).

(FID) & lt 100ms.
Mede o capacidade de resposta da IU, ou seja, quanto tempo o navegador ficou ocupado com outras tarefas antes que pudesse reagir a um evento discreto de entrada do usuário, como um toque ou clique. Ele foi projetado para capturar atrasos resultantes do encadeamento principal ocupado, especialmente durante o carregamento da página.

A meta é ficar dentro de 50–100ms para cada interação. Para chegar lá, precisamos identificar tarefas longas (bloqueia o thread principal para & gt50ms) e dividi-las, dividir o código em vários pedaços, reduzir o tempo de execução do JavaScript, otimizar a busca de dados, adiar a execução do script de terceiros, mova o JavaScript para o thread de segundo plano com Web workers e use a hidratação progressiva para reduzir os custos de reidratação em SPAs.

Dica rápida: em geral, uma estratégia confiável para obter uma melhor pontuação do FID é minimizar o trabalho no tópico principal dividindo pacotes maiores em menores e servindo o que o usuário precisa, quando ele precisa, para que as interações do usuário não sejam atrasadas. Abordaremos mais sobre isso em detalhes abaixo.

(CLS) & lt 0,1.
Medidas estabilidade visual da IU para garantir interações suaves e naturais, ou seja, a soma total de todas as pontuações de mudança de layout individual para cada mudança de layout inesperada que ocorre durante a vida útil da página. Uma mudança de layout individual ocorre sempre que um elemento que já estava visível muda sua posição na página. É pontuado com base no tamanho do conteúdo e na distância que ele moveu.

Portanto, toda vez que uma mudança aparece - por exemplo, quando fontes substitutas e fontes da web têm métricas de fonte diferentes, ou anúncios, incorporações ou iframes atrasados, ou dimensões de imagem / vídeo não são reservadas, ou CSS atrasado força repinturas ou mudanças são injetadas por JavaScript atrasado & mdash tem um impacto sobre a pontuação CLS. O valor recomendado para uma boa experiência é um CLS & lt 0.1.

É importante notar que Core Web Vitals devem evoluir ao longo do tempo, com um ciclo anual previsível. Para a atualização do primeiro ano, podemos esperar que o First Contentful Paint seja promovido a Core Web Vitals, um limite de FID reduzido e melhor suporte para aplicativos de página única. Também podemos ver a resposta às entradas do usuário após a carga ganhando mais peso, junto com as considerações de segurança, privacidade e acessibilidade (!).

Relacionado ao Core Web Vitals, há uma abundância de recursos e artigos úteis que vale a pena conferir:

    permite que você compare sua pontuação com a da concorrência no celular, tablet, desktop e em 3G e 4G. , uma extensão do Chrome que mostra o Core Web Vitals do CrUX nos resultados de pesquisa do Google. que visualiza o CLS com um GIF simples (também disponível na linha de comando). pode coletar e enviar Core Web Vitals para o Google Analytics, Google Tag Manager ou qualquer outro endpoint analítico. , no qual Patrick Meenan explora como WebPageTest expõe dados sobre Core Web Vitals. , um vídeo de 50 minutos com Addy Osmani, no qual ele destaca como melhorar o Core Web Vitals em um estudo de caso de comércio eletrônico. e Mudança cumulativa de layout no mundo real são artigos abrangentes de Nic Jansma, que cobrem praticamente tudo sobre CLS e como ele se correlaciona com as principais métricas, como taxa de rejeição, tempo de sessão ou cliques de raiva. , com uma visão geral das propriedades ou métodos, quando solicitado / chamado em JavaScript, que fará com que o navegador calcule de forma síncrona o estilo e o layout. mostra quais propriedades CSS acionam Layout, Pintura e Composto. é um passo a passo de como usar o WebPageTest para identificar e corrigir problemas de instabilidade de layout. , outro guia muito detalhado de Boris Schapira sobre CLS, como é calculado, como medir e como otimizá-lo. , um guia detalhado de Simon Hearne sobre cada uma das métricas (incluindo outros Web Vitals, como FCP, TTI, TBT), quando ocorrem e como são medidos.

Então, Core Web Vitals são os métricas finais a seguir? Não exatamente. De fato, eles já estão expostos na maioria das soluções e plataformas RUM, incluindo Cloudflare, Treo, SpeedCurve, Caliber, WebPageTest (já na visualização da tira de filme), Newrelic, Shopify, Next.js, todas as ferramentas do Google (PageSpeed ​​Insights, Lighthouse + CI, Search Console etc.) e muitos outros.

No entanto, como Katie Sylor-Miller explica, alguns dos principais problemas com Core Web Vitals são a falta de suporte para vários navegadores, não medimos realmente o ciclo de vida completo da experiência de um usuário, além de ser difícil correlacionar as mudanças no FID e CLS com resultados de negócios.

Como devemos esperar que o Core Web Vitals evolua, parece razoável sempre combinar Web Vitals com suas métricas personalizadas para obter uma melhor compreensão de onde você está em termos de desempenho.

Globalmente, em 2020, de acordo com o IDC, 84,8% de todos os telefones celulares vendidos são dispositivos Android. Um consumidor médio atualiza seu telefone a cada 2 anos e, nos Estados Unidos, o ciclo de substituição do telefone é de 33 meses. A média dos telefones mais vendidos em todo o mundo custará menos de US $ 200.

Um dispositivo representativo, então, é um dispositivo Android que é pelo menos 24 meses de idade, custando US $ 200 ou menos, rodando em 3G lento, 400 ms RTT e transferência de 400 kbps, apenas para ser um pouco mais pessimista. Isso pode ser muito diferente para sua empresa, é claro, mas é uma aproximação suficiente da maioria dos clientes lá fora. Na verdade, pode ser uma boa ideia pesquisar os mais vendidos da Amazon para o seu mercado-alvo. (Obrigado a Tim Kadlec, Henri Helvetica e Alex Russell pelas dicas!).

Ao construir um novo site ou aplicativo, sempre verifique os Best Sellers atuais da Amazon para o seu mercado-alvo primeiro. (Visualização grande)

Quais dispositivos de teste escolher então? Os que se enquadram bem no perfil delineado acima. É uma boa opção escolher um Moto G4 / G5 Plus um pouco mais antigo, um dispositivo Samsung intermediário (Galaxy A50, S8), um bom dispositivo intermediário como um Nexus 5X, Xiaomi Mi A3 ou Xiaomi Redmi Note 7 e um dispositivo lento como Alcatel 1X ou Cubot X19, talvez em um laboratório de dispositivos aberto. Para testar em dispositivos de aceleração térmica mais lentos, você também pode obter um Nexus 4, que custa cerca de US $ 100.

Além disso, verifique os chipsets usados ​​em cada dispositivo e não super-represente um chipset: algumas gerações de Snapdragon e Apple, bem como Rockchip de baixo custo, Mediatek seriam suficientes (obrigado, Patrick!).

Se você não tiver um dispositivo em mãos, emule a experiência móvel no desktop testando em um rede 3G estrangulada (por exemplo, 300ms RTT, 1,6 Mbps para baixo, 0,8 Mbps para cima) com uma CPU acelerada (5 × desaceleração). Eventualmente, mude para 3G regular, 4G lento (por exemplo 170ms RTT, 9 Mbps para baixo, 9 Mbps para cima) e Wi-Fi. Para tornar o impacto no desempenho mais visível, você pode até introduzir 2G às terças-feiras ou configurar uma rede 3G / 4G estrangulada em seu escritório para testes mais rápidos.

Lembre-se de que, em um dispositivo móvel, devemos esperar uma desaceleração de 4 × –5 × em comparação com computadores desktop. Os dispositivos móveis têm diferentes GPUs, CPU, memória e diferentes características de bateria. É por isso que é importante ter um bom perfil de um dispositivo comum e sempre testar em tal dispositivo.

Felizmente, existem muitas opções excelentes que ajudam a automatizar a coleta de dados e medir o desempenho do seu site ao longo do tempo de acordo com essas métricas. Lembre-se de que uma boa imagem de desempenho cobre um conjunto de métricas de desempenho, dados de laboratório e dados de campo:

  • Ferramentas de teste sintético recolher dados de laboratório em um ambiente reproduzível com dispositivo predefinido e configurações de rede (por exemplo, Farol, Calibre, WebPageTest) e
  • Monitoramento de usuário real (RUM) ferramentas avaliam as interações do usuário continuamente e coletam dados de campo (por exemplo. SpeedCurve, New Relic & mdash, as ferramentas também fornecem testes sintéticos).

O primeiro é particularmente útil durante desenvolvimento pois o ajudará a identificar, isolar e corrigir problemas de desempenho enquanto trabalha no produto. O último é útil para longo prazo manutenção pois o ajudará a entender seus gargalos de desempenho à medida que acontecem ao vivo & mdash quando os usuários realmente acessam o site.

Utilizando APIs RUM integradas, como Navigation Timing, Resource Timing, Paint Timing, Long Tasks, etc., as ferramentas de teste sintéticas e o RUM juntos fornecem uma imagem completa do desempenho do seu aplicativo.Você pode usar Calibre, Treo, SpeedCurve, mPulse e Boomerang, Sitespeed.io, que são ótimas opções para monitoramento de desempenho. Além disso, com o cabeçalho Server Timing, você pode até monitorar o desempenho de back-end e front-end em um só lugar.

Observação: É sempre uma aposta mais segura escolher aceleradores de nível de rede, externos ao navegador, pois, por exemplo, DevTools tem problemas para interagir com push HTTP / 2, devido à forma como é implementado (obrigado, Yoav, Patrick!). Para Mac OS, podemos usar Network Link Conditioner, para Windows Windows Traffic Shaper, para Linux netem e para FreeBSD dummynet.

Como é provável que você teste no Lighthouse, lembre-se de que você pode:

    para rastrear as pontuações do Farol ao longo do tempo (é bastante impressionante), para obter um relatório do Farol ao lado de cada PR, (via Lightouse Parade), com uma saída salva como CSV,
  • use a Calculadora de Pontuação do Lighthouse e os pesos métricos do Lighthouse se precisar mergulhar em mais detalhes.
  • O Lighthouse também está disponível para Firefox, mas por trás dele usa a API PageSpeed ​​Insights e gera um relatório baseado em um Agente do Usuário do Chrome 79 sem interface com o usuário.

No entanto, também é uma boa ideia estudar qual extensões de navegador seus clientes usam com frequência e teste com perfis de "cliente" também. Na verdade, algumas extensões podem ter um impacto profundo no desempenho (Relatório de desempenho da extensão do Chrome 2020) em seu aplicativo e, se seus usuários as usam muito, você pode querer contabilizar isso antecipadamente. Conseqüentemente, apenas os resultados de perfis "limpos" são excessivamente otimistas e podem ser esmagados em cenários da vida real.

Definindo metas realistas

  1. Tempo de resposta de 100 milissegundos, 60 fps.
    Para que uma interação seja suave, a interface tem 100 ms para responder à entrada do usuário. Mais do que isso, o usuário percebe que o aplicativo está lento. O RAIL, um modelo de desempenho centrado no usuário, oferece alvos saudáveis: Para permitir uma resposta de & lt100 milissegundos, a página deve devolver o controle ao thread principal, o mais tardar, a cada & lt50 milissegundos. A latência de entrada estimada nos informa se estamos atingindo esse limite e, idealmente, deve ser inferior a 50 ms. Para pontos de alta pressão como animação, é melhor não fazer nada onde você pode e o mínimo absoluto onde você não pode.

RAIL, um modelo de desempenho centrado no usuário.

Além disso, cada quadro da animação deve ser concluído em menos de 16 milissegundos, atingindo assim 60 quadros por segundo (1 segundo e divisão 60 = 16,6 milissegundos) & mdash, de preferência abaixo de 10 milissegundos. Como o navegador precisa de tempo para pintar o novo quadro na tela, seu código deve terminar de ser executado antes de atingir a marca de 16,6 milissegundos. Estamos começando a ter conversas sobre 120 fps (por exemplo, as telas do iPad Pro rodam a 120 Hz) e Surma abordou algumas soluções de desempenho de renderização para 120 fps, mas provavelmente não é o objetivo que estamos olhando agora mesmo.

Seja pessimista nas expectativas de desempenho, mas seja otimista no design da interface e use o tempo ocioso com sabedoria (marque idlize, ocioso-até-urgente e reagir-ocioso). Obviamente, essas metas se aplicam ao desempenho do tempo de execução, em vez de ao desempenho de carregamento.

(Observação: como o TCP geralmente subutiliza a conexão de rede em uma quantidade significativa, o Google desenvolveu o TCP Bottleneck Bandwidth e RRT (BBR), um algoritmo de controle de fluxo TCP controlado por retardo de TCP. Projetado para a web moderna, ele responde ao congestionamento real, ao invés da perda de pacotes como o TCP, é significativamente mais rápido, com maior rendimento e menor latência & mdash e o algoritmo funciona de maneira diferente. (obrigado, Victor, Barry!)

Por outro lado, temos restrições de hardware na memória e na CPU devido aos tempos de análise e execução do JavaScript (falaremos sobre eles em detalhes mais tarde). Para atingir os objetivos declarados no primeiro parágrafo, temos que considerar o orçamento de tamanho de arquivo crítico para JavaScript. As opiniões variam sobre o que esse orçamento deve ser (e isso depende muito da natureza do seu projeto), mas um orçamento de 170 KB de JavaScript compactado já levaria até 1s para analisar e compilar em um telefone de médio porte. Supondo que 170 KB se expanda para 3 × esse tamanho quando descompactado (0,7 MB), isso já pode ser a sentença de morte de uma experiência de usuário "decente" em um Moto G4 / G5 Plus.

No caso do site da Wikipedia, em 2020, globalmente, a execução do código ficou 19% mais rápida para os usuários da Wikipedia. Então, se suas métricas de desempenho da web ano após ano permanecerem estáveis, isso geralmente é um sinal de alerta, pois você está realmente regredindo à medida que o ambiente continua melhorando (detalhes em uma postagem no blog de Gilles Dubuc).

Se você deseja atingir mercados em crescimento, como Sudeste Asiático, África ou Índia, você terá que olhar para um conjunto muito diferente de restrições. Addy Osmani cobre as principais restrições do feature phone, como poucos dispositivos de baixo custo e alta qualidade, indisponibilidade de redes de alta qualidade e dados móveis caros e mdash junto com Orçamento PRPL-30 e diretrizes de desenvolvimento para esses ambientes.

De acordo com Addy Osmani, um tamanho recomendado para rotas com carregamento lento também é inferior a 35 KB. (Visualização grande) Addy Osmani sugere um orçamento de desempenho PRPL-30 (30KB gzipado + pacote inicial minimizado) se o alvo for um feature phone. (Visualização grande)

Na verdade, Alex Russell do Google recomenda apontar para 130 & ndash170KB compactado com gzip como um limite superior razoável. Em cenários do mundo real, a maioria dos produtos não chega nem perto: um tamanho de pacote médio hoje é de cerca de 452 KB, o que é 53,6% em comparação com o início de 2015. Em um dispositivo móvel de classe média, isso representa 12 & ndash20 segundos para Time-To-Interactive.

Benchmarks de desempenho de CPU do Geekbench para os smartphones mais vendidos globalmente em 2019. JavaScript enfatiza o desempenho de núcleo único (lembre-se, é inerentemente mais single-threaded do que o resto da plataforma da Web) e é vinculado à CPU. Do artigo de Addy “Carregando páginas da Web rapidamente em um telefone avançado de US $ 20”. (Visualização grande)

No entanto, também poderíamos ir além do orçamento de tamanho do pacote. Por exemplo, poderíamos definir orçamentos de desempenho com base nas atividades do encadeamento principal do navegador, ou seja, tempo de pintura antes de iniciar a renderização ou rastrear consumos de CPU front-end. Ferramentas como Calibre, SpeedCurve e Bundlesize podem ajudá-lo a manter seus orçamentos sob controle e podem ser integradas ao seu processo de construção.

Finalmente, um orçamento de desempenho provavelmente não deve ser um valor fixo. Dependendo da conexão de rede, os orçamentos de desempenho devem se adaptar, mas a carga útil em uma conexão mais lenta é muito mais "cara", independentemente de como são usados.

Observação: Pode parecer estranho definir orçamentos tão rígidos em tempos de amplo HTTP / 2, próximos 5G e HTTP / 3, telefones celulares em rápida evolução e SPAs florescentes. No entanto, eles parecem razoáveis ​​quando lidamos com a natureza imprevisível da rede e do hardware, incluindo tudo, desde redes congestionadas até infraestrutura em desenvolvimento lento, limites de dados, navegadores proxy, modo de salvar dados e tarifas de roaming sorrateiras.

Definindo o ambiente

  1. Escolha e configure suas ferramentas de construção.
    Não preste muita atenção ao que supostamente é legal nestes dias. Atenha-se ao seu ambiente de construção, seja Grunt, Gulp, Webpack, Parcel ou uma combinação de ferramentas. Contanto que você esteja obtendo os resultados de que precisa e não tenha problemas para manter seu processo de construção, você está indo muito bem.

Entre as ferramentas de construção, o Rollup continua ganhando força, assim como o Snowpack, mas o Webpack parece ser o mais estabelecido, com literalmente centenas de plug-ins disponíveis para otimizar o tamanho de suas construções. Fique atento ao Webpack Roadmap 2021.

Uma das estratégias mais notáveis ​​que apareceu recentemente é a fragmentação granular com Webpack em Next.js e Gatsby para minimizar códigos duplicados. Por padrão, os módulos que não são compartilhados em todos os pontos de entrada podem ser solicitados para rotas que não os utilizam. Isso acaba se tornando uma sobrecarga, pois mais código é baixado do que o necessário. Com chunking granular em Next.js, podemos usar um arquivo de manifesto de compilação do lado do servidor para determinar quais pedaços emitidos são usados ​​por diferentes pontos de entrada.

Para reduzir o código duplicado em projetos Webpack, podemos usar chunking granular, habilitado em Next.js e Gatsby por padrão. Crédito da imagem: Addy Osmani. (Visualização grande)

Com SplitChunksPlugin, vários pedaços de divisão são criados dependendo de uma série de condições para evitar a busca de código duplicado em várias rotas. Isso melhora o tempo de carregamento da página e o armazenamento em cache durante as navegações. Distribuído em Next.js 9.2 e em Gatsby v2.20.7.

No entanto, começar a usar o Webpack pode ser difícil. Então, se você quiser mergulhar no Webpack, existem alguns recursos excelentes por aí:

    & mdash obviamente & mdash é um bom ponto de partida, assim como Webpack & mdash The Confusing Bits de Raja Rao e An Annotated Webpack Config de Andrew Welch.
  • Sean Larkin tem um curso gratuito sobre Webpack: The Core Concepts e Jeffrey Way lançou um curso gratuito fantástico sobre Webpack para todos. Ambos são ótimas introduções para mergulhar no Webpack. é um curso de 4h muito abrangente com Sean Larkin, lançado pela FrontendMasters. tem centenas de configurações de Webpack prontas para usar, categorizadas por tópico e propósito. Bônus: também existe um configurador de configuração Webpack que gera um arquivo de configuração básica. é uma lista com curadoria de recursos, bibliotecas e ferramentas úteis do Webpack, incluindo artigos, vídeos, cursos, livros e exemplos para projetos Angular, React e agnósticos de estrutura. é o estudo de caso da Etsy sobre como a equipe mudou de usar um sistema de compilação JavaScript baseado em RequireJS para usar Webpack e como eles otimizaram suas compilações, gerenciando mais de 13.200 ativos em 4 minutos na média. é um tópico da mina de ouro de Ivan Akulov, com muitas dicas voltadas para o desempenho, incluindo aquelas focadas especificamente no Webpack. é um repositório Goldmine do GitHub com ferramentas e plug-ins úteis do Webpack para desempenho. Também mantido por Ivan Akulov.

Na verdade, com o serviço de módulo adaptável, parece que estamos levando o aprimoramento progressivo a outro nível, servindo experiências básicas "leves" para dispositivos de baixo custo e aprimorando com recursos mais sofisticados para dispositivos de última geração. O aprimoramento progressivo não deve desaparecer tão cedo.

Com um orçamento de 170 KB que já contém o caminho crítico HTML / CSS / JavaScript, roteador, gerenciamento de estado, utilitários, estrutura e a lógica do aplicativo, temos que examinar cuidadosamente o custo de transferência de rede, o tempo de análise / compilação e o custo de tempo de execução da estrutura de nossa escolha. Felizmente, vimos uma grande melhoria nos últimos anos na rapidez com que os navegadores podem analisar e compilar scripts. No entanto, a execução de JavaScript ainda é o principal gargalo, portanto, prestar muita atenção ao tempo de execução do script e à rede pode ser impactante.

Tim Kadlec conduziu uma pesquisa fantástica sobre o desempenho de frameworks modernos e os resumiu no artigo "Frameworks JavaScript têm um custo". Costumamos falar sobre o impacto de estruturas autônomas, mas, como observa Tim, na prática, não é incomum ter múltiplas estruturas em uso. Talvez uma versão mais antiga do jQuery que está sendo lentamente migrada para uma estrutura moderna, junto com alguns aplicativos legados que usam uma versão mais antiga do Angular. Portanto, é mais razoável explorar o custo cumulativo de bytes de JavaScript e tempo de execução da CPU que podem facilmente tornar as experiências do usuário quase inutilizáveis, mesmo em dispositivos de última geração.

Em geral, estruturas modernas não estão priorizando dispositivos menos potentes, de modo que as experiências em um telefone e em um desktop costumam ser drasticamente diferentes em termos de desempenho. De acordo com a pesquisa, sites com React ou Angular gastam mais tempo na CPU do que outros (o que, claro, não significa necessariamente que o React é mais caro na CPU do que Vue.js).

De acordo com Tim, uma coisa é óbvia: "se você está usando uma estrutura para construir seu site, está fazendo uma troca em termos de desempenho inicial & mdash, mesmo no melhor dos cenários. "

E daí se você remover completamente uma estrutura existente em páginas críticas? Com Gatsby, você pode verificar gatsby-plugin-no-javascript que remove todos os arquivos JavaScript criados por Gatsby dos arquivos HTML estáticos. No Vercel, você também pode permitir a desativação do JavaScript em tempo de execução na produção para certas páginas (experimental).

Assim que uma estrutura for escolhida, permaneceremos com ela por pelo menos alguns anos, então, se precisarmos usar uma, precisamos ter certeza de que nossa escolha é informada e bem considerada & mdash e isso vale especialmente para as principais métricas de desempenho que nós se importar.

Os dados mostram que, por padrão, os frameworks são bastante caros: 58,6% das páginas React são fornecidas com mais de 1 MB de JavaScript e 36% das páginas carregadas em Vue.js têm uma Primeira pintura com conteúdo de & lt1.5s. De acordo com um estudo de Ankur Sethi, "seu aplicativo React nunca carregará mais rápido do que cerca de 1,1 segundos em um telefone comum na Índia, não importa o quanto você o otimize. Seu aplicativo Angular sempre levará pelo menos 2,7 segundos para inicializar. Os usuários de seu aplicativo Vue precisarão esperar pelo menos 1 segundo antes de começarem a usá-lo. "De qualquer forma, você pode não estar visando a Índia como seu mercado principal, mas os usuários que acessam seu site com condições de rede abaixo do ideal terão uma experiência semelhante.

Claro que é possível fazer SPAs rápidos, mas eles não são rápidos fora da caixa, então precisamos levar em conta o tempo e o esforço necessários para faço e guarda eles rápido. Provavelmente será mais fácil escolher um custo de desempenho de linha de base leve desde o início.

Então, como escolhemos uma estrutura? É uma boa ideia considerar pelo menos o custo total no tamanho + tempo de execução inicial antes de escolher uma opção opções leves como Preact, Inferno, Vue, Svelte, Alpine ou Polymer podem fazer o trabalho muito bem. O tamanho da sua linha de base definirá as restrições para o código do seu aplicativo.

Conforme observado por Seb Markbåge, uma boa maneira de medir os custos iniciais de estruturas é primeiro renderize uma visualização, exclua-a e renderize novamente pois pode dizer como a estrutura é dimensionada. A primeira renderização tende a aquecer um monte de código compilado preguiçosamente, do qual uma árvore maior pode se beneficiar ao ser escalonada. A segunda renderização é basicamente uma emulação de como a reutilização de código em uma página afeta as características de desempenho à medida que a complexidade da página aumenta.

Você poderia ir tão longe quanto avaliar seus candidatos (ou qualquer biblioteca JavaScript em geral) no sistema de pontuação de escala de 12 pontos de Sacha Greif, explorando recursos, acessibilidade, estabilidade, desempenho, ecossistema de pacote, comunidade, curva de aprendizado, documentação, ferramentas, histórico, equipe, compatibilidade, segurança, por exemplo.

O Perf Track rastreia o desempenho da estrutura em escala. (Visualização grande)

Você também pode contar com os dados coletados na web por um longo período de tempo. Por exemplo, Perf Track rastreia o desempenho da estrutura em escala, mostrando a origem agregada Pontuações do Core Web Vitals para sites construídos em Angular, React, Vue, Polymer, Preact, Ember, Svelte e AMP. Você pode até especificar e comparar sites construídos com Gatsby, Next.js ou Create React App, bem como sites construídos com Nuxt.js (Vue) ou Sapper (Svelte).

Um bom ponto de partida é escolher um boa pilha padrão para seu aplicativo. Gatsby (React), Next.js (React), Vuepress (Vue), Preact CLI e PWA Starter Kit fornecem padrões razoáveis ​​para carregamento rápido e pronto para uso em hardware móvel médio. Além disso, dê uma olhada nas orientações de desempenho específicas da estrutura web.dev para React e Angular (obrigado, Phillip!).

E talvez você pudesse adotar uma abordagem um pouco mais refrescante para construir aplicativos de página única completamente & mdash Turbolinks, uma biblioteca JavaScript de 15 KB que usa HTML em vez de JSON para renderizar visualizações. Portanto, quando você segue um link, o Turbolinks busca automaticamente a página, troca seu & ltbody & gt e mescla seu & lthead & gt, tudo sem incorrer no custo de um carregamento completo da página. Você pode verificar detalhes rápidos e documentação completa sobre a pilha (Hotwire).

Para evitá-lo, sempre interromper a execução de funções em tarefas assíncronas separadas e, quando possível, use requestIdleCallback. Considere o carregamento lento de partes da IU usando o suporte a import () dinâmico do WebPack, evitando o custo de carregamento, análise e compilação até que os usuários realmente precisem deles (obrigado Addy!).

Como mencionado acima, Time to Interactive (TTI) nos informa o tempo entre a navegação e a interatividade. Em detalhes, a métrica é definida olhando para a primeira janela de cinco segundos após o conteúdo inicial ser renderizado, na qual nenhuma tarefa de JavaScript leva mais de 50ms (Tarefas Longas) Se ocorrer uma tarefa com mais de 50 ms, a busca por uma janela de cinco segundos é reiniciada. Como resultado, o navegador assumirá primeiro que alcançou Interativo, apenas para mudar para Congeladas, apenas para, eventualmente, voltar para Interativo.

Assim que alcançamos Interativo, podemos então & mdash sob demanda ou conforme o tempo permitir & mdash inicializar partes não essenciais do aplicativo. Infelizmente, como Paul Lewis notou, os frameworks normalmente não têm um conceito simples de prioridade que possa ser apresentado aos desenvolvedores e, portanto, a inicialização progressiva não é fácil de implementar com a maioria das bibliotecas e frameworks.

Ainda assim, estamos chegando lá. Atualmente, há algumas opções que podemos explorar, e Houssein Djirdeh e Jason Miller fornecem uma excelente visão geral dessas opções em sua palestra sobre Renderização na Web e no artigo de Jason e Addy sobre Arquiteturas Modernas de Front-End. A visão geral abaixo é baseada em seu trabalho estelar.

    Renderização completa do lado do servidor (SSR)
    No SSR clássico, como o WordPress, todas as solicitações são tratadas inteiramente no servidor. O conteúdo solicitado é retornado como uma página HTML concluída e os navegadores podem processá-lo imediatamente. Conseqüentemente, os aplicativos SSR não podem realmente fazer uso das APIs DOM, por exemplo. A lacuna entre First Contentful Paint e Time to Interactive geralmente é pequena, e a página pode ser renderizada imediatamente enquanto o HTML está sendo transmitido para o navegador.

Isso evita viagens de ida e volta adicionais para busca de dados e modelos no cliente, uma vez que isso é tratado antes que o navegador obtenha uma resposta. No entanto, acabamos com maior tempo de raciocínio do servidor e, consequentemente, Time To First Byte e não fazemos uso de recursos responsivos e ricos de aplicativos modernos.

Com o React, podemos usar o módulo ReactDOMServer em um servidor Node como o Express e, em seguida, chamar o método renderToString para renderizar os componentes de nível superior como uma string HTML estática.

Com Vue.js, podemos usar o vue-server-renderer para renderizar uma instância Vue em HTML usando renderToString. No Angular, podemos usar @nguniversal para transformar as solicitações do cliente em páginas HTML totalmente renderizadas pelo servidor. Uma experiência totalmente renderizada pelo servidor também pode ser obtida imediatamente com Next.js (React) ou Nuxt.js (Vue).

A abordagem tem suas desvantagens.Como resultado, ganhamos flexibilidade total de aplicativos do lado do cliente, enquanto fornecemos renderização mais rápida do lado do servidor, mas também acabamos com um intervalo mais longo entre First Contentful Paint e Time To Interactive e aumento do First Input Delay. A reidratação é muito cara e, geralmente, essa estratégia por si só não é boa o suficiente, pois atrasa muito o Time To Interactive.

No React, em vez de renderToString (), podemos usar renderToNodeStream () para canalizar a resposta e enviar o HTML em pedaços. No Vue, podemos usar renderToStream () que pode ser canalizado e transmitido. Com o React Suspense, podemos usar a renderização assíncrona para esse propósito também.

No lado do cliente, em vez de inicializar o aplicativo inteiro de uma vez, nós inicializar componentes progressivamente. As seções dos aplicativos são primeiro divididas em scripts autônomos com divisão de código e, em seguida, hidratadas gradualmente (em ordem de nossas prioridades). Na verdade, podemos hidratar os componentes críticos primeiro, enquanto o resto pode ser hidratado depois. A função de renderização do lado do cliente e do lado do servidor pode então ser definida de forma diferente por componente. Podemos então também adiar a hidratação de alguns componentes até que sejam visualizados ou necessários para a interação do usuário, ou quando o navegador estiver ocioso.

Para o Vue, Markus Oberlehner publicou um guia sobre a redução do tempo de interação de aplicativos SSR usando hidratação na interação do usuário, bem como vue-lazy-hydration, um plugin de estágio inicial que permite a hidratação do componente na visibilidade ou interação específica do usuário. A equipe Angular trabalha na hidratação progressiva com Ivy Universal. Você também pode implementar hidratação parcial com Preact e Next.js.

Com os prestadores de serviço instalados, podemos usar renderização de servidor de streaming para navegações iniciais / não JS e, em seguida, faça com que o service worker assuma a renderização de HTML para navegações após a instalação. Nesse caso, o service worker pré-processa o conteúdo e permite navegações no estilo SPA para renderizar novas visualizações na mesma sessão. Funciona bem quando você pode compartilhar o mesmo modelo e código de roteamento entre o servidor, a página do cliente e o trabalhador de serviço.

Com Next.js, podemos usar a exportação de HTML estático pré-renderizando um aplicativo para HTML estático. Em Gatsby, um gerador de site estático de código aberto que usa React, usa o método renderToStaticMarkup em vez do método renderToString durante as compilações, com o fragmento JS principal sendo pré-carregado e as rotas futuras são pré-buscadas, sem atributos DOM que não são necessários para páginas estáticas simples.

Para o Vue, podemos usar o Vuepress para atingir o mesmo objetivo. Você também pode usar o prerender-loader com Webpack. O Navi também oferece renderização estática.

O resultado é um tempo melhor para o primeiro byte e a primeira pintura com conteúdo, e reduzimos a lacuna entre o tempo para a interação e a primeira pintura com conteúdo. Não podemos usar a abordagem se houver expectativa de que o conteúdo mude muito. Além disso, todos os URLs devem ser conhecidos com antecedência para gerar todas as páginas. Portanto, alguns componentes podem ser renderizados usando pré-renderização, mas se precisarmos de algo dinâmico, temos que contar com o aplicativo para buscar o conteúdo.

Como o JavaScript tem um custo de desempenho, conforme a quantidade de JavaScript aumenta com um aplicativo, a divisão de código agressiva e o adiamento do JavaScript serão absolutamente necessários para domar o impacto do JavaScript. Para tais casos, um renderização do lado do servidor geralmente será uma abordagem melhor caso não seja necessária muita interatividade. Se não for uma opção, considere usar o modelo do App Shell.

Então, do lado do cliente ou do lado do servidor? Em geral, é uma boa ideia limitar o uso de estruturas totalmente do lado do cliente para páginas que absolutamente os exigem. Para aplicativos avançados, também não é uma boa ideia confiar apenas na renderização do lado do servidor. Tanto a renderização do servidor quanto a renderização do cliente são um desastre se malfeitas.

Esteja você inclinado para CSR ou SSR, certifique-se de renderizar pixels importantes o mais rápido possível e minimizar a lacuna entre essa renderização e o Tempo para interação. Considere a pré-renderização se suas páginas não mudarem muito e adie a inicialização dos frameworks se puder. Stream HTML em blocos com renderização do lado do servidor e implementar hidratação progressiva para renderização do lado do cliente & mdash e hidrate na visibilidade, interação ou durante o tempo ocioso para obter o melhor dos dois mundos.

Existem muitos geradores de sites estáticos e as páginas que eles geram costumam ser muito rápidas. Quanto mais conteúdo pudermos pré-construir com antecedência, em vez de gerar visualizações de página em um servidor ou cliente no momento da solicitação, melhor desempenho alcançaremos.

Na construção de sites estáticos parcialmente hidratados e progressivamente aprimorados, Markus Oberlehner mostra como criar sites com um gerador de site estático e um SPA, enquanto obtém aprimoramento progressivo e um tamanho mínimo de pacote de JavaScript. Markus usa Eleventy and Preact como suas ferramentas e mostra como configurar as ferramentas, adicionar hidratação parcial, hidratação preguiçosa, arquivo de entrada do cliente, configurar o Babel para Preact e agrupar Preact com Rollup & mdash do início ao fim.

Com o JAMStack usado em grandes sites atualmente, uma nova consideração de desempenho apareceu: o tempo de construção. Na verdade, construir até mesmo milhares de páginas com cada nova implantação pode levar minutos, por isso é promissor ver construções incrementais no Gatsby que melhoram os tempos de construção em 60 vezes, com integração em soluções CMS populares como WordPress, Contentful, Drupal, Netlify CMS e outros.

Regeneração estática incremental com Next.js. (Crédito da imagem: Prisma.io) (Visualização grande)

Além disso, Next.js anunciou a geração estática antecipada e incremental, o que nos permite adicionar novas páginas estáticas no tempo de execução e atualizar as páginas existentes depois de já terem sido construídas, re-renderizando-as em segundo plano conforme o tráfego chega .

Precisa de uma abordagem ainda mais leve? Em sua palestra sobre Eleventy, Alpine e Tailwind: em direção a um Jamstack leve, Nicola Goutay explica as diferenças entre CSR, SSR e tudo o que está entre eles e mostra como usar uma abordagem mais leve & mdash junto com um repositório GitHub que mostra a abordagem na prática.

Assim como acontece com as boas e velhas solicitações HTTP, quando os dados são recuperados de uma API, qualquer atraso na resposta do servidor se propagará para o usuário final, portanto atrasando a renderização. Quando um recurso deseja recuperar alguns dados de uma API, ele precisará solicitar os dados do terminal correspondente. Um componente que renderiza dados de vários recursos, como um artigo com comentários e fotos do autor em cada comentário, pode precisar de várias viagens de ida e volta ao servidor para buscar todos os dados antes de serem renderizados. Além disso, a quantidade de dados retornados por meio de REST geralmente é maior do que o necessário para renderizar esse componente.

Se muitos recursos exigirem dados de uma API, a API pode se tornar um gargalo de desempenho. GraphQL fornece uma solução de alto desempenho para esses problemas. Por si só, GraphQL é uma linguagem de consulta para sua API e um tempo de execução do lado do servidor para executar consultas usando um sistema de tipo que você define para seus dados. Ao contrário de REST, GraphQL pode recuperar todos os dados em um único pedido, e a resposta será exatamente o que é necessário, sem sobre ou debaixo-fetching dados como normalmente acontece com REST.

Além disso, porque GraphQL está usando esquema (metadados que informam como os dados são estruturados), ele já pode organizar os dados na estrutura preferida, então, por exemplo, com GraphQL, poderíamos remover o código JavaScript usado para lidar com o gerenciamento de estado, produzindo um código de aplicativo mais limpo e mais rápido o cliente.

Se você deseja começar a usar o GraphQL ou encontrar problemas de desempenho, estes artigos podem ser bastante úteis:

O benefício aparentemente óbvio dessas tecnologias para os usuários é desempenho garantido, então, às vezes, eles podem até preferir links de AMP- / Apple News / Instant Pages em vez de páginas "normais" e potencialmente inchadas. Para sites com muito conteúdo que lidam com muito conteúdo de terceiros, essas opções podem ajudar a acelerar drasticamente o tempo de renderização.

A menos que não o façam. De acordo com Tim Kadlec, por exemplo, "documentos AMP tendem a ser mais rápidos do que seus equivalentes, mas eles não significam necessariamente que uma página tem desempenho. AMP não é o que faz a maior diferença do ponto de vista do desempenho."

Um benefício para o dono do site é óbvio: descoberta desses formatos em suas respectivas plataformas e maior visibilidade nos motores de busca.

Bem, pelo menos é assim que costumava ser. Como AMP não é mais um requisito para Melhores histórias, os editores podem estar mudando de AMP para uma pilha tradicional (obrigado, Barry!).

Ainda assim, você também pode criar AMPs da Web progressivos, reutilizando AMPs como fonte de dados para seu PWA. Desvantagem? Obviamente, a presença em um jardim murado coloca os desenvolvedores em posição de produzir e manter uma versão separada de seu conteúdo, e no caso de Instant Articles e Apple News sem URLs reais (obrigado Addy, Jeremy!).

Observe que os CDNs também podem servir (e descarregar) conteúdo dinâmico. Portanto, não é necessário restringir seu CDN a ativos estáticos. Verifique novamente se o seu CDN realiza compressão e conversão (por exemplo, otimização de imagem e redimensionamento na borda), se eles fornecem suporte para servidores, testes A / B, bem como inclusões de borda, que montam partes estáticas e dinâmicas das páginas na borda do CDN (ou seja, o servidor mais próximo do usuário) e outras tarefas. Além disso, verifique se o seu CDN oferece suporte a HTTP sobre QUIC (HTTP / 3).

Katie Hempenius escreveu um guia fantástico para CDNs que fornece insights sobre como escolher um bom CDN, como ajustá-lo e todas as pequenas coisas para ter em mente ao avaliar um. Em geral, é uma boa ideia armazenar em cache o conteúdo da forma mais agressiva possível e habilitar recursos de desempenho de CDN como Brotli, TLS 1.3, HTTP / 2 e HTTP / 3.

Observação: com base na pesquisa de Patrick Meenan e Andy Davies, a priorização HTTP / 2 é efetivamente quebrada em muitos CDNs, portanto, tome cuidado ao escolher um CDN. Patrick tem mais detalhes em sua palestra sobre priorização HTTP / 2 (obrigado, Barry!).

O CDNPerf mede a velocidade de consulta para CDNs reunindo e analisando 300 milhões de testes todos os dias. (Visualização grande)

Ao escolher um CDN, você pode usar estes sites de comparação com uma visão geral detalhada de seus recursos:

    , uma matriz de comparação de CDN para Cloudfront, Aazure, KeyCDN, Fastly, Verizon, Stackpach, Akamai e muitos outros. mede a velocidade de consulta para CDNs reunindo e analisando 300 milhões de testes todos os dias, com todos os resultados baseados em dados RUM de usuários em todo o mundo. Verifique também a comparação de desempenho de DNS e a comparação de desempenho de nuvem. fornece uma visão geral dos CDNs para tópicos específicos, como Servir desatualizado, Purgar, Origin Shield, Prefetch e Compression. fornece insights sobre os principais provedores de CDN, seu gerenciamento de RTT e TLS, tempo de negociação de TLS, adoção de HTTP / 2 e outros. (Infelizmente, os dados são apenas de 2019).

Otimizações de ativos

  1. Use Brotli para compactação de texto simples.
    Em 2015, o Google lançou o Brotli, um novo formato de dados sem perdas de código aberto, que agora é compatível com todos os navegadores modernos. A biblioteca de código aberto Brotli, que implementa um codificador e decodificador para Brotli, tem 11 níveis de qualidade predefinidos para o codificador, com nível de qualidade superior exigindo mais CPU em troca de uma taxa de compressão melhor. A compressão mais lenta acabará levando a taxas de compressão mais altas, mas ainda assim, o Brotli descompacta rapidamente. É importante notar que o Brotli com o nível de compactação 4 é menor e compacta mais rápido do que o Gzip.

Na prática, Brotli parece ser muito mais eficaz do que Gzip. As opiniões e experiências diferem, mas se o seu site já estiver otimizado com Gzip, você pode esperar melhorias de pelo menos um dígito e, na melhor das hipóteses, melhorias de dois dígitos na redução de tamanho e tempos de FCP. Você também pode estimar a economia de compactação Brotli para o seu site.

Os navegadores aceitarão o Brotli apenas se o usuário estiver visitando um site por HTTPS. Brotli é amplamente suportado e muitos CDNs o suportam (Akamai, Netlify Edge, AWS, KeyCDN, Fastly (atualmente apenas como uma passagem), Cloudflare, CDN77) e você pode habilitar Brotli mesmo em CDNs que ainda não o suportam (com um trabalhador de serviço).

O problema é que porque a compressão tudo Ativos com Brotli em um alto nível de compactação são caros, muitos provedores de hospedagem não podem usá-lo totalmente devido ao alto custo indireto que ele produz. Na verdade, no nível mais alto de compressão, Brotli é assim lento para que qualquer ganho potencial no tamanho do arquivo possa ser anulado pela quantidade de tempo que leva para o servidor começar a enviar a resposta enquanto espera para compactar dinamicamente o ativo. (Mas se você tiver tempo durante o tempo de construção com compactação estática, é claro, configurações de compactação mais altas são preferidas.)

Comparação de tempos de back end de vários métodos de compressão. Sem surpresa, Brotli é mais lento que gzip (por enquanto). (Visualização grande)

Isso pode estar mudando, no entanto. O formato de arquivo Brotli inclui um dicionário estático embutido, e além de conter várias strings em vários idiomas, também oferece a opção de aplicar várias transformações a essas palavras, aumentando sua versatilidade. Em sua pesquisa, Felix Hanau descobriu uma maneira de melhorar a compressão nos níveis 5 a 9 usando "um subconjunto mais especializado do dicionário do que o padrão" e contando com o cabeçalho Content-Type para dizer ao compressor se ele deve usar um dicionário para HTML, JavaScript ou CSS. O resultado foi um "impacto insignificante no desempenho (1% a 3% a mais de CPU em comparação com 12% normalmente) ao compactar o conteúdo da web em altos níveis de compactação, usando uma abordagem de uso de dicionário limitado".

Com a abordagem de dicionário aprimorada, podemos compactar ativos mais rapidamente em níveis de compactação mais altos, usando apenas 1% a 3% a mais de CPU. Normalmente, o nível de compactação 6 sobre 5 aumentaria o uso da CPU em até 12%. (Visualização grande)

Além disso, com a pesquisa de Elena Kirilenko, podemos alcançar resultados rápidos e recompressão Brotli eficiente usando artefatos de compressão anteriores. De acordo com Elena, "assim que tivermos um ativo compactado via Brotli e estivermos tentando compactar o conteúdo dinâmico em tempo real, onde o conteúdo se assemelhe ao conteúdo disponível para nós com antecedência, podemos alcançar melhorias significativas nos tempos de compactação. "

Com que frequência é esse o caso? Por exemplo. com entrega de JavaScript agrupa subconjuntos (por exemplo, quando partes do código já estão armazenadas em cache no cliente ou com pacote dinâmico servindo com WebBundles). Ou com HTML dinâmico baseado em modelos previamente conhecidos, ou fontes WOFF2 com subconjuntos dinâmicos. De acordo com Elena, podemos obter 5,3% de melhora na compressão e 39% na velocidade de compressão ao remover 10% do conteúdo, e 3,2% melhores taxas de compressão e 26% mais rápida na compressão, ao remover 50% do conteúdo.

A compressão Brotli está ficando melhor, então se você pode contornar o custo de compressão dinâmica de ativos estáticos, definitivamente vale a pena o esforço. Nem é preciso dizer que Brotli pode ser usado para qualquer carga útil de texto simples & mdash HTML, CSS, SVG, JavaScript, JSON e assim por diante.

Observação: no início de 2021, aproximadamente 60% das respostas HTTP eram entregues sem compactação baseada em texto, com 30,82% compactando com Gzip e 9,1% compactando com Brotli (tanto no celular quanto no desktop). Por exemplo, 23,4% das páginas angulares não são compactadas (via gzip ou Brotli). No entanto, frequentemente, ativar a compressão é uma das vantagens mais fáceis para melhorar o desempenho com um simples toque de um botão.

A estratégia? Pré-comprima ativos estáticos com Brotli + Gzip no nível mais alto e comprima HTML (dinâmico) em tempo real com Brotli no nível 4-6. Certifique-se de que o servidor lida com a negociação de conteúdo para Brotli ou Gzip corretamente.

O futuro das imagens responsivas pode mudar drasticamente com a adoção mais ampla de dicas do cliente. As dicas do cliente são campos de cabeçalho de solicitação HTTP, por exemplo, DPR, Viewport-Width, Width, Save-Data, Accept (para especificar preferências de formato de imagem) e outros. Eles devem informar o servidor sobre as especificidades do navegador do usuário, tela, conexão, etc.

Como resultado, o servidor pode decidir como preencher o layout com imagens de tamanho apropriado, e veicular apenas essas imagens nos formatos desejados. Com dicas de cliente, movemos a seleção de recursos da marcação HTML para a negociação de solicitação-resposta entre o cliente e o servidor.

Veiculação de mídia adaptável em uso. Enviamos um placeholder com texto para usuários que estão offline, uma imagem de baixa resolução para usuários 2G, uma imagem de alta resolução para usuários 3G e um vídeo HD para usuários 4G. Via carregamento rápido de páginas da web em um feature phone de US $ 20. (Visualização grande)

Como Ilya Grigorik observou há um tempo, as dicas do cliente completam a imagem & mdash, elas não são uma alternativa às imagens responsivas. "O elemento & ltpicture & gt fornece o controle de direção de arte necessário na marcação HTML. As dicas do cliente fornecem anotações sobre as solicitações de imagem resultantes que permitem a automação da seleção de recursos. O Service Worker fornece recursos completos de gerenciamento de solicitações e respostas no cliente."

Um prestador de serviço poderia, por exemplo, anexar novos valores de cabeçalhos de dicas de cliente à solicitação, reescrever a URL e apontar a solicitação de imagem para um CDN, adaptar a resposta com base na conectividade e nas preferências do usuário, etc. Isso vale não apenas para ativos de imagem, mas também para praticamente todas as outras solicitações.

Para clientes que suportam dicas de cliente, pode-se medir 42% de economia de bytes em imagens e 1 MB + bytes a menos para o 70º + percentil. Na Smashing Magazine, também pudemos medir uma melhoria de 19-32%. Dicas de cliente são suportadas em navegadores baseados em Chromium, mas ainda estão em consideração no Firefox.

No entanto, se você fornecer a marcação de imagens responsivas normal e a tag & ltmeta & gt para dicas de cliente, um navegador de suporte avaliará a marcação de imagens responsivas e solicitará a fonte de imagem apropriada usando os cabeçalhos HTTP de dicas de cliente.

Basicamente, podemos veicular condicionalmente imagens de fundo de baixa resolução com um descritor 1x e imagens de alta resolução com um descritor 2x e até mesmo uma imagem de qualidade de impressão com descritor 600dpi. Porém, tenha cuidado: os navegadores não fornecem nenhuma informação especial sobre as imagens de fundo para a tecnologia assistiva, portanto, idealmente, essas fotos seriam apenas uma decoração.

Portanto, no mínimo, poderíamos explorar o uso do formato WebP para nossas imagens. Na verdade, a saga do WebP está chegando ao fim no ano passado com a Apple adicionando suporte para WebP no Safari 14. Então, após muitos anos de discussões e debates, a partir de hoje, o WebP é compatível com todos os navegadores modernos. Portanto, podemos exibir imagens WebP com o elemento & ltpicture & gt e um JPEG substituto se necessário (consulte o trecho de código de Andreas Bovens) ou usando negociação de conteúdo (usando cabeçalhos Aceitar).

WebP não é sem seu desvantagens Apesar. Embora os tamanhos de arquivo de imagem WebP sejam comparados aos equivalentes Guetzli e Zopfli, o formato não suporta renderização progressiva como JPEG, razão pela qual os usuários podem ver a imagem finalizada mais rápido com um bom e velho JPEG, embora as imagens WebP possam estar ficando mais rápidas na rede. Com JPEG, podemos oferecer uma experiência de usuário "decente" com metade ou até mesmo um quarto dos dados e carregar o resto mais tarde, em vez de ter uma imagem meio vazia como no caso do WebP.

Sua decisão vai depender do que você está procurando: com WebP, você reduzirá a carga útil e com JPEG você melhorará o desempenho percebido. Você pode aprender mais sobre WebP em WebP Rewind talk de Pascal Massimino do Google.

Para conversão para WebP, você pode usar o WebP Converter, cwebp ou libwebp. Ire Aderinokun tem um tutorial muito detalhado sobre a conversão de imagens para WebP, também & mdash, assim como Josh Comeau em seu artigo sobre a adoção de formatos de imagem modernos.

Uma palestra completa sobre WebP: WebP Rewind de Pascal Massimino. (Visualização grande)

Sketch oferece suporte nativo a WebP, e imagens WebP podem ser exportadas do Photoshop usando um plugin WebP para Photoshop. Mas outras opções também estão disponíveis.

Se você estiver usando WordPress ou Joomla, existem extensões para ajudá-lo a implementar facilmente o suporte para WebP, como Optimus e Cache Enabler para WordPress e a extensão compatível do próprio Joomla (via Cody Arsenault). Você também pode abstrair o elemento & ltpicture & gt com React, componentes estilizados ou imagem gatsby.

Ah & mdash plug desavergonhado! & mdash Jeremy Wagner até publicou um livro Smashing no WebP, que você pode querer verificar se está interessado em tudo em torno do WebP.

Na verdade, em comparação com WebP e JPEG, AVIF tem um desempenho significativamente melhor, resultando em uma economia de tamanho de arquivo médio de até 50% no mesmo DSSIM ((des) similaridade entre duas ou mais imagens usando um algoritmo que aproxima a visão humana). Na verdade, em sua postagem completa sobre como otimizar o carregamento de imagens, Malte Ubl observa que AVIF "supera consistentemente o JPEG de uma maneira muito significativa. Isso é diferente do WebP, que nem sempre produz imagens menores do que JPEG e pode, na verdade, ser uma rede. perda devido à falta de suporte para carregamento progressivo. "

Podemos usar AVIF como um aprimoramento progressivo, fornecendo WebP ou JPEG ou PNG para navegadores mais antigos. (Visualização grande). Veja a visualização de texto simples abaixo.

Ironicamente, o AVIF pode ter um desempenho ainda melhor do que grandes SVGs, embora, é claro, não deva ser visto como um substituto para os SVGs. É também um dos primeiros formatos de imagem a oferecer suporte a cores HDR, oferecendo maior brilho, profundidade de bits de cor e gamas de cores. A única desvantagem é que atualmente AVIF não suporta decodificação de imagem progressiva (ainda?) E, da mesma forma que Brotli, uma codificação de alta taxa de compressão é bastante lenta, embora a decodificação seja rápida.

AVIF é atualmente suportado no Chrome, Firefox e Opera, e o suporte no Safari deve chegar em breve (já que a Apple é membro do grupo que criou o AV1).

Qual é o melhor maneira de veicular imagens nos dias de hoje então? Para ilustrações e imagens vetoriais, o SVG (compactado) é sem dúvida a melhor escolha. Para fotos, usamos métodos de negociação de conteúdo com o elemento de imagem. Se AVIF for compatível, enviaremos uma imagem AVIF, se não for o caso, voltamos para o WebP primeiro e, se o WebP também não for compatível, mudamos para JPEG ou PNG como substituto (aplicando condições @media se necessário):

Francamente, é mais provável que estejamos usando algumas condições dentro do elemento de imagem, embora:

Você pode ir ainda mais longe trocando imagens animadas por imagens estáticas para clientes que optam por menos movimento com movimento reduzido preferencial:

Ao longo dos meses, o AVIF ganhou bastante força:

  • Podemos testar fallbacks WebP / AVIF no painel Rendering no DevTools.
  • Podemos usar Squoosh, AVIF.io e libavif para codificar, decodificar, compactar e converter arquivos AVIF.
  • Podemos usar o componente AVIF Preact de Jake Archibald que decodifica um arquivo AVIF em um trabalhador e exibe o resultado em uma tela,
  • Para fornecer AVIF apenas para navegadores de suporte, podemos usar um plugin PostCSS junto com um script 315B para usar AVIF em suas declarações CSS.
  • Podemos entregar progressivamente novos formatos de imagem com CSS e Cloudlare Workers para alterar dinamicamente o documento HTML retornado, inferindo informações do cabeçalho de aceitação e, em seguida, adicionar as classes webp / avif etc. conforme apropriado.
  • AVIF já está disponível em Cloudinary (com limites de uso), Cloudflare suporta AVIF em redimensionamento de imagem, e você pode habilitar AVIF com cabeçalhos AVIF personalizados no Netlify.
  • Quando se trata de animação, o AVIF tem um desempenho tão bom quanto o Safari & ltimg src = mp4 & gt, superando o GIF e WebP em geral, mas o MP4 ainda tem um desempenho melhor.
  • Em geral, para animações, AVC1 (h264) & gt HVC1 & gt WebP & gt AVIF & gt GIF, assumindo que os navegadores baseados em Chromium sempre oferecerão suporte a & ltimg src = mp4 & gt.
  • Você pode encontrar mais detalhes sobre AVIF na palestra AVIF for Next Generation Image Coding, de Aditya Mavlankar da Netflix, e na palestra The AVIF Image Format, de Kornel Lesiński da Cloudflare.
  • Uma ótima referência para tudo sobre AVIF: a postagem abrangente de Jake Archibald sobre AVIF chegou.

Então é o futuro AVIF então? Jon Sneyers discorda: AVIF tem desempenho 60% pior do que JPEG XL, outro formato aberto e gratuito desenvolvido pelo Google e pela Cloudinary. Na verdade, JPEG XL parece ter um desempenho muito melhor em todas as áreas. No entanto, JPEG XL ainda está apenas nos estágios finais de padronização e ainda não funciona em nenhum navegador. (Não confundir com o JPEG-XR da Microsoft vindo do bom e velho Internet Explorer 9 vezes).

Para PNG, podemos usar o Pingo, e para SVG, podemos usar SVGO ou SVGOMG. E se você precisar visualizar e copiar ou baixar rapidamente todos os ativos SVG de um site, o svg-grabber pode fazer isso por você também.

Cada artigo de otimização de imagem indicaria isso, mas manter os ativos vetoriais limpos e compactos sempre vale a pena mencionar. Certifique-se de limpar ativos não utilizados, remover metadados desnecessários e reduzir o número de pontos de caminho na arte (e, portanto, o código SVG). (Obrigado, Jeremy!)

Existem também ferramentas online úteis disponíveis:

  • Use o Squoosh para compactar, redimensionar e manipular imagens nos níveis de compactação ideais (com ou sem perdas),
  • Use Guetzli.it para compactar e otimizar imagens JPEG com Guetzli, que funciona bem para imagens com bordas nítidas e cores sólidas (mas pode ser um pouco mais lento)).
  • Use o Responsive Image Breakpoints Generator ou um serviço como Cloudinary ou Imgix para automatizar a otimização de imagem. Além disso, em muitos casos, o uso de srcset e tamanhos isoladamente trará benefícios significativos.
  • Para verificar a eficiência de sua marcação responsiva, você pode usar o imaging-heap, uma ferramenta de linha de comando que mede a eficiência em tamanhos de viewport e proporções de pixel do dispositivo.
  • Você pode adicionar compactação automática de imagem aos fluxos de trabalho do GitHub, para que nenhuma imagem chegue à produção descompactada. A ação usa mozjpeg e libvips que funcionam com PNGs e JPGs.
  • Para otimizar o armazenamento internamente, você pode usar o novo formato Lepton do Dropbox para compactar JPEGs sem perdas em uma média de 22%.
  • Use BlurHash se desejar mostrar uma imagem de espaço reservado no início. BlurHash pega uma imagem e fornece uma string curta (apenas 20-30 caracteres!) Que representa o espaço reservado para esta imagem. A string é curta o suficiente para ser facilmente adicionada como um campo em um objeto JSON.

Às vezes, otimizar imagens por si só não resolve. Para melhorar o tempo necessário para iniciar a renderização de uma imagem crítica, carga preguiçosa imagens menos importantes e adiar qualquer script para carregar depois que as imagens críticas já foram renderizadas. A maneira mais à prova de balas é o lazy-loading híbrido, quando utilizamos o lazy-loading e o lazyload nativos, uma biblioteca que detecta qualquer alteração de visibilidade acionada por meio da interação do usuário (com IntersectionObserver que exploraremos mais tarde). Além disso:

  • Considere o pré-carregamento de imagens importantes, para que um navegador não as descubra tarde demais. Para imagens de fundo, se quiser ser ainda mais agressivo do que isso, você pode adicionar a imagem como uma imagem normal com & ltimg src & gt e, em seguida, ocultá-la fora da tela.
  • Considere trocar imagens com o atributo de tamanhos especificando diferentes dimensões de exibição de imagem dependendo das consultas de mídia, por exemplo, para manipular tamanhos para trocar fontes em um componente de ampliação.
  • Revise as inconsistências de download de imagens para evitar downloads inesperados de imagens de primeiro e segundo plano. Cuidado com as imagens que são carregadas por padrão, mas podem nunca ser exibidas & mdash, por exemplo em carrosséis, acordeões e galerias de imagens.
  • Certifique-se de sempre definir a largura e a altura das imagens. Fique atento à propriedade de proporção de aspecto em CSS e ao atributo intrinsicsize, que nos permitirá definir proporções e dimensões para imagens, para que o navegador possa reservar um slot de layout predefinido antecipadamente para evitar saltos de layout durante o carregamento da página.

Se você se sentir aventureiro, poderá cortar e reorganizar streams HTTP / 2 usando Edge workers, basicamente um filtro em tempo real no CDN, para enviar imagens mais rapidamente pela rede. Trabalhadores de borda usam fluxos de JavaScript que usam pedaços que você pode controlar (basicamente, eles são JavaScript que é executado na borda de CDN que pode modificar as respostas de fluxo), para que você possa controlar a entrega de imagens.

Com um service worker, é tarde demais, pois você não pode controlar o que está na transmissão, mas funciona com Edge workers. Portanto, você pode usá-los sobre JPEGs estáticos salvos progressivamente para uma página de destino específica.

Um exemplo de saída por imaging-heap, uma ferramenta de linha de comando que mede a eficiência em tamanhos de viewport e proporções de pixel de dispositivo. (Fonte da imagem) (visualização grande)

Não esta bom o suficiente? Bem, você também pode melhorar o desempenho percebido para imagens com a técnica de múltiplas imagens de fundo. Lembre-se de que brincar com o contraste e desfocar detalhes desnecessários (ou remover cores) também pode reduzir o tamanho do arquivo. Ah, você precisa amplie uma pequena foto sem perder qualidade? Considere o uso de Letsenhance.io.

Essas otimizações até agora cobrem apenas o básico. Addy Osmani publicou um guia muito detalhado sobre Essential Image Optimization que vai muito fundo nos detalhes de compressão de imagem e gerenciamento de cores. Por exemplo, você poderia desfocar partes desnecessárias da imagem (aplicando um filtro de desfoque gaussiano a eles) para reduzir o tamanho do arquivo e, eventualmente, você pode até começar a remover cores ou transformar a imagem em preto e branco para reduzir o tamanho ainda mais. Para imagens de fundo, exportar fotos do Photoshop com qualidade de 0 a 10% também pode ser absolutamente aceitável.

Na Smashing Magazine, usamos o postfix -opt para nomes de imagens & mdash por exemplo, brotli-compression-opt.png sempre que uma imagem contém esse postfix, todos na equipe sabem que a imagem já foi otimizada.

Ah, e não use JPEG-XR na web & mdash "o processamento de decodificação de JPEG-XRs do lado do software na CPU anula e até supera o impacto potencialmente positivo da economia de tamanho de byte, especialmente no contexto de SPAs" (não para misturar com Cloudinary / Google's JPEG XL embora).

Ao contrário das imagens, os navegadores não pré-carregam o conteúdo & ltvideo & gt, mas os vídeos HTML5 tendem a ser muito mais leves e menores do que os GIFs. Não é uma opção? Bem, pelo menos podemos adicionar compressão com perdas a GIFs com GIF com perdas, gifsicle ou giflossy.

Testes de Colin Bendell mostram que os vídeos em linha dentro das tags img no Safari Technology Preview exibem pelo menos 20 × mais rápido e decodificam 7 × mais rápido do que o equivalente GIF, além de ser uma fração no tamanho do arquivo. No entanto, não é compatível com outros navegadores.

Na terra das boas notícias, os formatos de vídeo têm sido avançando maciçamente ao longo dos anos. Por muito tempo, esperávamos que WebM se tornasse o formato para governar todos eles, e WebP (que é basicamente uma imagem estática dentro do contêiner de vídeo WebM) se tornasse um substituto para formatos de imagem desatualizados. Na verdade, o Safari agora oferece suporte ao WebP, mas apesar do WebP e do WebM ganharem suporte atualmente, o avanço não aconteceu de verdade.

Ainda assim, poderíamos usar o WebM para a maioria dos navegadores modernos:

Mas talvez pudéssemos revisitá-lo completamente. Em 2018, a Alliance of Open Media lançou um novo formato de vídeo promissor chamado AV1. O AV1 tem compactação semelhante ao codec H.265 (a evolução do H.264), mas ao contrário do último, o AV1 é gratuito. O preço da licença H.265 levou os fornecedores de navegadores a adotar um AV1 de desempenho comparável em vez disso: AV1 (assim como H.265) compacta duas vezes melhor que WebM.

O AV1 tem boas chances de se tornar o padrão definitivo para vídeo na web. (Crédito da imagem: Wikimedia.org) (visualização grande)

Na verdade, a Apple atualmente usa o formato HEIF e HEVC (H.265), e todas as fotos e vídeos no iOS mais recente são salvos nesses formatos, não em JPEG. Embora HEIF e HEVC (H.265) não sejam devidamente expostos na web (ainda?), AV1 é & mdash e está ganhando suporte para navegador. Portanto, adicionar a fonte AV1 em sua tag & ltvideo & gt é razoável, pois todos os fornecedores de navegadores parecem estar a bordo.

Por enquanto, a codificação mais amplamente usada e compatível é H.264, veiculada por arquivos MP4, portanto, antes de veicular o arquivo, certifique-se de que seus MP4s sejam processados ​​com uma codificação multipass, borrada com o efeito frei0r iirblur (se aplicável) e Os metadados do moov atom são movidos para o cabeçalho do arquivo, enquanto seu servidor aceita o serviço de bytes. Boris Schapira fornece instruções exatas para FFmpeg otimizar vídeos ao máximo. É claro que fornecer o formato WebM como alternativa também ajudaria.

Precisa começar a renderizar vídeos mais rápido, mas os arquivos de vídeo ainda são muito grandes? Por exemplo, sempre que você tem um grande vídeo de fundo em uma página de destino? Uma técnica comum a ser usada é mostrar primeiro o primeiro quadro como uma imagem estática ou exibir um segmento de looping curto e altamente otimizado que pode ser interpretado como parte do vídeo e, em seguida, sempre que o vídeo for armazenado em buffer o suficiente, comece a reproduzir o vídeo real. Doug Sillars escreveu um guia detalhado para o desempenho do vídeo de fundo que pode ser útil nesse caso. (Obrigado, Guy Podjarny!).

Para o cenário acima, você pode querer fornecer imagens responsivas de pôster. Por padrão, os elementos de vídeo permitem apenas uma imagem como pôster, o que não é necessariamente o ideal. Podemos usar o pôster de vídeo responsivo, uma biblioteca JavaScript que permite usar diferentes imagens de pôster para telas diferentes, ao mesmo tempo que adiciona uma sobreposição de transição e controle total de estilo dos espaços reservados de vídeo.

A pesquisa mostra que a qualidade do stream de vídeo afeta o comportamento do espectador. Na verdade, os espectadores começam a abandonar o vídeo se o atraso de inicialização exceder cerca de 2 segundos. Além desse ponto, um aumento de 1 segundo no atraso resulta em um aumento de aproximadamente 5,8% na taxa de abandono. Portanto, não é surpreendente que o tempo médio de início do vídeo seja de 12,8s, com 40% dos vídeos tendo pelo menos 1 parada, e 20% pelo menos 2s de reprodução de vídeo parada. Na verdade, as paradas de vídeo são inevitáveis ​​no 3G, pois os vídeos são reproduzidos mais rápido do que a rede pode fornecer conteúdo.

Então, qual é a solução? Normalmente, os dispositivos de tela pequena não suportam 720p e 1080p que servimos no desktop. De acordo com Doug Sillars, podemos criar versões menores de nossos vídeos e usar Javascript para detectar a fonte em telas menores para garantir um reprodução rápida e suave nesses dispositivos. Alternativamente, podemos usar streaming de vídeo. Os streams de vídeo HLS fornecerão um vídeo de tamanho apropriado para o dispositivo & mdash abstraindo a necessidade de criar vídeos diferentes para telas diferentes. Ele também negociará a velocidade da rede e adaptará a taxa de bits do vídeo para a velocidade da rede que você está usando.

Para evitar o desperdício de largura de banda, só podemos adicionar a fonte de vídeo para dispositivos que realmente podem reproduzir bem o vídeo. Como alternativa, podemos remover o atributo autoplay da tag de vídeo e usar JavaScript para inserir a reprodução automática em telas maiores. Além disso, precisamos adicionar preload = "none" no vídeo para informar ao navegador para não baixar algum dos arquivos de vídeo até que realmente precise do arquivo:

Em seguida, poderíamos adicionar novamente a reprodução automática acima de um determinado limite (por exemplo, 1000px):

Número de paradas por dispositivo e velocidade da rede. Dispositivos mais rápidos em redes mais rápidas virtualmente não têm travas. De acordo com a pesquisa de Doug Sillars. (Visualização grande)

O desempenho da reprodução de vídeo é uma história por si só, e se você quiser se aprofundar nisso, dê uma olhada em outra série de Doug Sillars sobre o estado atual do vídeo e práticas recomendadas de entrega de vídeo que inclui detalhes sobre as métricas de entrega de vídeo , pré-carregamento, compressão e streaming de vídeo. Por fim, você pode verificar o quão lento ou rápido será o streaming de seu vídeo com Stream or Not.

O suporte ao WOFF2 é excelente e podemos usar o WOFF como substituto para navegadores que não o suportam & mdash ou talvez navegadores legados possam ter fontes do sistema veiculadas. Existem muitos, muitos, muitos opções para carregamento de fontes da web, e podemos escolher uma das estratégias do "Guia abrangente para estratégias de carregamento de fontes" de Zach Leatherman (trechos de código também estão disponíveis como receitas de carregamento de fontes da web).

Provavelmente, as melhores opções a serem consideradas hoje são Critical FOFT com pré-carga e o método "The Compromise". Ambos usam um renderização de dois estágios para entregar fontes da web em etapas & mdash primeiro um pequeno super-subconjunto necessário para renderizar a página de forma rápida e precisa com a fonte da web e, em seguida, carregar o resto da família de forma assíncrona. A diferença é que a técnica "The Compromise" carrega polyfill de forma assíncrona apenas se os eventos de carregamento de fonte não forem suportados, então você não precisa carregar o polyfill por padrão. Precisa de uma vitória rápida? Zach Leatherman tem um rápido tutorial de 23 minutos e estudo de caso para colocar suas fontes em ordem.

Em geral, pode ser uma boa ideia usar a dica de recurso de pré-carregamento para pré-carregar fontes, mas em sua marcação inclua as dicas depois o link para CSS e JavaScript essenciais. Com o pré-carregamento, há um quebra-cabeça de prioridades, então considere injetar elementos rel = "preload" no DOM antes dos scripts de bloqueio externos. De acordo com Andy Davies, "os recursos injetados por meio de um script ficam ocultos do navegador até que o script seja executado e podemos usar esse comportamento para atrasar quando o navegador descobrir a dica de pré-carregamento". Caso contrário, o carregamento da fonte custará na primeira renderização.

Quando tudo é crítico, nada é crítico. pré-carregue apenas uma ou no máximo duas fontes de cada família. (Crédito da imagem: Zach Leatherman & ndash slide 93) (Visualização grande)

É uma boa ideia ser seletivo e escolher os arquivos mais importantes, por exemplo aqueles que são essenciais para a renderização ou que o ajudariam a evitar refluxos de texto visíveis e prejudiciais. Em geral, Zach aconselha pré-carregar uma ou duas fontes de cada família & mdash também faz sentido atrasar o carregamento de algumas fontes se elas forem menos críticas.

Tornou-se bastante comum usar o valor local () (que se refere a uma fonte local pelo nome) ao definir uma família de fontes na regra @ font-face:

A ideia é razoável: algumas fontes populares de código aberto, como Open Sans, vêm pré-instaladas com alguns drivers ou aplicativos, portanto, se a fonte estiver disponível localmente, o navegador não precisa baixar a fonte da web e pode exibir a fonte local fonte imediatamente. Como observou Bram Stein, "embora uma fonte local corresponda ao nome de uma fonte da web, é mais provável não é a mesma fonte. Muitas fontes da web diferem de sua versão "desktop". O texto pode ser renderizado de maneira diferente, alguns caracteres podem retornar a outras fontes, recursos OpenType podem estar ausentes ou a altura da linha pode ser diferente. "

Além disso, conforme as fontes evoluem com o tempo, a versão instalada localmente pode ser muito diferente da fonte da web, com caracteres muito diferentes. Então, de acordo com Bram, é melhor nunca misture fontes instaladas localmente e fontes da web nas regras @ font-face. O Google Fonts desabilitou local () nos resultados CSS para todos os usuários, exceto solicitações do Android para Roboto.

Ninguém gosta de esperar que o conteúdo seja exibido. Com o descritor CSS de exibição de fonte, podemos controlar o comportamento de carregamento da fonte e permitir que o conteúdo seja legível imediatamente (com exibição de fonte: opcional) ou quase imediatamente (com um tempo limite de 3s, contanto que a fonte seja baixada com sucesso - com font-display: swap). (Bem, é um pouco mais complicado do que isso.)

No entanto, se você quiser minimizar o impacto dos refluxos de texto, podemos usar o API de carregamento de fonte (compatível com todos os navegadores modernos). Especificamente, isso significa que, para cada fonte, criamos um objeto FontFace e, em seguida, tentamos buscar todos eles e só então os aplicamos à página. Assim, nós agrupar todas as repintura carregando todas as fontes de maneira assíncrona e, em seguida, alterne das fontes substitutas para a fonte da Web exatamente uma vez. Dê uma olhada na explicação de Zach, começando em 32:15, e o snippet de código):

Para iniciar uma busca muito precoce das fontes com a API Font Loading em uso, Adrian Bece sugere adicionar um espaço não separável nbsp na parte superior do corpo e ocultá-lo visualmente com visibilidade de ária: oculto e uma classe oculta:

Isso vai junto com o CSS que tem diferentes famílias de fontes declaradas para diferentes estados de carregamento, com a mudança acionada pela API Font Loading assim que as fontes foram carregadas com sucesso:

Se você já se perguntou por que, apesar de todas as suas otimizações, o Lighthouse ainda sugere eliminar recursos de bloqueio de renderização (fontes), no mesmo artigo Adrian Bece fornece algumas técnicas para deixar o Lighthouse feliz, junto com um Gatsby Omni Font Loader, uma fonte assíncrona de desempenho Plugin de manipulação de carregamento e Flash Of Unstyled Text (FOUT) para Gatsby.

Agora, muitos de nós podem estar usando um CDN ou um host de terceiros para carregar fontes da web. Em geral, é sempre melhor hospedar automaticamente todos os seus ativos estáticos, se possível, então considere usar google-webfonts-helper, uma maneira descomplicada de hospedar o Google Fonts automaticamente. E se não for possível, você pode talvez usar o proxy dos arquivos de fonte do Google por meio da origem da página.

É importante notar, porém, que o Google está fazendo um pouco de trabalho fora da caixa, então um servidor pode precisar de alguns ajustes para evitar atrasos (obrigado, Barry!)

Isso é muito importante, especialmente porque desde o Chrome v86 (lançado em outubro de 2020), recursos entre sites, como fontes, não podem mais ser compartilhados no mesmo CDN & mdash devido ao cache do navegador particionado. Esse comportamento foi um padrão no Safari por anos.

Mas se isso não for possível, há uma maneira de obter o Google Fonts mais rápido possível com o snippet de Harry Roberts:

A estratégia de Harry é aquecer preventivamente a origem das fontes primeiro. Em seguida, iniciamos uma busca assíncrona de alta prioridade para o arquivo CSS. Depois disso, iniciamos uma busca assíncrona de baixa prioridade que é aplicada à página somente depois que ela chega (com um truque de impressão da folha de estilo). Finalmente, se o JavaScript não for compatível, voltamos ao método original.

Ah, falando sobre Google Fonts: você pode raspar até 90% do tamanho de solicitações do Google Fonts, declarando apenas os caracteres de que você precisa com & amptext. Além disso, o suporte para exibição de fontes também foi adicionado recentemente ao Google Fonts, para que possamos usá-lo imediatamente.

Uma rápida palavra de cautela, no entanto. Se você usar font-display: optional, pode ser abaixo do ideal também usar preload, pois isso irá acionar a solicitação de fonte da web antecipadamente (causando Congestionamento de rede se você tiver outros recursos de caminho crítico que precisam ser buscados). Use a pré-conexão para solicitações de fontes de origem cruzada mais rápidas, mas tenha cuidado com o pré-carregamento, pois o pré-carregamento de fontes de uma origem diferente incorrerá em contenção de rede. Todas essas técnicas são abordadas nas receitas de carregamento de fontes da Web de Zach.

Por outro lado, pode ser uma boa ideia desativar as fontes da web (ou pelo menos a renderização do segundo estágio) se o usuário ativou Reduzir movimento nas preferências de acessibilidade ou optou por Modo de economia de dados (consulte o cabeçalho Save-Data) ou quando o usuário tem uma conectividade lenta (via API de informações de rede).

Também podemos usar a consulta de mídia CSS de dados reduzidos preferidos para não definir declarações de fontes se o usuário optou pelo modo de economia de dados (há outros casos de uso também). A consulta de mídia basicamente exporia se o cabeçalho da solicitação Save-Data da extensão HTTP Client Hint está ativado / desativado para permitir o uso com CSS. Atualmente suportado apenas no Chrome e Edge atrás de uma bandeira.

Métricas? Para medir o desempenho de carregamento de fontes da web, considere o Todo o texto visível métrica (o momento em que todas as fontes foram carregadas e todo o conteúdo é exibido em fontes da web), Tempo para Itálico Real, bem como Contagem de refluxo de fonte da web após a primeira renderização. Obviamente, quanto mais baixas forem as duas métricas, melhor será o desempenho.

A respeito fontes variáveis, você pode perguntar? É importante notar que as fontes variáveis ​​podem exigir uma consideração significativa de desempenho. Eles nos fornecem um espaço de design muito mais amplo para escolhas tipográficas, mas isso vem ao custo de uma única solicitação em série, em oposição a uma série de solicitações de arquivos individuais.

Embora as fontes variáveis ​​reduzam drasticamente o tamanho geral do arquivo combinado dos arquivos de fontes, essa única solicitação pode ser lenta, bloqueando a renderização de tudo conteúdo em uma página. Portanto, subdividir e subdividir a fonte em conjuntos de caracteres ainda é importante. No lado bom, porém, com uma fonte variável no lugar, teremos exatamente um refluxo por padrão, de modo que nenhum JavaScript será necessário para agrupar repaint.

Agora, o que faria um estratégia de carregamento de fonte da web à prova de balas então? Subconjunto de fontes e prepare-as para a renderização de 2 estágios, declare-as com um descritor de exibição de fonte, use a API Font Loading para agrupar repaint e armazenar fontes em um cache persistente de service worker. Na primeira visita, injete o pré-carregamento de scripts antes dos scripts externos de bloqueio. Você pode recorrer ao Font Face Observer de Bram Stein, se necessário. E se você estiver interessado em medir o desempenho do carregamento de fontes, Andreas Marschke explora o rastreamento de desempenho com API Font e API UserTiming.

Finalmente, não se esqueça de incluir o intervalo de Unicode para dividir uma fonte grande em fontes menores específicas do idioma e use o combinador de estilo de fonte de Monica Dinculescu para minimizar uma mudança brusca no layout, devido às discrepâncias de tamanho entre o substituto e o fontes da web.

Como alternativa, para emular uma fonte da web para uma fonte substituta, podemos usar os descritores @ font-face para substituir as métricas da fonte (demo, habilitado no Chrome 87). (Observe que os ajustes são complicados com pilhas de fontes complicadas.)

O futuro parece brilhante? Com o enriquecimento de fonte progressivo, eventualmente podemos ser capazes de "baixar apenas a parte necessária da fonte em qualquer página e, para solicitações subsequentes dessa fonte, 'corrigir' dinamicamente o download original com conjuntos adicionais de glifos conforme exigido nas páginas sucessivas visualizações ", como explica Jason Pamental. A demonstração de transferência incremental já está disponível e está em andamento.

Otimizações de construção

  1. Definimos nossas prioridades?
    É uma boa ideia saber com o que você está lidando primeiro. Execute um inventário de todos os seus ativos (JavaScript, imagens, fontes, scripts de terceiros e módulos "caros" na página, como carrosséis, infográficos complexos e conteúdo multimídia) e dividi-los em grupos.

Configure uma planilha. Defina o básico essencial experiência para navegadores legados (ou seja, conteúdo central totalmente acessível), o melhorada experiência para navegadores capazes (ou seja, uma experiência completa e enriquecida) e o extras (ativos que não são absolutamente necessários e podem ser carregados lentamente, como fontes da web, estilos desnecessários, scripts de carrossel, players de vídeo, widgets de mídia social, imagens grandes). Anos atrás, publicamos um artigo sobre "Melhorando o desempenho da Smashing Magazine", que descreve essa abordagem em detalhes.

Ao otimizar o desempenho, precisamos refletir nossas prioridades. Carregue o experiência central imediatamente, então melhorias, e então o extras.

A ideia é compilar e servir dois pacotes separados de JavaScript: o build “regular”, aquele com Babel-transformações e polyfills e os serve apenas para navegadores legados que realmente precisam deles, e outro pacote (mesma funcionalidade) que não tem transformações ou polyfills.

Como resultado, ajudamos a reduzir o bloqueio do thread principal, reduzindo a quantidade de scripts que o navegador precisa processar. Jeremy Wagner publicou um artigo abrangente sobre serviço diferencial e como configurá-lo em seu pipeline de construção, desde a configuração do Babel até os ajustes que você precisará fazer no Webpack, bem como os benefícios de fazer todo esse trabalho.

Os scripts do módulo JavaScript nativo são adiados por padrão, portanto, enquanto a análise de HTML está acontecendo, o navegador fará o download do módulo principal.

Módulos JavaScript nativos são adiados por padrão. Quase tudo sobre módulos nativos de JavaScript. (Visualização grande)

Uma nota de advertência, porém: o padrão de módulo / nomódulo pode sair pela culatra em alguns clientes, então você pode querer considerar uma solução alternativa: o padrão de serviço diferencial menos arriscado de Jeremy que, no entanto, contorna o scanner de pré-carga, o que pode afetar o desempenho de maneiras que você não pode antecipar. (obrigado, Jeremy!)

Na verdade, o Rollup oferece suporte a módulos como formato de saída, portanto, podemos agrupar o código e implantar os módulos na produção. Parcel tem suporte de módulo no Parcel 2. Para Webpack, module-nomodule-plugin automatiza a geração de scripts de módulo / nomodule.

Observação: Vale a pena afirmar que a detecção de recursos por si só não é suficiente para tomar uma decisão informada sobre a carga útil a ser enviada para esse navegador. Por conta própria, não podemos deduzir a capacidade do dispositivo a partir da versão do navegador. Por exemplo, os telefones Android baratos em países em desenvolvimento rodam, em sua maioria, o Chrome e irão cortar a mostarda, apesar de sua memória limitada e recursos de CPU.

Eventualmente, usando o Cabeçalho de dicas do cliente de memória do dispositivo, seremos capazes de direcionar dispositivos de baixo custo de forma mais confiável. No momento da escrita, o cabeçalho é suportado apenas no Blink (vale para dicas do cliente em geral). Como a memória do dispositivo também tem uma API JavaScript que está disponível no Chrome, uma opção pode ser detectar o recurso com base na API e voltar para padrão de módulo / nomódulo se não for compatível (obrigado, Yoav!).

A divisão de código é outro recurso do Webpack que divide sua base de código em "blocos" que são carregados sob demanda. Nem todo o JavaScript precisa ser baixado, analisado e compilado imediatamente. Depois de definir os pontos de divisão em seu código, o Webpack pode cuidar das dependências e dos arquivos de saída. Ele permite que você mantenha o download inicial pequeno e solicite código sob demanda quando solicitado pelo aplicativo. Alexander Kondrov tem uma introdução fantástica à divisão de código com Webpack e React.

Considere o uso do plugin preload-webpack que segue as rotas que você divide em código e, em seguida, solicita ao navegador que as pré-carregue usando & ltlink rel = "preload" & gt ou & ltlink rel = "prefetch" & gt. As diretivas inline do Webpack também fornecem algum controle sobre o pré-carregamento / pré-busca. (No entanto, esteja atento a problemas de priorização.)

Onde definir os pontos de divisão? Rastreando quais pedaços de CSS / JavaScript são usados ​​e quais não são usados. Umar Hansa explica como você pode usar a cobertura de código do Devtools para conseguir isso.

Ao lidar com aplicativos de página única, precisamos de algum tempo para inicializar o aplicativo antes de processar a página. Sua configuração exigirá sua solução personalizada, mas você pode ficar atento aos módulos e técnicas para acelerar o tempo de renderização inicial. Por exemplo, veja como depurar o desempenho do React e eliminar problemas comuns de desempenho do React e como melhorar o desempenho no Angular. Em geral, a maioria dos problemas de desempenho vem desde o momento inicial para inicializar o aplicativo.

Então, qual é a melhor maneira de dividir o código de forma agressiva, mas não muito agressiva? De acordo com Phil Walton, "além da divisão de código por meio de importações dinâmicas, [poderíamos] também usar divisão de código no nível do pacote, onde cada módulo de nó importado é colocado em um bloco com base no nome de seu pacote. "Phil também fornece um tutorial sobre como construí-lo.

Um dos mais interessantes vem do tópico de Ivan Akulov. Imagine que você tem uma função que você chama uma vez, armazena seu resultado em uma variável e, em seguida, não usa essa variável. Abanar a árvore removerá a variável, mas não a função, porque ela pode ser usada de outra forma. No entanto, se a função não for usada em nenhum lugar, você pode querer removê-la. Para fazer isso, anexe a chamada de função com / * # __ PURE __ * / que é compatível com Uglify e Terser & mdash done!

Para remover tal função quando seu resultado não é usado, inclua na chamada de função & # 47 & # 42 & # 35 & # 95 & # 95PURE & # 95 & # 95 & # 42 & # 47. Via Ivan Akulov. (Visualização grande)

Aqui estão algumas das outras ferramentas que Ivan recomenda:

    remove classes não utilizadas, especialmente quando você está usando Bootstrap ou Tailwind.
  • Habilite o optimization.splitChunks: 'all' com o plugin split-chunks. Isso faria com que o webpack dividisse automaticamente o código de seus pacotes de entrada para um melhor armazenamento em cache. . Isso moveria o tempo de execução do webpack para um bloco separado e também melhoraria o cache. baixa arquivos de fontes, para que você possa atendê-los de seu servidor. permite que você gere um service worker com uma configuração de pré-cache para todos os seus ativos webpack. Além disso, verifique Service Worker Packages, um guia abrangente de módulos que podem ser aplicados imediatamente. Ou use o preload-webpack-plugin para gerar o pré-carregamento / pré-busca para todos os blocos de JavaScript. mede a velocidade de compilação de seu webpack, fornecendo insights sobre quais etapas do processo de compilação consomem mais tempo. avisa quando seu pacote contém várias versões do mesmo pacote. no momento da compilação.

    Você pode descarregar JavaScript em um Web Worker?
    Para reduzir o impacto negativo do Time-to-Interactive, pode ser uma boa ideia descarregar JavaScript pesado em um Web Worker.

À medida que a base de código continua crescendo, os gargalos de desempenho da IU vão aparecer, tornando a experiência do usuário mais lenta. Isso ocorre porque as operações DOM são executadas junto com seu JavaScript no thread principal. Com os web workers, podemos mover essas operações caras para um processo em segundo plano que está sendo executado em um thread diferente. Casos de uso típicos para web workers são pré-busca de dados e Progressive Web Apps para carregar e armazenar alguns dados com antecedência para que você possa usá-los mais tarde, quando necessário. E você pode usar o Comlink para agilizar a comunicação entre a página principal e o trabalhador. Ainda temos algum trabalho a fazer, mas estamos chegando lá.

Existem alguns estudos de caso interessantes sobre web workers que mostram diferentes abordagens para mover a estrutura e a lógica do aplicativo para web workers. A conclusão: em geral, ainda existem alguns desafios, mas já existem alguns bons casos de uso (obrigado, Ivan Akulov!).

A partir do Chrome 80, um novo modo para web workers com benefícios de desempenho de módulos JavaScript foram enviados, chamados de trabalhadores de módulo. Podemos alterar o carregamento e a execução do script para corresponder ao tipo de script = "módulo", além de também usar importações dinâmicas para código de carregamento lento sem bloquear a execução do trabalhador.

Como começar? Aqui estão alguns recursos que valem a pena analisar:

  • Surma publicou um excelente guia sobre como executar JavaScript fora do thread principal do navegador e também quando você deve usar Web Workers?
  • Além disso, verifique a palestra de Surma sobre a arquitetura fora da thread principal. por Shubhie Panicker e Jason Miller fornecem uma visão detalhada sobre como usar web workers e quando evitá-los. destaca padrões úteis para trabalhar com Web Workers, maneiras eficazes de se comunicar entre workers, lidar com processamento de dados complexos fora do thread principal e testá-los e depurá-los. permite que você mova um módulo para um Web Worker, refletindo automaticamente as funções exportadas como proxies assíncronos.
  • Se você estiver usando o Webpack, você pode usar o workerize-loader. Alternativamente, você também pode usar o plugin do trabalhador.

Observe que Web Workers não têm acesso ao DOM porque o DOM não é "thread-safe" e o código que eles executam precisa estar contido em um arquivo separado.

Obviamente, o WebAssembly não deve substituir o JavaScript, mas pode complementá-lo nos casos em que você perceber que a CPU está consumindo muito. Para a maioria dos aplicativos da web, JavaScript é um ajuste melhor, e WebAssembly é mais usado para aplicativos da web intensivos em computação, como jogos.

Se você gostaria de saber mais sobre WebAssembly:

  • Lin Clark escreveu uma série completa para WebAssembly e Milica Mihajlija fornece uma visão geral de como executar código nativo no navegador, por que você pode querer fazer isso e o que isso significa para JavaScript e o futuro do desenvolvimento web. destaca um estudo de caso de como cálculos lentos de JavaScript foram substituídos por WebAssembly compilado e trouxeram melhorias significativas de desempenho.
  • Patrick Hamann tem falado sobre o papel crescente do WebAssembly e está desmascarando alguns mitos sobre o WebAssembly, explora seus desafios e podemos usá-lo praticamente em aplicativos hoje.
  • O Google Codelabs fornece uma introdução ao WebAssembly, um curso de 60 minutos no qual você aprenderá como pegar o código nativo em C e compilá-lo para WebAssembly e, em seguida, chamá-lo diretamente do JavaScript.
  • Alex Danilo explicou o WebAssembly e como ele funciona em sua palestra no Google I / O. Além disso, Benedek Gagyi compartilhou um estudo de caso prático sobre WebAssembly, especificamente como a equipe o usa como formato de saída para sua base de código C ++ para iOS, Android e o site.

Ainda não tenho certeza sobre quando usar Web Workers, Web Assembly, streams ou talvez a API WebGL JavaScript para acessar a GPU? Accelerating JavaScript é um guia curto, mas útil, que explica quando usar o quê e por que & mdash também com um fluxograma prático e muitos recursos úteis.

    Servimos código legado apenas para navegadores legados?
    Com o ES2017 sendo notavelmente bem suportado em navegadores modernos, podemos usar o babelEsmPlugin para apenas transpilar recursos ES2017 + não suportados pelos navegadores modernos que você tem como alvo.

Houssein Djirdeh e Jason Miller publicaram recentemente um guia abrangente sobre como transpilar e servir JavaScript moderno e legado, detalhando como fazê-lo funcionar com Webpack e Rollup e as ferramentas necessárias. Você também pode estimar quanto JavaScript pode economizar em seu site ou pacotes de aplicativos.

Módulos JavaScript são suportados em todos os principais navegadores, então use use script type = "module" para permitir que navegadores com suporte a módulo ES carreguem o arquivo, enquanto navegadores mais antigos podem carregar compilações legadas com nomodule de script.

Hoje em dia, podemos escrever JavaScript baseado em módulo que roda nativamente no navegador, sem transpilers ou bundlers. & ltlink rel = "modulepreload" & gt header fornece uma maneira de iniciar o carregamento antecipado (e de alta prioridade) de scripts de módulo. Basicamente, é uma maneira bacana de ajudar a maximizar o uso da largura de banda, informando ao navegador sobre o que ele precisa buscar para que não fique preso a nada para fazer durante aquelas longas viagens de ida e volta. Além disso, Jake Archibald publicou um artigo detalhado com dicas e coisas para manter em mente com os Módulos ES que vale a pena ler.

Primeiro, configure métricas que rastreiam se a proporção de chamadas de código legado está se mantendo constante ou diminuindo, não aumentando. Desencoraje publicamente a equipe de usar a biblioteca e certifique-se de que seu CI alerte os desenvolvedores se for usado em solicitações pull. polyfills pode ajudar na transição de um código legado para uma base de código reescrita que usa recursos padrão do navegador.

Você pode usar o Puppeteer para coletar cobertura de código programaticamente. O Chrome também permite que você exporte resultados de cobertura de código. Como observou Andy Davies, talvez você queira coletar cobertura de código para navegadores modernos e legados.

Existem muitos outros casos de uso e ferramentas para o Puppetter que podem precisar de um pouco mais de exposição:

    , como, por exemplo, comparação visual automática ou monitoramento de CSS não utilizado com cada construção,,,
  • Além disso, você pode até gravar testes diretamente no DevTools, de Nitay Neeman, com exemplos e casos de uso.

Além disso, purgecss, UnCSS e Helium podem ajudá-lo a remover estilos não utilizados de CSS. E se você não tiver certeza se um trecho de código suspeito é usado em algum lugar, você pode seguir o conselho de Harry Roberts: crie um GIF transparente de 1 & times1px para uma classe específica e coloque-o em um diretório morto /, por exemplo, /assets/img/dead/comments.gif.

Depois disso, você define essa imagem específica como plano de fundo no seletor correspondente em seu CSS, recoste-se e espere alguns meses se o arquivo vai aparecer em seus logs. Se não houver entradas, ninguém teve aquele componente legado renderizado em sua tela: você provavelmente pode ir em frente e deletar tudo.

Para o Me sinto aventureiroVocê pode até automatizar a coleta de CSS não utilizado por meio de um conjunto de páginas, monitorando DevTools usando DevTools.

Verifique e reveja o polyfills que você está enviando para navegadores legados e modernos, e seja mais estratégico sobre eles. Dê uma olhada em polyfill.io, que é um serviço que aceita uma solicitação de um conjunto de recursos do navegador e retorna apenas os polyfills necessários ao navegador solicitante.

Adicionar auditoria de pacote em seu fluxo de trabalho regular também. Pode haver algumas alternativas leves para bibliotecas pesadas que você adicionou anos atrás, por exemplo, Moment.js (agora descontinuado) pode ser substituído por:

    , com uma API e padrões Moment.js familiares ou.
  • Você também pode usar o Skypack Discover, que combina recomendações de pacotes revisadas por humanos com uma pesquisa focada na qualidade.

A pesquisa de Benedikt Rötsch mostrou que uma mudança de Moment.js para date-fns poderia reduzir cerca de 300 ms para o First paint em 3G e um telefone móvel de baixo custo.

Para auditoria de bundle, Bundlephobia pode ajudar a encontrar o custo de adicionar um pacote npm ao seu bundle. size-limit estende a verificação básica do tamanho do pacote com detalhes sobre o tempo de execução do JavaScript. Você pode até integrar esses custos com uma auditoria personalizada do Lighthouse. Isso também se aplica a frameworks. Ao remover ou aparar o adaptador Vue MDC (componentes de materiais para Vue), os estilos caem de 194 KB para 10 KB.

Existem muitas outras ferramentas para ajudá-lo a tomar uma decisão informada sobre o impacto de suas dependências e alternativas viáveis:

Como alternativa para enviar todo o framework, você pode cortar seu framework e compilá-lo em um pacote de JavaScript bruto que não requer código adicional. Svelte faz isso, assim como o plugin Rawact Babel, que transpila os componentes React.js para operações DOM nativas em tempo de construção. Por quê? Bem, como explicam os mantenedores, "react-dom inclui código para cada componente / elemento HTMLE que pode ser renderizado, incluindo código para renderização incremental, programação, manipulação de eventos, etc. Mas existem aplicativos que não precisam de todos esses recursos (no início carregamento de página). Para tais aplicativos, pode fazer sentido usar operações DOM nativas para construir a interface de usuário interativa. "

Na matéria "O caso da hidratação parcial (com Next e Preact)", Lukas Bombach explica como a equipe do Welt.de, um dos veículos de notícias da Alemanha, conseguiu melhor desempenho com a hidratação parcial. Você também pode verificar o repositório GitHub de próximo super-desempenho com explicações e trechos de código.

Você também pode considerar opções alternativas:

Jason Miller publicou demos de trabalho sobre como a hidratação progressiva pode ser implementada com React, para que você possa usá-los imediatamente: demo 1, demo 2, demo 3 (também disponível no GitHub). Além disso, você pode consultar a biblioteca de componentes pré-renderizados do Reagente.

Como resultado, aqui está uma estratégia de SPA que Jeremy sugere usar para o framework React (mas não deve mudar significativamente para outros frameworks):

  • Refatorar componentes com estado como componentes sem estado quando possível.
  • Prerender componentes sem estado quando possível para minimizar o tempo de resposta do servidor. Renderize apenas no servidor.
  • Para componentes com monitoração de estado com interatividade simples, considere pré-renderizar ou renderizar pelo servidor esse componente e substituir sua interatividade por ouvintes de eventos independentes de estrutura.
  • Se você deve hidratar componentes com estado no cliente, use hidratação preguiçosa na visibilidade ou interação.
  • Para componentes hidratados lentamente, programe sua hidratação durante o tempo ocioso do segmento principal com requestIdleCallback.

Existem algumas outras estratégias que você pode querer seguir ou revisar:

  • Considerações de desempenho para CSS-in-JS em aplicativos React carregando polyfills apenas quando necessário, usando importações dinâmicas e hidratação lenta. , uma longa série de 7 partes sobre como melhorar os desafios da interface do usuário com o React e como criar o perfil dos aplicativos React. , uma palestra fantástica de Alex Holachek, junto com slides e repositório GitHub (obrigado pela dica, Addy!) é um repositório GitHub fantástico com muitas otimizações relacionadas ao desempenho específicas do Webpack úteis. Mantido por Ivan Akulov. , um guia de Ivan Akulov sobre como melhorar o desempenho no React, com muitas dicas úteis para tornar o aplicativo cerca de 30% mais rápido. (experimental) permite o recarregamento a quente que preserva o estado do componente e oferece suporte a ganchos e componentes de função.
  • Cuidado com os componentes do React Server de tamanho zero, um novo tipo de componente proposto que não terá impacto no tamanho do pacote. O projeto está atualmente em desenvolvimento, mas qualquer feedback da comunidade é muito apreciado (grande explicador por Sophie Alpert).

Conseqüentemente, cada elemento interativo está recebendo uma pontuação de probabilidade para engajamento e, com base nessa pontuação, um script do lado do cliente decide pré-buscar um recurso com antecedência. Você pode integrar a técnica ao seu aplicativo Next.js, Angular e React, e há um plugin Webpack que também automatiza o processo de configuração.

Obviamente, você pode estar solicitando que o navegador consuma dados desnecessários e faça uma pré-busca de páginas indesejáveis, então é uma boa ideia ser bastante conservador no número de solicitações pré-buscadas. Um bom caso de uso seria a pré-busca de scripts de validação exigidos no check-out ou a pré-busca especulativa quando uma frase de chamariz crítica entra na janela de visualização.

Precisa de algo menos sofisticado? DNStradamus faz a pré-busca de DNS para links externos conforme eles aparecem na janela de visualização. Quicklink, InstantClick e Instant.page são pequenas bibliotecas que pré-buscar links automaticamente na janela de visualização durante o tempo ocioso, na tentativa de fazer com que as navegações da próxima página carreguem mais rápido. O Quicklink permite a pré-busca das rotas do React Router e do Javascript, além de levar em consideração os dados, por isso não faz a pré-busca em 2G ou se a Economia de dados estiver ativada. Assim como Instant.page se o modo estiver configurado para usar pré-busca da janela de visualização (que é um padrão).

Se você deseja estudar a ciência da pré-busca preditiva em todos os detalhes, Divya Tagtachian tem uma ótima palestra sobre A arte da pré-busca preditiva, cobrindo todas as opções do início ao fim.

O streaming de script permite que os scripts assíncronos ou deferir sejam analisados ​​em um thread de segundo plano separado assim que o download começar, portanto, em alguns casos, melhorando o tempo de carregamento da página em até 10%. Praticamente, use & ltscript defer & gt no & lthead & gt, para que os navegadores possam descobrir o recurso antecipadamente e, em seguida, analisá-lo no encadeamento em segundo plano.

Embargo: O Opera Mini não suporta adiamento de script, então, se você estiver desenvolvendo para a Índia ou África, adiar será ignorado, resultando no bloqueio da renderização até que o script seja avaliado (obrigado Jeremy!).

Você também pode se conectar ao cache de código do V8, separando as bibliotecas do código que as usa ou, ao contrário, mesclar as bibliotecas e seus usos em um único script, agrupar pequenos arquivos e evitar scripts embutidos. Ou talvez até use o cache de compilação v8.

Quando se trata de JavaScript em geral, também existem algumas práticas que vale a pena ter em mente:

    , uma grande coleção de padrões para escrever código legível, reutilizável e refatorável.
  • Você pode compactar dados de JavaScript com a API CompressionStream, por exemplo para fazer o gzip antes de enviar dados (Chrome 80+). e Corrigindo vazamentos de memória em aplicativos da web são guias detalhados sobre como encontrar e corrigir vazamentos de memória JavaScript complicados. Além disso, você pode usar queryObjects (SomeConstructor) do DevTools Console (obrigado, Mathias!) , e evitá-los pode ajudar a reduzir o tamanho do pacote significativamente.
  • Podemos melhorar o desempenho de rolagem com ouvintes de eventos passivos definindo um sinalizador no parâmetro de opções. Assim, os navegadores podem rolar a página imediatamente, em vez de depois que o ouvinte terminar. (via Kayce Basques).
  • Se você tiver qualquer ouvinte scroll ou touch *, passive: true para addEventListener. Isso informa ao navegador que você não está planejando chamar event.preventDefault () dentro, para que possa otimizar a maneira como trata esses eventos. (via Ivan Akulov)
  • Podemos obter um melhor agendamento de JavaScript com isInputPending (), uma nova API que tenta preencher a lacuna entre o carregamento e a capacidade de resposta com os conceitos de interrupções para entradas do usuário na web, e permite que o JavaScript seja capaz de verificar a entrada sem ceder a o navegador.
  • Você também pode remover automaticamente um ouvinte de evento após sua execução.
  • O Warp lançado recentemente do Firefox, uma atualização significativa para SpiderMonkey (lançado no Firefox 83), Baseline Interpreter e há algumas estratégias de otimização JIT disponíveis também.

Por razões de segurança, para evitar impressões digitais, os navegadores implementaram o cache particionado que foi introduzido no Safari em 2013 e no Chrome no ano passado. Portanto, se dois sites apontam para o mesmo URL de recurso de terceiros, o código é baixado uma vez por domínio, e o cache é "colocado em sandbox" para esse domínio devido a implicações de privacidade (obrigado, David Calhoun!) Portanto, o uso de um CDN público não levará automaticamente a um melhor desempenho.

Atualmente, 57% de todo o tempo de execução do código JavaScript é gasto em código de terceiros. O site para celular mediano acessa 12 domínios de terceiros, com uma mediana de 37 solicitações diferentes (ou cerca de 3 solicitações feitas a cada terceiro).

Além disso, esses terceiros costumam convidar scripts de quarta parte para se juntar, terminando com um enorme gargalo de desempenho, às vezes indo tão longe quanto os scripts de oitava parte em uma página. Portanto, auditar regularmente suas dependências e gerenciadores de tags pode trazer surpresas caras.

Outro problema, como Yoav Weiss explicou em sua palestra sobre scripts de terceiros, é que em muitos casos esses scripts baixam recursos que são dinâmicos. Os recursos mudam entre os carregamentos de página, então não sabemos necessariamente de quais hosts os recursos serão baixados e de quais recursos eles seriam.

Adiar, como mostrado acima, pode ser apenas um começo, pois os scripts de terceiros também roubam largura de banda e tempo de CPU do seu aplicativo. Poderíamos ser um pouco mais agressivos e carregá-los somente quando nosso aplicativo for inicializado.

Em uma postagem fantástica sobre "Reduzindo o impacto da velocidade do site de tags de terceiros", Andy Davies explora uma estratégia de minimizar a pegada de terceiros - desde a identificação de seus custos até a redução de seu impacto.

De acordo com Andy, há duas maneiras pelas quais as tags afetam a velocidade do site e pelo qual competem largura de banda da rede e tempo de processamento nos dispositivos dos visitantes e, dependendo de como eles são implementados, eles também podem atrasar a análise de HTML. Portanto, a primeira etapa é identificar o impacto que terceiros têm, testando o site com e sem scripts usando WebPageTest. Com o mapa de solicitação de Simon Hearne, também podemos visualizar terceiros em uma página, juntamente com detalhes sobre seu tamanho, tipo e o que acionou seu carregamento.

De preferência, faça o self-host e use um único nome de host, mas também use um mapa de solicitação para expor chamadas de quarta parte e detectar quando os scripts mudam. Você pode usar a abordagem de Harry Roberts para auditar terceiros e produzir planilhas como esta (verifique também o fluxo de trabalho de auditoria de Harry).

Depois, podemos explorar alternativas leves para scripts existentes e lentamente substitua as duplicatas e os principais culpados por opções mais leves. Talvez alguns dos scripts possam ser substituídos por seu pixel de rastreamento substituto em vez da tag completa.

Carregando o YouTube com fachadas, por exemplo lite-youtube-embed que é significativamente menor do que um player real do YouTube. (Fonte da imagem) (visualização grande)

Se não for viável, podemos pelo menos carregar lentamente os recursos de terceiros com fachadas, ou seja, um elemento estático que se parece com o terceiro incorporado real, mas não é funcional e, portanto, muito menos oneroso no carregamento da página. O truque, então, é carregue a incorporação real apenas na interação.

Uma das razões pelas quais os gerenciadores de tags geralmente são grandes em tamanho é por causa dos muitos experimentos simultâneos que estão sendo executados ao mesmo tempo, junto com muitos segmentos de usuários, URLs de páginas, sites etc., portanto, de acordo com Andy, reduzi-los pode reduzir ambos o tamanho do download e o tempo que leva para executar o script no navegador.

E então há fragmentos anti-oscilação. Terceiros como Google Optimize, Visual Web Optimizer (VWO) e outros são unânimes em usá-los. Esses trechos são geralmente injetados junto com a execução Testes A / B: para evitar oscilações entre os diferentes cenários de teste, eles ocultam o corpo do documento com opacidade: 0 e, em seguida, adiciona uma função que é chamada após alguns segundos para trazer a opacidade de volta. Isso geralmente resulta em grandes atrasos na renderização devido aos enormes custos de execução do lado do cliente.

Com o teste A / B em uso, os clientes costumavam ver oscilações como esta. Os snippets anti-oscilação evitam isso, mas também têm um custo de desempenho. Via Andy Davies. (Visualização grande)

Portanto, controle a frequência com que o tempo limite de anti-oscilação é acionado e reduza o tempo limite. O padrão bloqueia a exibição de sua página em até 4s, o que arruinará as taxas de conversão. De acordo com Tim Kadlec, "Amigos não permitem que amigos façam testes A / B do lado do cliente". Teste A / B do lado do servidor em CDNs (por exemplo, Edge Computing ou Edge Slice Rerendering) é sempre uma opção de melhor desempenho.

Se você tem que lidar com todo-poderoso Gerenciador de tags do Google, Barry Pollard fornece algumas diretrizes para conter o impacto do Gerenciador de tags do Google. Além disso, Christian Schaefer explora estratégias para carregar anúncios.

Cuidado: alguns widgets de terceiros se escondem das ferramentas de auditoria, então podem ser mais difíceis de detectar e medir. Para testar a resistência de terceiros, examine os resumos ascendentes na página de perfil de desempenho em DevTools, teste o que acontece se uma solicitação for bloqueada ou expirou & mdash para o último, você pode usar o servidor Blackhole do WebPageTest blackhole.webpagetest.org para você pode apontar domínios específicos para em seu arquivo hosts.

Que opções temos então? Considerar usando service workers ao acelerar o download do recurso com um tempo limite e se o recurso não respondeu dentro de um determinado tempo limite, retorne uma resposta vazia para dizer ao navegador para continuar com a análise da página. Você também pode registrar ou bloquear solicitações de terceiros que não são bem-sucedidas ou não atendem a determinados critérios. Se possível, carregue o script de terceiros de seu próprio servidor em vez do servidor do fornecedor e carregue-os lentamente.

Outra opção é estabelecer um Política de segurança de conteúdo (CSP) para restringir o impacto de scripts de terceiros, por exemplo, proibindo o download de áudio ou vídeo. A melhor opção é incorporar scripts via & ltiframe & gt para que os scripts sejam executados no contexto do iframe e, portanto, não tenham acesso ao DOM da página e não possam executar código arbitrário em seu domínio. Iframes podem ser ainda mais restritos usando o atributo sandbox, para que você possa desativar qualquer funcionalidade que o iframe possa fazer, por exemplo, impeça a execução de scripts, impeça alertas, envio de formulário, plug-ins, acesso à navegação superior e assim por diante.

Você também pode manter terceiros sob controle por meio do desempenho no navegador, combinando com as políticas de recursos, um recurso relativamente novo que permite ativar ou desativar determinados recursos do navegador em seu site. (Como nota lateral, também pode ser usado para evitar imagens superdimensionadas e não otimizadas, mídia não dimensionada, scripts de sincronização e outros). Atualmente compatível com navegadores baseados em Blink.

Como muitos scripts de terceiros estão em execução em iframes, você provavelmente precisa restringir totalmente suas permissões. Iframes em sandbox são sempre uma boa ideia, e cada uma das limitações pode ser removida por meio de uma série de valores de permissão no atributo sandbox.O sandboxing é suportado em quase todos os lugares, portanto, restrinja os scripts de terceiros ao mínimo do que eles deveriam ter permissão para fazer.

ThirdPartyWeb.Today agrupa todos os scripts de terceiros por categoria (análise, social, publicidade, hospedagem, gerenciador de tags etc.) e visualiza quanto tempo os scripts da entidade levam para serem executados (em média). (Visualização grande)

Considere o uso de um observador de intersecção que permitiria anúncios a serem iframed enquanto ainda despacha eventos ou obtém as informações de que precisam do DOM (por exemplo, visibilidade do anúncio). Fique atento a novas políticas, como política de recursos, limites de tamanho de recursos e prioridade de CPU / largura de banda para limitar recursos e scripts nocivos da web que tornariam o navegador mais lento, por exemplo, scripts síncronos, solicitações XHR síncronas, document.write e implementações desatualizadas.

Finalmente, ao escolher um serviço de terceiros, considere verificar o ThirdPartyWeb.Today de Patrick Hulce, um serviço que agrupa todos os scripts de terceiros por categoria (análise, social, publicidade, hospedagem, gerenciador de tags etc.) e visualiza quanto tempo os scripts da entidade levam para serem executados (em média). Obviamente, entidades maiores têm o pior impacto de desempenho nas páginas em que estão. Apenas folheando a página, você terá uma ideia da pegada de desempenho que você deve esperar.

Ah, e não se esqueça das suspeitas usuais: em vez de widgets de terceiros para compartilhamento, podemos usar botões de compartilhamento social estáticos (como por SSBG) e links estáticos para mapas interativos em vez de mapas interativos.

Em geral, os recursos devem ser armazenados em cache por um período muito curto (se houver probabilidade de alteração) ou indefinidamente (se forem estáticos) & mdash você pode apenas alterar sua versão na URL quando necessário. Você pode chamá-la de estratégia Cache-Forever, na qual poderíamos retransmitir os cabeçalhos Cache-Control e Expires para o navegador para permitir que os ativos expirem em um ano. Portanto, o navegador nem mesmo faria uma solicitação para o ativo se ele o tivesse no cache.

A exceção são as respostas da API (por exemplo, / api / user). Para evitar o armazenamento em cache, podemos usar private, no store, e não max-age = 0, no-store:

Use Cache-control: imutável para evitar a revalidação de longos períodos de vida explícitos do cache quando os usuários pressionam o botão recarregar. Para o caso de recarregamento, imutável salva solicitações HTTP e melhora o tempo de carregamento do HTML dinâmico, pois eles não competem mais com a multidão de 304 respostas.

Um exemplo típico em que queremos usar imutáveis ​​são os ativos CSS / JavaScript com um hash no nome. Para eles, provavelmente queremos armazenar em cache o maior tempo possível e garantir que nunca sejam revalidados:

De acordo com a pesquisa de Colin Bendell, o imutável reduz os redirecionamentos 304 em cerca de 50%, pois mesmo com a idade máxima em uso, os clientes ainda revalidam e bloqueiam na atualização. É compatível com Firefox, Edge e Safari e o Chrome ainda está debatendo o problema.

De acordo com o Web Almanac, "seu uso cresceu para 3,5% e é amplamente utilizado nas respostas de terceiros do Facebook e do Google".

Cache-Control: Immutable reduz 304s em cerca de 50%, de acordo com a pesquisa de Colin Bendell na Cloudinary. (Visualização grande)

Você se lembra do bom e velho stale-while-revalidate? Quando especificamos o tempo de armazenamento em cache com o cabeçalho de resposta Cache-Control (por exemplo, Cache-Control: max-age = 604800), depois que max-age expirar, o navegador buscará novamente o conteúdo solicitado, fazendo com que a página carregue mais lentamente. Essa desaceleração pode ser evitada com stale-while-revalidate, basicamente, define uma janela de tempo extra durante a qual um cache pode usar um ativo obsoleto, desde que o revalide de forma assíncrona em segundo plano. Assim, ele "esconde" a latência (tanto na rede quanto no servidor) dos clientes.

Em junho e julho de 2019, Chrome e Firefox lançaram suporte de stale-while-revalidate no cabeçalho HTTP Cache-Control, então, como resultado, deve melhorar as latências de carregamento de página subsequentes, pois os ativos obsoletos não estão mais no caminho crítico. Resultado: RTT zero para visualizações repetidas.

Desconfie do cabeçalho de variação, especialmente em relação aos CDNs, e esteja atento às Variantes de Representação HTTP que ajudam a evitar uma viagem de ida e volta adicional para validação sempre que uma nova solicitação difere ligeiramente (mas não significativamente) das solicitações anteriores (obrigado, Guy e Mark!).

Além disso, verifique se você não está enviando cabeçalhos desnecessários (por exemplo, x-powered-by, pragma, compatível com x-ua, expira, X-XSS-Protection e outros) e se você inclui cabeçalhos úteis de segurança e desempenho (como como Content-Security-Policy, X-Content-Type-Options e outros). Por fim, lembre-se do custo de desempenho das solicitações CORS em aplicativos de página única.

Observação: Freqüentemente, presumimos que os ativos em cache são recuperados instantaneamente, mas a pesquisa mostra que a recuperação de um objeto do cache pode levar centenas de milissegundos. Na verdade, de acordo com Simon Hearne, "às vezes a rede pode ser mais rápida do que o cache, e recuperar ativos do cache pode ser caro com um grande número de ativos em cache (não o tamanho do arquivo) e os dispositivos do usuário. Por exemplo: Recuperação média de cache do Chrome OS dobra de

50ms com 5 recursos em cache até

Além disso, frequentemente assumimos que o tamanho do pacote não é um grande problema e os usuários irão baixá-lo uma vez e, em seguida, usar a versão em cache. Ao mesmo tempo, com CI / CD colocamos o código em produção várias vezes ao dia, o cache é invalidado todas as vezes, portanto, ser estratégico em relação ao cache é importante.

Quando se trata de armazenamento em cache, existem muitos recursos que valem a pena ler:

    , um mergulho profundo em tudo o que é armazenado em cache com Harry Roberts. , de Jake Archibald, de Ilya Grigorik, de Jeff Posnick. por Lydia Hallie é uma ótima explicadora sobre CORS, como funciona e como entendê-lo.
  • Falando sobre CORS, aqui está uma pequena atualização sobre a Política de Mesma Origem de Eric Portis.

Otimizações de entrega

  1. Usamos adiar para carregar JavaScript crítico de forma assíncrona?
    Quando o usuário solicita uma página, o navegador busca o HTML e constrói o DOM, a seguir busca o CSS e constrói o CSSOM e, a seguir, gera uma árvore de renderização combinando o DOM e o CSSOM. Se algum JavaScript precisar ser resolvido, o navegador não vai começar a renderizar a página até que seja resolvido, atrasando assim a renderização. Como desenvolvedores, temos que dizer explicitamente ao navegador para não esperar e começar a renderizar a página. A maneira de fazer isso para scripts é com os atributos defer e async em HTML.

Na prática, é melhor usar adiar em vez de assíncrono. Ah qual é o diferença novamente? De acordo com Steve Souders, assim que os scripts assíncronos chegam, eles são executados imediatamente & mdash assim que o script estiver pronto. Se isso acontecer muito rápido, por exemplo, quando o script já está no cache, ele pode bloquear o analisador HTML. Com o adiamento, o navegador não executa scripts até que o HTML seja analisado. Portanto, a menos que você precise que o JavaScript seja executado antes de iniciar a renderização, é melhor usar o adiamento. Além disso, vários arquivos assíncronos serão executados em uma ordem não determinística.

É importante notar que existem alguns equívocos sobre assíncrono e adiar. Mais importante ainda, async não significa que o código será executado sempre que o script estiver pronto, significa que ele será executado sempre que os scripts estiverem prontos e todo o trabalho de sincronização anterior está concluído. Nas palavras de Harry Roberts, "Se você colocar um script assíncrono após os scripts de sincronização, seu script assíncrono será tão rápido quanto o script de sincronização mais lento."

Além disso, não é recomendado usar async e defer. Os navegadores modernos oferecem suporte a ambos, mas sempre que ambos os atributos forem usados, o async sempre vencerá.

Se você quiser se aprofundar em mais detalhes, Milica Mihajlija escreveu um guia muito detalhado sobre como construir o DOM mais rápido, detalhando a análise especulativa, async e defer.

Esse limite depende de algumas coisas, desde o tipo de recurso de imagem que está sendo buscado até o tipo de conexão efetiva. Mas experimentos conduzidos usando o Chrome no Android sugerem que no 4G, 97,5% das imagens abaixo da dobra que são carregadas lentamente foram totalmente carregadas em 10ms após se tornarem visíveis, então deve ser seguro.

Também podemos usar o atributo de importância (alta ou baixa) em um elemento & ltscript & gt, & ltimg & gt ou & ltlink & gt (somente piscar). Na verdade, é uma ótima maneira de despriorizar imagens em carrosséis, bem como priorizar novamente os scripts. No entanto, às vezes podemos precisar de um controle um pouco mais granular.

A maneira com melhor desempenho de fazer um carregamento lento um pouco mais sofisticado é usando a API Intersection Observer, que fornece uma maneira de observar as mudanças de forma assíncrona na interseção de um elemento de destino com um elemento ancestral ou com a janela de visualização de um documento de nível superior. Basicamente, você precisa criar um novo objeto IntersectionObserver, que recebe uma função de retorno de chamada e um conjunto de opções. Em seguida, adicionamos um alvo para observar.

A função de retorno de chamada é executada quando o alvo torna-se visível ou invisível, então quando ele intercepta a janela de visualização, você pode começar a realizar algumas ações antes que o elemento se torne visível. Na verdade, temos um controle granular sobre quando o retorno de chamada do observador deve ser invocado, com rootMargin (margem em torno da raiz) e limiar (um único número ou uma matriz de números que indicam qual a porcentagem da visibilidade do alvo que estamos visando).

Alejandro Garcia Anglada publicou um tutorial útil sobre como realmente implementá-lo, Rahul Nanwani escreveu uma postagem detalhada sobre imagens de primeiro e segundo planos com carregamento lento e os Fundamentos do Google fornecem um tutorial detalhado sobre imagens e vídeos de carregamento lento com o Intersection Observer também.

Lembra da narrativa dirigida por arte em longas leituras com objetos em movimento e pegajosos? Você também pode implementar scrollytelling de desempenho com o Intersection Observer.

Verifique novamente o que mais você poderia carregar lentamente. Até strings de tradução de carregamento lento e emoji podem ajudar. Ao fazer isso, o Mobile Twitter conseguiu alcançar uma execução de JavaScript 80% mais rápida a partir do novo pipeline de internacionalização.

Uma palavra rápida de cautela: é importante notar que o carregamento lento deve ser uma exceção, e não a regra. Provavelmente não é razoável carregar lentamente qualquer coisa que você realmente deseja que as pessoas vejam rapidamente, por exemplo, imagens da página do produto, imagens do herói ou um script necessário para que a navegação principal se torne interativa.

As opiniões diferem se essas técnicas melhoram ou não a experiência do usuário, mas definitivamente melhora o tempo para a Primeira Pintura com Conteúdo. Podemos até automatizá-lo usando SQIP, que cria uma versão de baixa qualidade de uma imagem como um espaço reservado para SVG, ou espaços reservados para imagens de gradiente com gradientes lineares CSS.

Esses marcadores de posição podem ser incorporados ao HTML, pois são naturalmente bem compactados com métodos de compactação de texto. Em seu artigo, Dean Hume descreveu como essa técnica pode ser implementada usando o Intersection Observer.

Cair pra trás? Se o navegador não suportar o observador de interseção, ainda podemos carregar lentamente um polyfill ou carregar as imagens imediatamente. E há até uma biblioteca para isso.

Quer ficar mais sofisticado? Você pode rastrear suas imagens e usar formas e arestas primitivas para criar um espaço reservado SVG leve, carregá-lo primeiro e, em seguida, fazer a transição da imagem vetorial de espaço reservado para a imagem bitmap (carregada).

Por exemplo, você pode pular a renderização do rodapé e das últimas seções no carregamento inicial:

Observe que visibilidade do conteúdo: auto se comporta como overflow: hidden, mas você pode corrigi-lo aplicando padding-left e padding-right em vez do padrão margin-left: auto, margin-right: auto e uma largura declarada. O preenchimento basicamente permite que os elementos excedam a caixa de conteúdo e entrem na caixa de preenchimento sem deixar o modelo de caixa como um todo e serem cortados.

Além disso, lembre-se de que você pode introduzir algum CLS quando um novo conteúdo for renderizado, por isso é uma boa ideia usar contain-intrinsic-size com um marcador de posição de tamanho adequado (obrigado, Una!).

Thijs Terluin tem muito mais detalhes sobre as propriedades e como o tamanho do container intrínseco é calculado pelo navegador, Malte Ubl mostra como você pode calculá-lo e um breve explicador em vídeo de Jake e Surma explica como tudo funciona.

E se você precisa ficar um pouco mais granular, com CSS Containment, você pode pular manualmente o layout, estilo e trabalho de pintura para descendentes de um nó DOM se você precisar apenas de tamanho, alinhamento ou estilos computados em outros elementos & mdash ou o elemento está atualmente fora da tela.

Como alternativa, para imagens fora da tela, podemos exibir um espaço reservado primeiro e, quando a imagem estiver na janela de visualização, usando IntersectionObserver, acionar uma chamada de rede para que a imagem seja baixada em segundo plano. Além disso, podemos adiar a renderização até a decodificação com img.decode () ou baixar a imagem se a API de decodificação de imagem não estiver disponível.

Se você for além disso, o navegador precisará de viagens de ida e volta adicionais para buscar mais estilos. CriticalCSS e Critical permitem que você produza CSS crítico para cada template que você está usando. Porém, em nossa experiência, nenhum sistema automático foi melhor do que a coleta manual de CSS essencial para cada modelo e, de fato, essa é a abordagem para a qual voltamos recentemente.

Você pode então embutir CSS crítico e carregar lentamente o resto com o plugin critters Webpack. Se possível, considere usar a abordagem inlining condicional usada pelo Filament Group ou converta o código inline em ativos estáticos imediatamente.

Se você atualmente carregue seu CSS completo de forma assíncrona com bibliotecas como loadCSS, não é realmente necessário. Com media = "print", você pode induzir o navegador a buscar o CSS de forma assíncrona, mas aplicando-o ao ambiente de tela assim que ele for carregado. (obrigado, Scott!)

Ao coletar todos os CSS essenciais para cada modelo, é comum explorar a área "acima da dobra" sozinha. No entanto, para layouts complexos, pode ser uma boa ideia incluir a base do layout também para evite recálculos massivos e custos de repintura, prejudicando a pontuação do Core Web Vitals.

E se um usuário obtiver um URL com um link direto para o meio da página, mas o CSS ainda não foi baixado? Nesse caso, tornou-se comum ocultar conteúdo não crítico, por ex. com opacidade: 0 em CSS embutido e opacidade: 1 em arquivo CSS completo e exibi-lo quando CSS estiver disponível. Tem um grande desvantagem entretanto, como os usuários em conexões lentas podem nunca ser capazes de ler o conteúdo da página. É por isso que é melhor sempre manter o conteúdo visível, mesmo que ele possa não ter o estilo adequado.

Colocar CSS crítico (e outros ativos importantes) em um arquivo separado no domínio raiz traz benefícios, às vezes até mais do que inlining, devido ao cache. O Chrome abre especulativamente uma segunda conexão HTTP com o domínio raiz ao solicitar a página, o que elimina a necessidade de uma conexão TCP para buscar este CSS. Isso significa que você pode criar um conjunto de críticoArquivos -CSS (por exemplo critico-homepage.css, critical-product-page.css etc.) e exibi-los a partir de sua raiz, sem precisar colocá-los em linha. (obrigado, Philip!)

Uma palavra de cautela: com HTTP / 2, CSS crítico pode ser armazenado em um arquivo CSS separado e entregue por push de servidor sem inchar o HTML. O problema é que o push do servidor era problemático com muitas pegadinhas e condições de corrida entre os navegadores. Nunca foi suportado de forma consistente e teve alguns problemas de cache (consulte o slide 114 em diante da apresentação de Hooman Beheshti).

O efeito pode, na verdade, ser negativo e inchar os buffers da rede, impedindo que quadros genuínos no documento sejam entregues. Portanto, não foi muito surpreendente que, por enquanto, o Chrome esteja planejando remover o suporte para Server Push.

Além disso, evite colocar & ltlink rel = "stylesheet" / & gt antes dos snippets assíncronos. Se os scripts não dependem de folhas de estilo, considere colocar os scripts de bloqueio acima dos estilos de bloqueio. Se isso acontecer, divida o JavaScript em dois e carregue-o em qualquer um dos lados do seu CSS.

Scott Jehl resolveu outro problema interessante armazenando em cache um arquivo CSS embutido com um service worker, um problema comum familiar se você estiver usando CSS crítico. Basicamente, adicionamos um atributo de ID ao elemento de estilo para que seja fácil encontrá-lo usando JavaScript, então um pequeno pedaço de JavaScript encontra esse CSS e usa a API de cache para armazená-lo em um cache de navegador local (com um tipo de conteúdo de texto / css) para uso nas páginas subsequentes. Para evitar o inlining nas páginas subsequentes e, em vez disso, fazer referência aos ativos armazenados em cache externamente, definimos um cookie na primeira visita a um site. Voilà!

É importante notar que o estilo dinâmico pode ser caro também, mas geralmente apenas nos casos em que você depende de centenas de componentes compostos renderizados simultaneamente. Portanto, se você estiver usando CSS-in-JS, certifique-se de que sua biblioteca CSS-in-JS otimize a execução quando seu CSS não tiver dependências de tema ou adereços, e não sobrescreva componentes estilizados. Aggelos Arvanitakis compartilha mais percepções sobre os custos de desempenho do CSS-in-JS.

Poderíamos criar um fluxo de várias fontes. Por exemplo, em vez de servir um shell de IU vazio e permitir que o JavaScript o preencha, você pode permitir que o service worker construir um riacho onde o shell vem de um cache, mas o corpo vem da rede. Como Jeff Posnick observou, se seu aplicativo da web for alimentado por um CMS que renderiza HTML por servidor juntando modelos parciais, esse modelo se traduz diretamente no uso de respostas de streaming, com a lógica de modelos replicada no service worker em vez de em seu servidor. O artigo de Jake Archibald, O ano dos fluxos da web, destaca como exatamente você pode construí-lo. O aumento de desempenho é bastante perceptível.

Uma vantagem importante do streaming de toda a resposta HTML é que o HTML renderizado durante a solicitação de navegação inicial pode aproveitar ao máximo o analisador de HTML de streaming do navegador. Pedaços de HTML que são inseridos em um documento após o carregamento da página (como é comum com conteúdo preenchido via JavaScript) não podem tirar proveito dessa otimização.

Suporte para navegador? Ainda chegando lá com suporte parcial no Chrome, Firefox, Safari e Edge suportando a API e Service Workers sendo suportados em todos os navegadores modernos. E se você se sentir aventureiro novamente, pode verificar uma implementação experimental de solicitações de streaming, que permite começar a enviar a solicitação enquanto ainda gera o corpo. Disponível no Chrome 85.

Na verdade, você pode reescrever solicitações de imagens de alto DPI para imagens de baixo DPI, remover fontes da web, efeitos extravagantes de paralaxe, visualizar miniaturas e rolagem infinita, desligar a reprodução automática de vídeo, empurrar o servidor, reduzir o número de itens exibidos e rebaixar a qualidade da imagem ou até mesmo mude a forma como você entrega a marcação. Tim Vereecke publicou um artigo muito detalhado sobre estratégias de data-s (h) aver apresentando muitas opções para salvar dados.

Quem está usando save-data, você deve estar se perguntando? 18% dos usuários globais do Android Chrome têm o Modo Lite habilitado (com Salvar Dados ativado), e o número provavelmente será maior.De acordo com a pesquisa de Simon Hearne, a taxa de adesão é mais alta em dispositivos mais baratos, mas há muitos outliers. Por exemplo: os usuários no Canadá têm uma taxa de aceitação de mais de 34% (em comparação com

7% nos EUA) e os usuários do carro-chefe da Samsung mais recente têm uma taxa de adesão de quase 18% globalmente.

Com o modo Salvar dados ativado, o Chrome Mobile fornecerá uma experiência otimizada, ou seja, um experiência da web com proxy com scripts adiados, exibição de fonte forçada: troca e carregamento lento forçado. É apenas mais sensato construir a experiência por conta própria, em vez de depender do navegador para fazer essas otimizações.

Atualmente, o cabeçalho é compatível apenas com Chromium, na versão Android do Chrome ou por meio da extensão Economia de dados em um dispositivo desktop. Por fim, você também pode usar a API de informações de rede para fornecer módulos JavaScript caros, imagens de alta resolução e vídeos com base no tipo de rede. Network Information API e especificamente navigator.connection.effectiveType usam RTT, downlink, valores effectiveType (e alguns outros) para fornecer uma representação da conexão e dos dados que os usuários podem manipular.

Nesse contexto, Max Böck fala de componentes com reconhecimento de conexão e Addy Osmani fala de serviço de módulo adaptável. Por exemplo, com o React, poderíamos escrever um componente que renderiza de forma diferente para diferentes tipos de conexão. Como Max sugeriu, um componente & ltMedia / & gt em um artigo de notícias pode gerar:

  • Off-line: um marcador de posição com texto alternativo,
  • Modo 2G / salvar dados: uma imagem de baixa resolução,
  • 3G em tela não Retina: uma imagem de resolução média,
  • 3G em telas Retina: imagem Retina de alta resolução,
  • 4G: um vídeo HD.

Dean Hume fornece uma implementação prática de uma lógica semelhante usando um trabalhador de serviço. Para um vídeo, poderíamos exibir um pôster de vídeo por padrão e, em seguida, exibir o ícone "Reproduzir", bem como o shell do player de vídeo, metadados do vídeo etc. em melhores conexões. Como alternativa para navegadores não compatíveis, poderíamos ouvir o evento canplaythrough e usar Promise.race () para expirar o carregamento da fonte se o evento canplaythrough não disparar em 2 segundos.

Se você quiser se aprofundar um pouco mais, aqui estão alguns recursos para começar:

  • Addy Osmani mostra como implementar o serviço adaptativo no React. fornece trechos de código para React,
  • Netanel Basel explora componentes de reconhecimento de conexão no Angular,
  • Theodore Vorilas compartilha como funciona o Serving Adaptive Components usando a Network Information API no Vue.
  • Umar Hansa mostra como baixar / executar seletivamente JavaScript caro.

Bônus: Umar Hansa mostra como adiar scripts caros com importações dinâmicas para mudar a experiência com base na memória do dispositivo, conectividade de rede e simultaneidade de hardware.

Lembre-se de pré-renderização? A dica de recurso usada para solicitar que o navegador crie a página inteira em segundo plano para a próxima navegação. Os problemas de implementação foram bastante problemáticos, variando de uma grande pegada de memória e uso de largura de banda a vários acessos de análise registrados e impressões de anúncios.

Previsivelmente, ele foi descontinuado, mas a equipe do Chrome o trouxe de volta como mecanismo de pré-busca NoState. Na verdade, o Chrome trata a dica de pré-renderização como uma pré-busca NoState, então ainda podemos usá-la hoje. Como Katie Hempenius explica nesse artigo, "como pré-renderização, NoState Prefetch busca recursos com antecedência mas ao contrário da pré-renderização, não executa JavaScript ou renderizar qualquer parte da página com antecedência. "

NoState Prefetch usa apenas

45 MiB de memória e sub-recursos que são buscados serão buscados com uma Prioridade de Rede IDLE. Desde o Chrome 69, NoState Prefetch adiciona o cabeçalho Objetivo: Pré-busca a todos os pedidos para os distinguir da navegação normal.

Além disso, esteja atento para alternativas de pré-renderização e portais, um novo esforço em direção à pré-renderização com atenção à privacidade, que fornecerá a visualização de inserção do conteúdo para navegações contínuas.

Usar dicas de recursos é provavelmente a maneira mais fácil de impulsionar o desempenho, e realmente funciona bem. Quando usar o quê? Como Addy Osmani explicou, é razoável pré-carregar recursos que sabemos que provavelmente serão usados ​​na página atual e para navegações futuras em vários limites de navegação, por exemplo, Pacotes da Web necessários para páginas que o usuário ainda não visitou.

O artigo de Addy sobre "Carregando prioridades no Chrome" mostra como exatamente O Chrome interpreta dicas de recursos, então, depois de decidir quais ativos são essenciais para renderização, você pode atribuir alta prioridade a eles. Para ver como suas solicitações são priorizadas, você pode habilitar uma coluna "prioridade" na tabela de solicitações de rede do Chrome DevTools (assim como no Safari).

Na maioria das vezes, hoje em dia, usaremos pelo menos pré-conectar e pré-buscar dns, e seremos cautelosos ao usar pré-busca, pré-carregamento e pré-renderização. Observe que mesmo com a pré-conexão e a pré-busca de dns, o navegador tem um limite no número de hosts que irá procurar / conectar em paralelo, por isso é uma aposta segura ordená-los com base na prioridade (obrigado Philip Tellis!).

Desde fontes geralmente são ativos importantes em uma página, às vezes é uma boa ideia solicitar que o navegador faça o download de fontes críticas com pré-carregamento. No entanto, verifique se isso realmente ajuda no desempenho, pois há um quebra-cabeça de prioridades ao pré-carregar fontes: como o pré-carregamento é visto como de alta importância, ele pode ultrapassar recursos ainda mais críticos, como CSS crítico. (obrigado, Barry!)

Como & ltlink rel = "preload" & gt aceita um atributo de mídia, você pode escolher baixar recursos seletivamente com base nas regras de consulta @media, conforme mostrado acima.

Além disso, podemos usar os atributos imagesrcset e imagesizes para pré-carregar imagens hero descobertas mais tarde com mais rapidez ou quaisquer imagens carregadas via JavaScript, por exemplo, pôsteres de filmes:

Nós também podemos pré-carregar o JSON Como buscar, então ele é descoberto antes que o JavaScript o solicite:

Também poderíamos carregar o JavaScript dinamicamente, de forma eficaz para a execução lenta do script.

Algumas dicas a serem lembradas: o pré-carregamento é bom para mover o tempo de início do download de um ativo para mais perto da solicitação inicial, mas os ativos pré-carregados param no cache de memória que está vinculado à página que faz a solicitação. O pré-carregamento funciona bem com o cache HTTP: uma solicitação de rede nunca é enviada se o item já estiver lá no cache HTTP.

Portanto, é útil para recursos descobertos posteriormente, imagens hero carregadas via imagem de fundo, CSS crítico embutido (ou JavaScript) e pré-carregar o resto do CSS (ou JavaScript).

Pré-carregue imagens importantes com antecedência, sem precisar esperar que o JavaScript as descubra. (Crédito da imagem: “Preload Late-Discovered Hero Images Faster” por Addy Osmani) (Visualização grande)

Uma tag de pré-carregamento pode iniciar um pré-carregamento somente depois que o navegador receber o HTML do servidor e o analisador lookahead tiver encontrado a tag de pré-carregamento. O pré-carregamento por meio do cabeçalho HTTP pode ser um pouco mais rápido, já que não devemos esperar que o navegador analise o HTML para iniciar a solicitação (embora seja debatido).

As dicas iniciais ajudarão ainda mais, permitindo que o pré-carregamento seja iniciado antes mesmo que os cabeçalhos de resposta para o HTML sejam enviados (no roteiro do Chromium, Firefox). Além disso, as dicas de prioridade nos ajudarão a indicar as prioridades de carregamento dos scripts.

Cuidado: se você estiver usando pré-carregamento, como deve ser definido ou nada carrega, mais as fontes pré-carregadas sem o atributo crossorigin farão uma busca dupla. Se você estiver usando a pré-busca, tome cuidado com os problemas do cabeçalho Age no Firefox.

Conforme sugerido por Phil Walton, com os service workers, podemos enviar cargas HTML menores gerando programaticamente nossas respostas. Um service worker pode solicitar apenas o mínimo de dados de que precisa do servidor (por exemplo, uma parcial de conteúdo HTML, um arquivo Markdown, dados JSON, etc.) e, em seguida, pode transformar programaticamente esses dados em um documento HTML completo. Portanto, quando um usuário visita um site e o service worker é instalado, o usuário nunca mais solicitará uma página HTML completa novamente. O impacto no desempenho pode ser bastante impressionante.

Suporte para navegador? Trabalhadores de serviço são amplamente suportados e o fallback é a rede de qualquer maneira. Faz isso ajuda a aumentar o desempenho? Oh sim, é verdade. E está ficando melhor, por exemplo, com Background Fetch permitindo uploads / downloads em segundo plano por meio de um service worker.

Existem vários casos de uso para um service worker. Por exemplo, você pode implementar o recurso "Salvar para offline", lidar com imagens quebradas, introduzir mensagens entre as guias ou fornecer diferentes estratégias de armazenamento em cache com base nos tipos de solicitação. Em geral, uma estratégia confiável comum é armazenar o shell do aplicativo no cache do service worker junto com algumas páginas críticas, como página offline, frontpage e qualquer outra coisa que possa ser importante no seu caso.

No entanto, existem algumas dicas para manter em mente. Com um service worker no local, precisamos tomar cuidado com as solicitações de intervalo no Safari (se você estiver usando o Workbox para um service worker, ele possui um módulo de solicitação de intervalo). Se você já se deparou com DOMException: Cota excedida. erro no console do navegador e, em seguida, consulte o artigo de Gerardo Quando 7 KB é igual a 7 MB.

Como Gerardo escreve: “Se você estiver construindo um aplicativo da web progressivo e estiver enfrentando armazenamento em cache inchado quando o service worker armazena em cache ativos estáticos servidos por CDNs, certifique-se de que o cabeçalho de resposta CORS adequado exista para recursos de origem cruzada, você não armazena em cache as respostas opacas com seu prestador de serviço sem querer, você ativa ativos de imagem de origem cruzada no modo CORS adicionando o atributo crossorigin à tag & ltimg & gt. ”

Há uma abundância de ótimos recursos para começar com service workers:

    , que ajuda você a entender como os prestadores de serviço trabalham nos bastidores e coisas a serem entendidas ao criar um. Chris Ferdinandi fornece uma grande série de artigos sobre service workers, explicando como criar aplicativos offline e cobrindo uma variedade de cenários, desde salvar páginas recentemente visualizadas offline até definir uma data de expiração para itens em um cache de service workers.

Por exemplo, em testes A / B, quando o HTML precisa variar seu conteúdo para diferentes usuários, podemos usar Service Workers nos servidores CDN para lidar com a lógica. Também poderíamos transmitir reescrita de HTML para acelerar sites que usam Google Fonts.

Sempre que você está experimentando, depurar repaint desnecessários em DevTools:

    . Confira algumas dicas úteis sobre como entendê-lo.
  • Para começar, verifique o curso Udacity gratuito de Paul Lewis sobre otimização de renderização do navegador e o artigo de Georgy Marchuk sobre Pintura do navegador e considerações para desempenho na web. em "Mais ferramentas → Renderização → Paint Flashing" no Firefox DevTools.
  • No React DevTools, marque "Destacar atualizações" e ative "Registrar por que cada componente renderizado",
  • Você também pode usar Why Did You Render, de modo que quando um componente é renderizado novamente, um flash irá notificá-lo sobre a mudança.

Você está usando um layout de alvenaria? Lembre-se de que, muito em breve, talvez seja possível construir um layout de Maçonaria apenas com a grade CSS.

Se você quiser se aprofundar no tópico, Nolan Lawson compartilhou truques para medir com precisão o desempenho do layout em seu artigo, e Jason Miller também sugeriu técnicas alternativas. Também temos um pequeno artigo de Sergey Chikuyonok sobre como obter a animação de GPU correta.

Os navegadores podem transformar a animação e opacidade de forma barata. CSS Triggers é útil para verificar se CSS dispara novos layouts ou refluxos. (Crédito da imagem: Addy Osmani) (visualização grande)

Observação: as mudanças nas camadas compostas por GPU são as menos caras, então se você puder escapar acionando apenas a composição por meio de opacidade e transformação, você estará no caminho certo. Anna Migas também forneceu muitos conselhos práticos em sua palestra sobre Debugging UI Rendering Performance. E para entender como depurar o desempenho da pintura no DevTools, verifique o vídeo de auditoria do Desempenho da pintura de Umar.

O que tudo isso significa? Ao carregar recursos, podemos tentar estar sempre um passo à frente do cliente, para que a experiência pareça rápida enquanto há muitas coisas acontecendo em segundo plano. Para manter o cliente engajado, podemos testar telas de esqueleto (demonstração de implementação) em vez de indicadores de carregamento, adicionar transições / animações e basicamente enganar a UX quando não há mais nada para otimizar.

Em seu estudo de caso sobre The Art of UI Skeletons, Kumar McMillan compartilha algumas ideias e técnicas sobre como simular listas dinâmicas, texto e a tela final, bem como como considerar pensamento-esqueleto com React.

Porém, tenha cuidado: as telas do esqueleto devem ser testadas antes da implantação, pois alguns testes mostraram que as telas do esqueleto podem ter o pior desempenho em todas as métricas.

A comunidade desenvolveu algumas técnicas e soluções alternativas para evitar refluxos. Em geral, é uma boa ideia evite inserir novo conteúdo acima do conteúdo existente, a menos que aconteça em resposta a uma interação do usuário. Sempre defina os atributos de largura e altura nas imagens, de forma que os navegadores modernos aloquem a caixa e reservem o espaço por padrão (Firefox, Chrome).

Para imagens ou vídeos, podemos usar um espaço reservado SVG para reservar a caixa de exibição na qual a mídia aparecerá. Isso significa que a área será reservada adequadamente quando você precisar manter sua proporção de aspecto também. Também podemos usar marcadores de posição ou imagens substitutas para anúncios e conteúdo dinâmico, bem como pré-alocar slots de layout.

Em vez de imagens de carregamento lento com scripts externos, considere o uso de carregamento lento nativo ou carregamento lento híbrido quando carregamos um script externo apenas se o carregamento lento nativo não for compatível.

Como mencionado acima, sempre agrupe as repinturas de fonte da web e a transição de tudo fontes alternativas para tudo fontes da web de uma só vez - apenas certifique-se de que essa mudança não seja muito abrupta, ajustando a altura da linha e o espaçamento entre as fontes com o combinador de estilo de fonte.

Para substituir métricas de fonte para que uma fonte substituta emule uma fonte da web, podemos usar os descritores @ font-face para substituir as métricas da fonte (demo, habilitado no Chrome 87). (Observe que os ajustes são complicados com pilhas de fontes complicadas.)

Para CSS atrasado, podemos garantir que CSS de layout crítico é embutido no cabeçalho de cada modelo. Ainda mais do que isso: para páginas longas, quando a barra de rolagem vertical é adicionada, ela desloca o conteúdo principal 16px para a esquerda. Para exibir uma barra de rolagem antecipadamente, podemos adicionar overflow-y: scroll em html para forçar uma barra de rolagem na primeira pintura. O último ajuda porque as barras de rolagem podem causar mudanças de layout não triviais devido ao refluxo do conteúdo acima da dobra quando a largura muda. Deve acontecer principalmente em plataformas com barras de rolagem não sobrepostas, como o Windows. Mas: break position: sticky porque esses elementos nunca rolarão para fora do contêiner.

Se você lida com cabeçalhos que se tornam fixos ou aderentes posicionados na parte superior da página na rolagem, reserve espaço para o cabeçalho quando ele se tornar fixo, por exemplo, com um elemento de espaço reservado ou margem superior no conteúdo. Uma exceção deve ser os banners de consentimento de cookies que não devem ter impacto no CLS, mas às vezes têm: depende da implementação. Existem algumas estratégias e lições interessantes neste tópico do Twitter.

Para um componente de guia que pode incluir várias quantidades de textos, você pode evitar mudanças de layout com pilhas de grade CSS. Colocando o conteúdo de cada guia na mesma área da grade e ocultando uma delas por vez, podemos garantir que o contêiner sempre terá a altura do elemento maior, de forma que nenhuma mudança de layout ocorrerá.

Ah, e é claro, a rolagem infinita e "Carregar mais" também podem causar mudanças de layout se houver conteúdo abaixo da lista (por exemplo, rodapé). Para melhorar o CLS, reserve espaço suficiente para o conteúdo que seria carregado no antes da o usuário rola para essa parte da página, remova o rodapé ou qualquer elemento DOM na parte inferior da página que pode ser empurrado para baixo pelo carregamento do conteúdo. Além disso, pré-busque dados e imagens para o conteúdo abaixo da dobra para que o sempre que um usuário rola a tela para tão longe, ele já está lá. Você pode usar bibliotecas de virtualização de lista como react-window para otimizar listas longas também (obrigado, Addy Osmani!).

Para garantir que o impacto dos refluxos seja contido, meça a estabilidade do layout com a API de instabilidade do layout. Com ele, você pode calcular a Mudança Cumulativa de Layout (CLS) pontue e inclua-o como um requisito em seus testes, de modo que, sempre que uma regressão aparecer, você poderá rastreá-la e corrigi-la.

Para calcular a pontuação de mudança de layout, o navegador observa o tamanho da janela de visualização e o movimento dos elementos instáveis ​​na janela de visualização entre dois quadros renderizados. Idealmente, a pontuação seria próxima de 0. Há um ótimo guia de Milica Mihajlija e Philip Walton sobre o que é CLS e como medi-lo. É um bom ponto de partida para medir e manter o desempenho percebido e evitar interrupções, especialmente para tarefas críticas de negócios.

Dica rápida: para descobrir o que causou uma mudança de layout no DevTools, você pode explorar as mudanças de layout em "Experiência" no Painel de desempenho.

Bônus: se você quiser reduzir refluxos e redesenhos, verifique o guia de Charis Theodoulou para Minimizando DOM Reflow / Layout Thrashing e a lista de Paul Irish de O que força layout / reflow, bem como CSSTriggers.com, uma tabela de referência sobre propriedades CSS que acionam layout, pintura e composição.

Rede e HTTP / 2

  1. O grampeamento OCSP está habilitado?
    Ao habilitar o grampeamento OCSP em seu servidor, você pode acelerar seus handshakes TLS. O Online Certificate Status Protocol (OCSP) foi criado como uma alternativa ao protocolo Certificate Revocation List (CRL). Ambos os protocolos são usados ​​para verificar se um certificado SSL foi revogado.

No entanto, o protocolo OCSP não exige que o navegador perca tempo baixando e pesquisando em uma lista as informações do certificado, reduzindo assim o tempo necessário para um handshake.

Como Simon escreve, no mundo do HTTPS, existem alguns tipos de níveis de validação de certificado usados ​​para proteger o tráfego:

  • Validação de Domínio (DV) valida que o solicitante do certificado possui o domínio,
  • Validação de Organização (OV) valida que uma organização possui o domínio,
  • Validação Estendida (EV) valida que uma organização possui o domínio, com validação rigorosa.

É importante observar que todos esses certificados são iguais em termos de tecnologia, eles apenas diferem nas informações e propriedades fornecidas nesses certificados.

Certificados EV são caros e demorados pois exigem que uma pessoa analise um certificado e assegure sua validade. Os certificados DV, por outro lado, são frequentemente fornecidos gratuitamente & mdash, por exemplo da Let’s Encrypt - uma autoridade de certificação aberta e automatizada que está bem integrada a muitos provedores de hospedagem e CDNs. Na verdade, no momento da escrita, ele está presente em mais de 225 milhões de sites (PDF), embora represente apenas 2,69% das páginas (abertas no Firefox).

Qual é o problema então? O problema é que Certificados EV não são totalmente compatíveis com grampeamento OCSP Mencionado acima. Enquanto o grampeamento permite que o servidor verifique com a Autoridade de Certificação se o certificado foi revogado e, em seguida, adicione ("grampear") essas informações ao certificado, sem grampear o cliente tem que fazer todo o trabalho, resultando em solicitações desnecessárias durante a negociação TLS . Em conexões ruins, isso pode resultar em custos de desempenho perceptíveis (1000 ms +).

Os certificados EV não são uma ótima escolha para desempenho na web e podem causar um impacto muito maior no desempenho do que os certificados DV. Para obter o desempenho ideal na web, sempre forneça um certificado DV grampeado OCSP. Eles também são muito mais baratos do que certificados EV e menos trabalhosos para adquirir. Bem, pelo menos até que o CRLite esteja disponível.

A compactação é importante: 40% das cadeias de certificados descompactadas são muito grandes para caber em um único voo QUIC de 3 datagramas UDP. (Crédito da imagem :) Rapidamente) (Visualização grande)

Observação: Com o QUIC / HTTP / 3 disponível, é importante notar que a cadeia de certificados TLS é o único conteúdo de tamanho variável que domina a contagem de bytes no handshake QUIC. O tamanho varia entre algumas centenas de bytes e mais de 10 KB.

Portanto, manter os certificados TLS pequenos é muito importante no QUIC / HTTP / 3, pois certificados grandes causarão vários apertos de mão. Além disso, precisamos ter certeza de que os certificados estão compactados, caso contrário, as cadeias de certificados seriam muito grandes para caber em um único voo QUIC.

Você pode encontrar caminho mais detalhes e indicações para o problema e para as soluções em:

É importante entender que HTTP / 2 não é perfeito e tem problemas de priorização, mas é muito bem suportado e, na maioria dos casos, você fica melhor com ele.

Uma palavra de cautela: HTTP / 2 Server Push está sendo removido do Chrome, então se sua implementação depende de Server Push, você pode precisar revisitá-lo. Em vez disso, podemos olhar para Early Hints, que já estão integrados como experimentos em Fastly.

Se você ainda estiver executando em HTTP, a tarefa mais demorada será migrar para HTTPS primeiro e, em seguida, ajustar seu processo de compilação para fornecer multiplexação e paralelização HTTP / 2. Trazer HTTP / 2 para Gov.uk é um estudo de caso fantástico sobre fazer exatamente isso, encontrando uma maneira de usar CORS, SRI e WPT ao longo do caminho. Para o restante deste artigo, presumimos que você está mudando ou já mudou para HTTP / 2.

Por um lado, você pode querer evitar a concatenação de ativos, em vez de quebrar toda a sua interface em muitos módulos pequenos, compactando-os como parte do processo de construção e carregando-os em paralelo. Uma alteração em um arquivo não exigirá que toda a folha de estilo ou JavaScript seja baixado novamente. Ele também minimiza o tempo de análise e mantém baixa a carga útil de páginas individuais.

Por outro lado, a embalagem ainda importa. Usando muitos pequenos scripts, compressão geral vai sofrer e o custo de recuperação de objetos do cache aumentará. A compactação de um pacote grande se beneficiará da reutilização de dicionário, ao passo que pequenos pacotes separados não. Há um trabalho padrão para resolver isso, mas está longe por enquanto. Em segundo lugar, os navegadores têm ainda não foi otimizado para esses fluxos de trabalho. Por exemplo, o Chrome acionará comunicações entre processos (IPCs) linearmente ao número de recursos, portanto, incluir centenas de recursos terá custos de tempo de execução do navegador.

Para obter melhores resultados com HTTP / 2, considere carregar o CSS progressivamente, conforme sugerido por Jake Archibald do Chrome.

Ainda assim, você pode tentar carregar o CSS progressivamente. Na verdade, o CSS interno não bloqueia mais a renderização para o Chrome. Mas existem alguns problemas de priorização, por isso não é tão simples, mas vale a pena experimentar.

Você poderia se safar com a coalescência de conexão HTTP / 2, que permite usar o sharding de domínio enquanto se beneficia do HTTP / 2, mas conseguir isso na prática é difícil e, em geral, não é considerado uma boa prática. Além disso, HTTP / 2 e integridade de sub-recursos nem sempre funcionam.

O que fazer? Bem, se você estiver executando em HTTP / 2, enviando 6–10 pacotes parece um meio-termo decente (e não é tão ruim para navegadores legados). Experimente e avalie para encontrar o equilíbrio certo para o seu site.

Para verificar se todas as solicitações usam uma única conexão HTTP / 2 ou se algo está configurado incorretamente, ative a coluna "Connection ID" em DevTools → Network. Por exemplo, aqui, todas as solicitações compartilham a mesma conexão (286) & mdash, exceto manifest.json, que abre uma conexão separada (451).

Consulte a incrível pesquisa de Pat Meenan sobre as prioridades HTTP / 2 (vídeo) e teste o suporte do servidor para priorização HTTP / 2. De acordo com Pat, é recomendado habilitar o controle de congestionamento BBR e definir tcp_notsent_lowat para 16KB para priorização HTTP / 2 para funcionar de forma confiável em kernels Linux 4.9 e posterior (obrigado, Yoav!) Andy Davies fez uma pesquisa semelhante para priorização de HTTP / 2 em navegadores, CDNs e serviços de hospedagem em nuvem.

Enquanto estiver nele, verifique se o seu kernel suporta TCP BBR e habilite-o se possível. Atualmente é usado no Google Cloud Platform, Amazon Cloudfront, Linux (por exemplo, Ubuntu).

Além disso, certifique-se de que todos os plug-ins externos e scripts de rastreamento sejam carregados via HTTPS, que o cross-site scripting não seja possível e que os cabeçalhos HTTP Strict Transport Security e os cabeçalhos da Política de segurança de conteúdo estejam definidos corretamente.

Para resolver os problemas do HTTP / 2, a IETF, junto com o Google, Akamai e outros, tem trabalhado em um novo protocolo que foi padronizado recentemente como HTTP / 3.

Robin Marx explicou o HTTP / 3 muito bem, e a explicação a seguir é baseada em sua explicação. Em seu núcleo, HTTP / 3 é muito semelhante a HTTP / 2 em termos de recursos, mas nos bastidores funciona de maneira muito diferente. O HTTP / 3 fornece uma série de melhorias: handshakes mais rápidos, melhor criptografia, fluxos independentes mais confiáveis, melhor criptografia e controle de fluxo. Uma diferença notável é que HTTP / 3 usa QUIC como a camada de transporte, com pacotes QUIC encapsulados em cima de diagramas UDP, em vez de TCP.

O QUIC integra totalmente o TLS 1.3 ao protocolo, enquanto no TCP é colocado em camadas no topo. Na pilha TCP típica, temos alguns tempos de ida e volta de sobrecarga porque o TCP e o TLS precisam fazer seus próprios apertos de mão separados, mas com o QUIC ambos podem ser combinados e concluídos em apenas uma única viagem de ida e volta. Como o TLS 1.3 nos permite configurar chaves de criptografia para uma conexão conseqüente, a partir da segunda conexão, já podemos enviar e receber dados da camada de aplicação na primeira viagem de ida e volta, que é chamada de "0-RTT".

Além disso, o algoritmo de compressão de cabeçalho de HTTP / 2 foi totalmente reescrito, junto com seu sistema de priorização. Além disso, suporte QUIC migração de conexão de Wi-Fi para rede celular por meio de IDs de conexão no cabeçalho de cada pacote QUIC. A maioria das implementações é feita no espaço do usuário, não no espaço do kernel (como é feito com o TCP), então devemos esperar que o protocolo evolua no futuro.

Tudo faria uma grande diferença? Provavelmente sim, especialmente tendo um impacto nos tempos de carregamento no celular, mas também na forma como servimos ativos aos usuários finais. Enquanto em HTTP / 2, várias solicitações compartilham uma conexão, em HTTP / 3 as solicitações também compartilham uma conexão, mas o fluxo é independente, portanto, um pacote descartado não afeta mais todas as solicitações, apenas um fluxo.

Isso significa que, embora com um grande pacote JavaScript o processamento de ativos seja lento quando um fluxo é pausado, o impacto será menos significativo quando vários arquivos forem transmitidos em paralelo (HTTP / 3). Então embalagem ainda importa.

HTTP / 3 ainda está em andamento. Chrome, Firefox e Safari já têm implementações. Alguns CDNs já oferecem suporte a QUIC e HTTP / 3. No final de 2020, o Chrome começou a implantar HTTP / 3 e IETF QUIC e, de fato, todos os serviços do Google (Google Analytics, YouTube etc.) já estão rodando em HTTP / 3. O LiteSpeed ​​Web Server oferece suporte a HTTP / 3, mas nem Apache, nginx ou IIS oferece suporte ainda, mas é provável que mude rapidamente em 2021.

O linha de fundo: se você tiver a opção de usar HTTP / 3 no servidor e em seu CDN, provavelmente é uma boa ideia fazer isso. O principal benefício virá de buscar vários objetos simultaneamente, especialmente em conexões de alta latência. Não sabemos ao certo ainda, pois não há muitas pesquisas feitas nesse espaço, mas os primeiros resultados são muito promissores.

Se você quiser se aprofundar mais nas especificações e vantagens do protocolo, aqui estão alguns bons pontos de partida para verificar:

    , um esforço colaborativo para documentar os protocolos HTTP / 3 e QUIC. Disponível em vários idiomas, também como PDF. com Daniel Stenberg. com Robin Marx apresenta os conceitos básicos dos protocolos QUIC e HTTP / 3, explica como o HTTP / 3 lida com o bloqueio direto e a migração da conexão e como o HTTP / 3 foi projetado para ser perene (obrigado, Simon!).
  • Você pode verificar se o seu servidor está executando em HTTP / 3 em HTTP3Check.net.

Teste e monitoramento

  1. Você otimizou seu fluxo de trabalho de auditoria?
    Pode não parecer grande coisa, mas ter as configurações certas ao seu alcance pode economizar um pouco de tempo nos testes. Considere o uso do Alfred Workflow para WebPageTest de Tim Kadlec para enviar um teste à instância pública de WebPageTest. Na verdade, WebPageTest tem muitos recursos obscuros, então reserve um tempo para aprender como ler um gráfico WebPageTest Waterfall View e como ler um gráfico WebPageTest Connection View para diagnosticar e resolver problemas de desempenho mais rapidamente.

Dê uma olhada no AutoWebPerf lançado recentemente, uma ferramenta modular que permite a coleta automática de dados de desempenho de várias fontes. Por exemplo, poderíamos definir um teste diário em suas páginas críticas para capturar os dados de campo da API CrUX e dados de laboratório de um relatório Lighthouse do PageSpeed ​​Insights.

E se você precisar depurar algo rapidamente, mas seu processo de compilação parecer extremamente lento, tenha em mente que "a remoção de espaços em branco e a mutilação de símbolos são responsáveis ​​por 95% da redução de tamanho no código reduzido para a maioria das transformações de código JavaScript e não elaboradas. Você pode basta desabilitar a compactação para acelerar as compilações do Uglify de 3 a 4 vezes. "

  1. Você testou em navegadores proxy e navegadores legados?
    Testar no Chrome e no Firefox não é suficiente. Veja como seu site funciona em navegadores proxy e navegadores legados. O UC Browser e o Opera Mini, por exemplo, têm uma participação de mercado significativa na Ásia (até 35% na Ásia). Meça a velocidade média da Internet em seus países de interesse para evitar grandes surpresas no futuro. Teste com limitação de rede e emule um dispositivo de alto DPI. BrowserStack é fantástico para testar controlo remoto dispositivos reais e complementá-los com pelo menos alguns dispositivos reais em seu escritório também - vale a pena.

Um aspecto importante das respostas 404 é o real tamanho do corpo de resposta que está sendo enviado ao navegador. De acordo com a pesquisa de 404 páginas por Matt Hobbs, a grande maioria das respostas 404 são provenientes de favicons ausentes, solicitações de uploads do WordPress, solicitações quebradas de JavaScript, arquivos de manifesto, bem como arquivos CSS e fonte. Cada vez que um cliente solicita um ativo que não existe, ele receberá uma resposta 404 - e muitas vezes essa resposta é enorme.

Certifique-se de examinar e otimizar o estratégia de cache para suas páginas 404. Nosso objetivo é servir HTML ao navegador apenas quando ele espera uma resposta HTML e retornar uma pequena carga útil de erro para todas as outras respostas. De acordo com Matt, "se colocarmos um CDN na frente de nossa origem, temos a chance de armazenar em cache a resposta da página 404 no CDN. Isso é útil porque, sem ele, atingir uma página 404 poderia ser usado como um vetor de ataque DoS, por forçando o servidor de origem a responder a cada solicitação 404 em vez de permitir que o CDN responda com uma versão em cache. "

Os erros 404 não só podem prejudicar o seu desempenho, mas também podem custar muito no tráfego, por isso é uma boa ideia incluir uma página de erro 404 em seu pacote de testes do Lighthouse e rastrear sua pontuação ao longo do tempo.

Obviamente, o consentimento real provavelmente mudará o impacto dos scripts no desempenho geral, então, como Boris Schapira observou, podemos estudar alguns perfis de desempenho da web diferentes:

  • O consentimento foi totalmente recusado,
  • O consentimento foi parcialmente recusado,
  • O consentimento foi inteiramente dado.
  • O usuário não agiu no prompt de consentimento (ou o prompt foi bloqueado por um bloqueador de conteúdo),

Normalmente, as solicitações de consentimento de cookies não devem ter um impacto sobre o CLS, mas às vezes têm, então considere usar as opções gratuitas e de código aberto Osano ou cookie-consent-box.

Em geral, vale a pena olhar para o desempenho pop-up pois você precisará determinar o deslocamento horizontal ou vertical do evento do mouse e posicionar corretamente o pop-up em relação à âncora. Noam Rosenthal compartilha as aprendizagens da equipe da Wikimedia no artigo de estudo de caso de desempenho na web: visualizações da página da Wikipedia (também disponíveis como vídeo e minutos).

Por exemplo. você pode querer garantir que nenhuma imagem acima da dobra seja carregada lentamente. Você pode personalizar o snippet de acordo com suas necessidades, por exemplo, para destacar fontes da web que não são usadas ou detectar fontes de ícone. Uma excelente ferramenta para garantir que os erros sejam visíveis durante a depuração ou apenas para auditar o projeto atual muito rapidamente.

Quando falamos sobre tempo rápido para interativo, geralmente nos referimos a um indicador de como em breve um usuário pode interagir com a página clicando ou tocando em links e botões. O contexto é ligeiramente diferente com leitores de tela. Nesse caso, o tempo rápido de interação significa quanto Tempo passa até o leitor de tela pode anunciar navegação em uma determinada página e um usuário de leitor de tela pode realmente pressionar o teclado para interagir.

Léonie Watson deu uma palestra reveladora sobre o desempenho da acessibilidade e, especificamente, o impacto do carregamento lento nos atrasos de anúncio do leitor de tela. Os leitores de tela são usados ​​para anúncios e navegação rápidos e, portanto, podem ser ainda menos pacientes do que usuários com visão.

Páginas grandes e manipulações de DOM com JavaScript causarão atrasos nos anúncios do leitor de tela. Uma área um tanto inexplorada que poderia exigir alguma atenção e testes, já que os leitores de tela estão disponíveis em literalmente todas as plataformas (Jaws, NVDA, Voiceover, Narrator, Orca).

Considere o uso de soluções RUM para monitorar as mudanças no desempenho ao longo do tempo. Para ferramentas de teste de carga semelhantes a testes de unidade automatizados, você pode usar o k6 com sua API de script. Além disso, dê uma olhada em SpeedTracker, Lighthouse e Caliber.

Vitórias rápidas

Esta lista é bastante abrangente e a conclusão de todas as otimizações pode demorar um pouco. Portanto, se você tivesse apenas 1 hora para obter melhorias significativas, o que faria? Vamos resumir tudo em 17 frutas ao alcance da mão. Obviamente, antes de começar e depois de terminar, meça os resultados, incluindo a pintura com maior conteúdo e o tempo de interação em uma conexão 3G e a cabo.

  1. Meça a experiência do mundo real e estabeleça metas apropriadas. Procure ser pelo menos 20% mais rápido que seu concorrente mais rápido. Fique dentro da maior pintura com conteúdo & lt 2,5s, um primeiro atraso de entrada & lt 100ms, tempo de interação & lt 5s em 3G lento, para visitas repetidas, TTI & lt 2s. Otimize pelo menos para a primeira pintura com conteúdo e tempo para interação.
  2. Otimize imagens com Squoosh, mozjpeg, guetzli, pingo e SVGOMG e forneça AVIF / WebP com um CDN de imagem.
  3. Prepare CSS essencial para seus modelos principais e inclua-os no & lthead & gt de cada modelo. Para CSS / JS, opere com um orçamento de tamanho de arquivo crítico de no máx. 170 KB compactado com gzip (0,7 MB descompactado).
  4. Corte, otimize, adie e carregue lentamente os scripts. Invista na configuração do seu bundler para remover redundâncias e verificar alternativas leves.
  5. Sempre auto-hospedar seus ativos estáticos e sempre preferir auto-hospedar ativos de terceiros. Limite o impacto de scripts de terceiros. Use fachadas, carregue widgets na interação e tome cuidado com os fragmentos anti-oscilação.
  6. Seja seletivo ao escolher uma estrutura. Para aplicativos de página única, identifique páginas críticas e exiba-as estaticamente, ou pelo menos pré-renderize-as, e use hidratação progressiva no nível de componente e módulos de importação na interação.
  7. A renderização do lado do cliente sozinha não é uma boa escolha para desempenho. Pré-renderize se suas páginas não mudarem muito e adie a inicialização dos frameworks, se puder. Se possível, use a renderização do lado do servidor de streaming.
  8. Veicule código legado apenas para navegadores legados com & ltscript type = "módulo" & gt e padrão de módulo / nomodule.
  9. Experimente reagrupar suas regras de CSS e teste o CSS no corpo.
  10. Adicione dicas de recursos para acelerar a entrega com dns-lookup, pré-conexão, pré-busca, pré-carregamento e pré-processamento mais rápidos.
  11. Faça um subconjunto de fontes da web e carregue-as de forma assíncrona, e utilize a exibição de fontes em CSS para uma primeira renderização rápida.
  12. Verifique se os cabeçalhos do cache HTTP e os cabeçalhos de segurança estão configurados corretamente.
  13. Ative a compactação Brotli no servidor. (Se isso não for possível, pelo menos certifique-se de que a compactação Gzip está ativada.)
  14. Habilite o congestionamento de TCP BBR, desde que seu servidor esteja executando no kernel Linux versão 4.9+.
  15. Ative o grampeamento OCSP e IPv6, se possível. Sempre forneça um certificado DV grampeado OCSP.
  16. Ative a compactação HPACK para HTTP / 2 e vá para HTTP / 3 se estiver disponível.
  17. Ativos de cache, como fontes, estilos, JavaScript e imagens em um cache de service worker.

Baixe a lista de verificação (PDF, páginas da Apple)

Com esta lista de verificação em mente, você deve estar preparado para qualquer tipo de projeto de performance front-end. Sinta-se à vontade para baixar o PDF pronto para impressão da lista de verificação, bem como um documento editável de Apple Pages para personalizar a lista de verificação de acordo com suas necessidades:

Se precisar de alternativas, você também pode verificar a lista de verificação de front-end de Dan Rublic, a "Lista de verificação de desempenho da web do designer" de Jon Yablonski e a lista de verificação Frontend.

Lá vamos nós!

Algumas das otimizações podem estar além do escopo de seu trabalho ou orçamento ou podem ser exageradas, dado o código legado com o qual você precisa lidar. Isso é bom! Use esta lista de verificação como um guia geral (e possivelmente abrangente) e crie sua própria lista de questões que se aplicam ao seu contexto. Mas o mais importante, teste e avalie seus próprios projetos para identificar problemas antes de otimizá-los. Feliz desempenho em 2021, pessoal!

Um grande obrigado a Guy Podjarny, Yoav Weiss, Addy Osmani, Artem Denysov, Denys Mishunov, Ilya Pukhalski, Jeremy Wagner, Colin Bendell, Mark Zeman, Patrick Meenan, Leonardo Losoviz, Andy Davies, Rachel Andrew, Anselm Hannemann, Barry Pollard, Patrick Hamann, Gideon Pyzer, Andy Davies, Maria Prosvernina, Tim Kadlec, Rey Bango, Matthias Ott, Peter Bowyer, Phil Walton, Mariana Peralta, Pepijn Senders, Mark Nottingham, Jean Pierre Vincent, Philipp Tellis, Ryan Townsend, Ingrid Bergman, Mohamed Hussain S.H., Jacob Groß, Tim Swalling, Bob Visser, Kev Adamson, Adir Amsalem, Aleksey Kulikov e Rodney Rehm pela revisão deste artigo, bem como nossa fantástica comunidade que compartilhou técnicas e lições aprendidas em seu trabalho de otimização de desempenho para todos. usar. Você é realmente incrível!


Sempre com vontade de ir para a E xtra M ile

71% dos clientes disseram que, se pensarem que uma marca prioriza o lucro em vez das pessoas, perderão a confiança nessa marca para sempre. Em tempos difíceis, é sua responsabilidade como marca e serviço de atendimento ao cliente retribuir e apoiar as comunidades locais.

Por exemplo, durante o COVID-19, os restaurantes ofereceram refeições gratuitas e serviços de entrega aos funcionários da linha de frente. Algumas lojas também instalaram estações de saneamento que podem ser utilizadas gratuitamente pelos clientes.

Kevin é um consultor de marketing de conteúdo que ajuda empresas de software a construir funis de marketing e implementar campanhas de marketing de conteúdo para aumentar seus leads inbound.


Assista o vídeo: Aplicativos auxiliam deficientes visuais - 02082016


Comentários:

  1. Borden

    Ele ganhou barato, facilmente perdido.

  2. Kamryn

    As mensagens pessoais de tudo hoje enviam?

  3. Kejinn

    a mensagem incomparável, me agrada muito :)

  4. Humility

    Quero dizer, você está errado. Eu posso provar. Escreva para mim em PM.



Escreve uma mensagem