Signals no JavaScript: TC39 Quer Tornar Reatividade Um Padrão Nativo da Linguagem
Olá HaWkers, uma proposta está agitando o mundo JavaScript: Signals pode se tornar parte oficial da linguagem. Isso significa reatividade nativa, sem precisar de frameworks.
Angular, Vue, Solid, Svelte - todos já usam Signals. Mas React não. Vamos entender essa divisão e o que significa para o futuro.
O Que São Signals
Entendendo o conceito fundamental.
Reatividade Primitiva
Signals são valores reativos:
// Proposta atual do TC39
const count = new Signal.State(0);
// Ler o valor
console.log(count.get()); // 0
// Atualizar o valor
count.set(1);
// Computação derivada
const double = new Signal.Computed(() => count.get() * 2);
console.log(double.get()); // 2Por Que Isso Importa
Diferença para estado tradicional:
Sem Signals (estado manual):
let count = 0;
let double = count * 2;
// Problema: double não atualiza automaticamente
count = 5;
console.log(double); // Ainda 0! Não é reativoCom Signals (reativo):
const count = new Signal.State(0);
const double = new Signal.Computed(() => count.get() * 2);
count.set(5);
console.log(double.get()); // 10 - Atualiza automaticamente!
Como Frameworks Usam Signals
Cada framework tem sua implementação.
Vue 3
Signals sob o nome "ref":
import { ref, computed } from 'vue';
// Signal de estado
const count = ref(0);
// Signal computado
const double = computed(() => count.value * 2);
// Template reage automaticamente
<template>
<button @click="count++">
{{ count }} x 2 = {{ double }}
</button>
</template>Angular
Signals oficiais desde Angular 16:
import { signal, computed, effect } from '@angular/core';
// Signal de estado
const count = signal(0);
// Signal computado
const double = computed(() => count() * 2);
// Efeito colateral
effect(() => {
console.log(`Count é agora: ${count()}`);
});
// Atualizar
count.set(5);
count.update(n => n + 1);Solid.js
Signals são o core do framework:
import { createSignal, createMemo, createEffect } from 'solid-js';
const [count, setCount] = createSignal(0);
const double = createMemo(() => count() * 2);
createEffect(() => {
console.log(`Count: ${count()}, Double: ${double()}`);
});
// JSX é reativo no nível de expressão
<button onClick={() => setCount(c => c + 1)}>
{count()} x 2 = {double()}
</button>Svelte 5 (Runes)
Nova sintaxe com runes:
<script>
let count = $state(0);
let double = $derived(count * 2);
$effect(() => {
console.log(`Count é ${count}`);
});
</script>
<button onclick={() => count++}>
{count} x 2 = {double}
</button>
Por Que React Não Usa Signals
A controvérsia explicada.
Filosofia Diferente
React escolheu outro caminho:
Modelo do React (Virtual DOM):
function Counter() {
const [count, setCount] = useState(0);
const double = count * 2; // Recalcula em cada render
return (
<button onClick={() => setCount(c => c + 1)}>
{count} x 2 = {double}
</button>
);
}
// Componente inteiro re-renderiza quando count mudaModelo Signals (Reatividade granular):
function Counter() {
const count = signal(0);
const double = computed(() => count() * 2);
return (
<button onClick={() => count.set(c => c + 1)}>
{count()} x 2 = {double()}
</button>
);
}
// Só as expressões {count()} e {double()} atualizamTrade-offs
Cada abordagem tem vantagens:
| Aspecto | React Hooks | Signals |
|---|---|---|
| Performance | Re-render componente | Update granular |
| Mental model | Simples e previsível | Mais complexo |
| Debug | React DevTools | Mais difícil |
| Bundle size | Maior | Menor |
| Server rendering | Maduro | Evoluindo |
Posição Oficial do React
O que a equipe do React diz:
"Signals são otimização de performance, não um novo paradigma. React prefere manter o modelo mental simples e otimizar por baixo dos panos."
Estratégia do React:
- React Compiler (antigo React Forget)
- Memoização automática
- Concurrent rendering
- Server Components
A Proposta TC39
O que está sendo padronizado.
Estado Atual
Progresso no comitê:
Stage 1 (Proposal):
- Aprovado em abril 2024
- Polyfill disponível
- Implementações experimentais
- Discussões ativas
API Proposta
Interface planejada:
// Signal de estado
const counter = new Signal.State(0);
// Leitura
counter.get(); // 0
// Escrita
counter.set(1);
// Signal computado
const doubled = new Signal.Computed(() => counter.get() * 2);
// Apenas leitura
doubled.get(); // 2
// Watcher para efeitos
const watcher = new Signal.subtle.Watcher(() => {
// Notifica quando signals observados mudam
console.log("Algo mudou!");
});
watcher.watch(doubled);Por Que No Navegador
Benefícios de ter nativo:
1. Interoperabilidade:
// Signals do Vue funcionando com Angular
import { ref } from 'vue';
import { signal } from '@angular/core';
// Hoje: Incompatíveis
// Com padrão: Intercambiáveis2. Performance:
- Implementação nativa em C++
- Otimizações do engine
- Menos overhead de abstração
- Melhor integração com DOM
3. Consistência:
- Mesma API em todos frameworks
- Portabilidade de código
- Documentação unificada
- Menos fragmentação
Impacto Nos Frameworks
O que muda para cada um.
Vue
Migração mais fácil:
// Vue 3 hoje
import { ref, computed } from 'vue';
const count = ref(0);
// Vue futuro (possível)
const count = new Signal.State(0);
// Vue adiciona apenas camadas de conveniênciaAngular
Já está preparado:
// Angular hoje já tem API similar
import { signal, computed } from '@angular/core';
// Migração para nativo seria transparente
// Principalmente ganhos de performanceSolid
Valida a abordagem:
// Solid já usa API muito similar
// Seria quase drop-in replacement
// Ryan Carniato está envolvido na propostaReact
Pressão para adaptar:
Cenários possíveis:
- React ignora e mantém abordagem atual
- React cria camada de compatibilidade
- React oferece modo "signals" opcional
- Novo framework emerge dominante
Performance Na Prática
Benchmarks reais.
Comparativo de Frameworks
Teste de atualização de 10.000 itens:
| Framework | Tempo (ms) | Memória (MB) |
|---|---|---|
| Vanilla + Signals | 12 | 8 |
| Solid.js | 14 | 10 |
| Vue 3 | 18 | 12 |
| Svelte 5 | 16 | 11 |
| Angular 19 | 22 | 15 |
| React 19 | 45 | 28 |
Quando Signals Brilham
Casos de uso ideais:
Dashboards com muitos dados:
// Com Virtual DOM: Tudo re-renderiza
// Com Signals: Só células alteradas atualizam
const cells = Array(10000).fill(null).map(() =>
new Signal.State(Math.random())
);
// Atualizar uma célula: O(1) com Signals
cells[5000].set(0.5);Formulários complexos:
// Validação reativa e granular
const email = new Signal.State('');
const isValid = new Signal.Computed(() =>
email.get().includes('@')
);
// Só o indicador de validação atualizaAnimações e jogos:
// Updates de 60fps
const position = new Signal.State({ x: 0, y: 0 });
// Mínimo overhead por frame
requestAnimationFrame(() => {
position.set({ x: position.get().x + 1, y: 0 });
});
Usando Signals Hoje
Como experimentar agora.
Polyfill Oficial
Instalação e uso:
npm install signal-polyfillimport { Signal } from 'signal-polyfill';
const count = new Signal.State(0);
const double = new Signal.Computed(() => count.get() * 2);
// Funciona em qualquer ambiente
console.log(double.get()); // 0
count.set(5);
console.log(double.get()); // 10Frameworks Prontos
Opções para produção:
Se quer Signals hoje:
- Solid.js - Mais puro em Signals
- Vue 3 - Signals como "refs"
- Angular 17+ - Signals oficiais
- Svelte 5 - Runes (Signals com sintaxe)
Bibliotecas standalone:
- Preact Signals
- @preact/signals-core
- MobX (conceito similar)
O Futuro
Para onde estamos indo.
Timeline Provável
Expectativas realistas:
2026:
- Stage 2 da proposta
- Polyfills estáveis
- Experimentos em browsers
2027:
- Stage 3 (candidato)
- Implementações nativas começam
- Frameworks adaptando
2028+:
- Stage 4 (finalizado)
- Disponível em browsers
- Nova era de frameworks
Impacto na Carreira
O que desenvolvedores devem fazer:
Curto prazo:
- Entenda o conceito de Signals
- Experimente em projetos pessoais
- Continue usando seu framework atual
Médio prazo:
- Acompanhe a proposta TC39
- Avalie Solid/Vue/Angular
- Prepare para mudanças
Longo prazo:
- Signals será conhecimento base
- Frameworks convergirão
- Novas arquiteturas surgirão
Conclusão
Signals representa uma possível unificação do ecossistema JavaScript. Seja a proposta aprovada ou não, o conceito já domina os frameworks modernos - Angular, Vue, Solid, Svelte todos convergem para essa abordagem.
React continua no caminho próprio, mas a pressão aumenta. O tempo dirá se o Virtual DOM se mantém competitivo ou se Signals se torna o padrão.
Para desenvolvedores, o conselho é: entenda o conceito agora. Seja qual for o resultado, reatividade granular é uma tendência clara.
Se você quer fortalecer sua base em JavaScript, confira nosso artigo sobre ES2026 e Temporal API para ver outras novidades importantes da linguagem.
Bora pra cima! 🦅
💻 Domine JavaScript de Verdade
O conhecimento que você adquiriu neste artigo é só o começo. Entender conceitos fundamentais como reatividade exige base sólida na linguagem.
Invista no Seu Futuro
Preparei material completo para você dominar JavaScript:
Formas de pagamento:
- 1x de R$27,00 sem juros
- ou R$27,00 à vista no Pix

