Categorias

Cinco alternativas ao Moment.js que você precisa conhecer agora

O Moment.js foi criado em 2011 como uma biblioteca de JavaScript para manipulação de datas e tempo em páginas web e aplicativos. Por sua praticidade, ele praticamente se tornou A biblioteca de manipulação de datas e tempo e, até esse mês, ainda contabilizava a impressionante marca de 12 milhões de downloads por semana.

Não se mexe em time que está ganhando? Exatamente. Ainda que Moment.js tenha evoluído em alguns pontos ao longo dos anos, a biblioteca continua a mesma em sua essência. Seu time de criadores optou por manter o pacote estável ao invés de adicionar ou alterar funcionalidades.

Por outro lado, a web mudou e a forma como desenvolvedores lidam com bibliotecas e frameworks não é mais como era em 2011. Tome por exemplo o tamanho que Moment.js pode atingir quando se incorpora variáveis de internacionalização de datas e fuso horário. A biblioteca pode ficar maior do que precisaria ser, principalmente quando alguns desses recursos podem ser acessados de forma mais leve em outros pacotes ou através de elementos nativos de navegadores modernos.

Cientes das vozes contrárias à implementação de Moment.js em 2020, seus próprios criadores tomaram a decisão de aposentar a biblioteca em definitivo.

Reconhecemos que muitos projetos existentes podem continuar a usar o Moment, mas gostaríamos de desencorajar o Moment de ser usado em novos projetos no futuro. Em vez disso, gostaríamos de recomendar alternativas que são excelentes opções para uso em aplicações modernas hoje.

Na prática, isso significa que, daqui pra frente:

  • Não serão adicionados novos recursos ou capacidades.
  • A API do Moment continuará sendo mutável.
  • Problemas de tree shaking ou tamanho de pacote não serão abordados.
  • Não haverá grandes alterações (sem versão 3).
  • Bugs ou peculiaridades de comportamento podem não ser corrigidos, especialmente se forem problemas conhecidos de longa data.

Seguem então, algumas recomendações mais atualizadas que podem funcionar como alternativa ao Moment.js:

Luxon

Luxon é um sucessor espiritual de Moment.js a partir do momento em que foi desenvolvido por um de seus criadores. Nas palavras de Isaac Cambron:

“Luxon começou porque eu tinha um monte de ideias sobre como melhorar o Moment, mas continuei descobrindo que o Moment não era uma boa base de código para explorá-las. Nomeadamente:

  • Eu queria experimentar algumas ideias que achei que forneceriam uma API melhor e mais explícita, mas não queria quebrar tudo no Moment.
  • Tive uma ideia sobre como fornecer suporte pronto para uso e sem a necessidade de arquivos de dados para fusos horários, mas o design do Moment tornou isso difícil.
  • Eu queria repensar completamente como a internacionalização funcionava usando a API Intl que vem empacotada nos navegadores.
  • Eu queria usar um conjunto de ferramentas JS moderno, o que exigiria uma grande reformulação para o Moment.

Então decidi escrever algo do zero, uma espécie de Moment modernizado”.

Por suas origens, Luxon é uma das melhores opções disponíveis para quem está vindo do ambiente Moment e já tem experiência com a biblioteca.

Day.js

Day.js prima pelo tamanho reduzido, extremamente reduzido. Essa solução conta com apenas 2 kb e foi projetada para ter o menor impacto possível em seu pacote de distribuição. Apesar de sua abordagem minimalista, ainda assim a biblioteca consegue  interpretar, validar, manipular e exibir datas e horários em navegadores modernos.

Para quem está vindo do ambiente Moment.js, a transição também é bastante tranquila, uma vez que existem muitos pontos de compatibilidade com sua API. Em contrapartida, Day.js oferece imutabilidade: “todas as operações de API que modifiquem o objeto Day.js irão retornar uma nova instância em seu lugar”. Essa característica diferencia bastante a alternativa da abordagem adotada anteriormente com o Moment.js.

A biblioteca traz suporte a internacionalização de datas, mas é oferecido através de um plugin e neutraliza a proposta de uma solução mais leve. Ainda assim, se for necessário para o projeto, a solução está disponível.

date-fns

Date-fns é mais uma alternativa poderosa ao Moment.js. Essa biblioteca JavaScript traz uma abordagem modularizada, com componentes carregáveis de acordo com a necessidade do projeto, através de um pacote NPM. Isso permite que a solução seja tão leve quanto possível ou tão versátil quanto o desenvolvedor precisar, incluindo suporte a tree shaking.

A biblioteca oferece também suporte a 77 locais diferentes, mas o usuário só precisa carregar o componente que irá realmente utilizar.

Com ampla documentação online, Date-fns pode ser uma alternativa bastante sólida para projetos atuais e futuros.

js-Joda

js-Joda se gaba de ser a biblioteca de manipulação de data e horário mais rápida existente no mercado, com velocidade de carregamento duas a dez vezes mais veloz que a concorrência. Isso sem abrir mão da estabilidade necessária.

Curiosamente, js-Joda é uma versão em JavaScript do Three-Ten Backport originalmente criado em Java, que serviu de base para a implementação do JSR-310 do objeto java.time do Java SE 8. Isso significa que desenvolvedores Java familiares com essa abordagem encontrarão facilidade na transição da biblioteca em JavaScript.

Biblioteca nenhuma

Sim. Nenhuma. Desde sempre, o JavaScript tem um objeto Date. São necessários cuidados para se manipular suas particularidades, mas não é como se fosse uma especificação complexa demais.

O maior problema costuma surgir na hora de se fazer um parsing, quando a implementação é conhecida por ser inconsistente. Como os criadores do Moment.js relatam, “dependendo da implementação e dos componentes fornecidos na string, você pode se surpreender com o resultado”. A Mozilla corrobora a dificuldade: “o parsing de strings de data com o construtor Date (e Date.parse (), que funciona da mesma maneira) é fortemente desencorajada devido às diferenças e inconsistências dos navegadores”.

Para datas internacionais e seus diferentes padrões, o ECMA-402 já possui recomendações poderosas que podem resolver conflitos e conversões de forma precisa. Entretanto, é necessário um conhecimento profundo do que fazer para utilizar os objetos disponíveis.

Ainda assim, os objetos Date e Intl podem ser aplicados diretamente no seu projeto, se você está disposto a compreender seu funcionamento e contornar suas limitações, sem a necessidade de uma biblioteca.

Continuar usando o Moment.js?

Apesar das alternativas existentes e da “aposentadoria” da biblioteca, ainda existem bons motivos para se continuar utilizando Moment.js.

Uma das vantagens é o suporte a navegadores ancestrais. Moment.js é compatível com Internet Explorer 8 ou superior, por exemplo, e total compatibilidade com Safari em dispositivos móveis. Se sua página ou aplicação necessita oferecer acesso a navegadores fora da curva, manter a biblioteca pode ser uma solução prática por enquanto.

Você pode continuar usando Moment.js sem nem perceber, se ele for um componente integrado de outra biblioteca. Diversas soluções em JavaScript de calendário ou mesmo criação de gráficos, linhas temporais ou cronogramas podem ter dependências ou legados que seriam complicados demais para serem revertidos por seus desenvolvedores.

Por último, existe também a boa e velha familiaridade. Se você já está utilizando a solução por anos a fio e conhece cada meandro de sua API, pode ser inconveniente trocá-la por uma nova biblioteca, por mais que seja recomendado.