JavaScript em 2025: o que há de novo na prática
O mundo do JavaScript não para. Até 2025, a linguagem deu um salto significativo, oferecendo aos desenvolvedores ferramentas poderosas para criar aplicações mais performáticas, seguras e legíveis. Neste artigo, vamos analisar as principais novidades do ECMAScript 2025 com exemplos práticos para Node.js. Você aprenderá como a Temporal API resolve o problema de trabalhar com datas, como os decoradores simplificam a metaprogramação e quais padrões de assincronicidade se tornaram o padrão de facto.
1. Temporal API: Trabalhando com datas e horas sem dor de cabeça
A tão esperada substituição do obsoleto Date finalmente se estabilizou. A Temporal API oferece objetos imutáveis, suporte a fusos horários e calendários, além de métodos legíveis para humanos.
Em vez de escrever gambiarras para parsing e formatação, agora você pode usar funções nativas:
const { Temporal } = require('@js-temporal/polyfill'); // Para Node.js < 22
// Criando uma dataconst now = Temporal.Now.plainDateISO();console.log(now.toString()); // "2025-03-15"
// Trabalhando com horasconst meeting = Temporal.PlainTime.from('14:30');const updatedMeeting = meeting.add({ hours: 1, minutes: 15 });console.log(updatedMeeting.toString()); // "15:45"
// Fusos horáriosconst zoned = Temporal.ZonedDateTime.from({ timeZone: 'Europe/Moscow', year: 2025, month: 12, day: 25, hour: 10});console.log(zoned.toInstant().epochMilliseconds); // 1735544400000
// Comparando períodosconst duration1 = Temporal.Duration.from({ days: 5 });const duration2 = Temporal.Duration.from({ days: 10 });console.log(Temporal.Duration.compare(duration1, duration2)); // -1Por que isso é importante? A Temporal resolve problemas de mutabilidade (cada método retorna um novo objeto) e confusão com fusos horários, algo crítico para aplicações server-side em Node.js.
2. Decoradores: Padronização da metaprogramação
Os decoradores, que por muito tempo foram um recurso experimental do TypeScript, finalmente entraram no padrão ECMAScript 2025. Eles permitem adicionar lógica a classes, métodos e propriedades de forma fácil.
Agora você pode criar decoradores limpos e reutilizáveis sem bibliotecas de terceiros:
// Decorador para registrar chamadas de métodosfunction log(target, context) { const methodName = String(context.name); const originalMethod = target;
return function (...args) { console.log(`[LOG] Chamada de ${methodName} com argumentos:`, args); const result = originalMethod.apply(this, args); console.log(`[LOG] Resultado de ${methodName}:`, result); return result; };}
class OrderService { @log createOrder(userId, items) { // lógica de negócio return { id: Date.now(), userId, items }; }}
const service = new OrderService();service.createOrder(123, ['item1', 'item2']);// [LOG] Chamada de createOrder com argumentos: [ 123, [ 'item1', 'item2' ] ]// [LOG] Resultado de createOrder: { id: 1742030400000, userId: 123, items: [ 'item1', 'item2' ] }Os decoradores são ideais para caching, validação, autorização e monitoramento em arquiteturas de microsserviços.
3. Padrões aprimorados de assincronicidade e paralelismo
Em 2025, o JavaScript recebeu recursos nativos para trabalhar com tarefas paralelas, que antes exigiam gerenciamento manual de promessas ou bibliotecas de terceiros.
3.1. Promise.withResolvers()
Este método simplifica a criação de promessas que são resolvidas externamente. Anteriormente, era necessário criar variáveis em um closure:
// Método antigofunction createDeferred() { let resolve, reject; const promise = new Promise((res, rej) => { resolve = res; reject = rej; }); return { promise, resolve, reject };}
// Método novo (ECMAScript 2025)const { promise, resolve, reject } = Pro