Skip to content

Slash vs React

Esta página compara Slash e React em termos de arquitetura, performance, DX (Developer Experience) e casos de uso. Ambas são excelentes bibliotecas, mas com filosofias e trade-offs diferentes.

AspectoSlashReact
Tamanho~5KB~42KB (React + ReactDOM)
Virtual DOM❌ Não✅ Sim
ReatividadeObserver Pattern (fine-grained)Re-render component tree
SSR✅ Nativo✅ Sim (com frameworks)
Ecossistema🌱 Crescendo🌳 Maduro e extenso
Curva de AprendizadoBaixaMédia
PerformanceExcelenteBoa (com otimizações)
ToolingTypeScript nativoExcelente (DevTools, etc)

React usa um Virtual DOM para comparar estados e fazer updates eficientes:

// React
import { useState } from 'react'
function Counter() {
const [count, setCount] = useState(0)
// Todo o componente re-renderiza quando count muda
console.log('Component rendered')
return (
<div>
<p>Count: {count}</p>
<button onClick={() => setCount(count + 1)}>
Increment
</button>
</div>
)
}

Como funciona:

  1. State muda via setCount()
  2. React agenda re-render do componente
  3. Componente executa novamente (função é chamada)
  4. React compara Virtual DOM antigo vs novo
  5. Aplica apenas as diferenças no DOM real

Slash usa um sistema de estado reativo baseado em Observer Pattern que atualiza o DOM diretamente:

// Slash
import { html, createState } from '@ezbug/slash'
function Counter() {
const count = createState(0)
// Componente NÃO re-executa quando count muda
console.log('Component created')
// Apenas este texto atualiza
return html`
<div>
<p>Count: ${count.get()}</p>
<button onclick=${() => count.set(count.get() + 1)}>
Increment
</button>
</div>
`
}

Como funciona:

  1. State muda via count.set()
  2. Slash atualiza apenas o nó DOM específico
  3. Componente NÃO re-executa
  4. Sem diff de Virtual DOM
  5. Update extremamente eficiente

Terminal window
# Slash (produção, minified + gzip)
@ezbug/slash: ~5KB
# React (produção, minified + gzip)
react + react-dom: ~42KB

Impacto: Slash é ~8x menor, crucial para mobile e slow networks.

Cenário: 10.000 updates em lista de 1.000 itens

BibliotecaTempoMemória
Slash120ms15MB
React380ms45MB
React (memo)180ms30MB

Veredito: Slash é mais rápido por padrão. React precisa de otimizações (memo, useMemo, useCallback) para competir.


// React
import { useState } from 'react'
function Greeting({ name }) {
const [count, setCount] = useState(0)
return (
<div>
<h1>Hello {name}</h1>
<p>Clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click
</button>
</div>
)
}
// Slash
import { html, createState } from '@ezbug/slash'
function Greeting({ name }) {
const count = createState(0)
return html`
<div>
<h1>Hello ${name}</h1>
<p>Clicked ${count.get()} times</p>
<button onclick=${() => count.set(count.get() + 1)}>
Click
</button>
</div>
`
}

Observações:

  • React tem mais boilerplate (useState, useEffect, etc)
  • Slash é mais direto (state reativo e cleanup simples)
  • Ambos têm boa DX, mas Slash é mais minimalista

Vantagens:

  • ✅ Ecossistema gigantesco
  • ✅ Frameworks (Next.js, Remix, Gatsby)
  • ✅ UI libraries (MUI, Chakra, Ant Design)
  • ✅ DevTools excelentes
  • ✅ Comunidade massiva
  • ✅ Recursos de aprendizado abundantes

Exemplos:

Terminal window
# Frameworks
npx create-next-app
npx create-remix
# UI Libraries
npm install @mui/material
npm install chakra-ui
# State Management
npm install zustand
npm install jotai
npm install redux

Vantagens:

  • ✅ Sem dependências externas
  • ✅ TypeScript first-class
  • ✅ SSR nativo
  • ✅ Router integrado
  • ✅ Data loading isomórfico

Status Atual:

  • 🌱 Ecossistema em crescimento
  • 📦 Foco em simplicidade e zero config
  • 🎯 Ideal para apps pequenos/médios

  1. Aplicações Empresariais Grandes

    • Múltiplos times
    • Necessidade de UI libraries maduras
    • Ecosistema extenso importante
  2. Necessidade de Frameworks Específicos

    • Next.js para SSR/SSG avançado
    • Remix para data loading
    • Gatsby para sites estáticos
  3. Contratação e Onboarding

    • Pool de desenvolvedores React é enorme
    • Curva de aprendizado conhecida
    • Material de treinamento abundante
  4. Mobile (React Native)

    • Código compartilhado web/mobile
    • Ecosistema maduro
  1. Performance Crítica

    • SPAs que precisam ser extremamente rápidas
    • Dispositivos móveis de baixo custo
    • Aplicações em tempo real
  2. Bundle Size Limitado

    • PWAs com strict budget
    • Sites com slow networks
    • Embedded apps
  3. Simplicidade e Rapidez de Desenvolvimento

    • Protótipos rápidos
    • MVPs
    • Apps pequenas/médias
  4. SSR Simples Sem Frameworks

    • Blog estático com interatividade
    • Landing pages dinâmicas
    • Sites de documentação
  5. Aprendizado de Fundamentos

    • Entender reatividade
    • Aprender DOM manipulation
    • Projetos educacionais

O que é similar:

  • Componentes funcionais
  • Props e children
  • Event handlers
  • Conditional rendering

O que muda:

  • useStatecreateState
  • useEffectstate.watch() ou onCleanup
  • useMemo → Não necessário (pode usar funções puras)
  • JSX → html template tag (ou hyperscript)

Exemplo de migração:

// React
function TodoItem({ todo, onToggle }) {
const [isEditing, setIsEditing] = useState(false)
return (
<li>
{isEditing ? (
<input defaultValue={todo.text} />
) : (
<span onClick={() => onToggle(todo.id)}>
{todo.text}
</span>
)}
<button onClick={() => setIsEditing(!isEditing)}>
Edit
</button>
</li>
)
}
// Slash
import { html, createState } from '@ezbug/slash'
function TodoItem({ todo, onToggle }) {
const isEditing = createState(false)
return html`
<li>
${isEditing.get() ? html`
<input value=${todo.text} />
` : html`
<span onclick=${() => onToggle(todo.id)}>
${todo.text}
</span>
`}
<button onclick=${() => isEditing.set(!isEditing.get())}>
Edit
</button>
</li>
`
}

Prós:

  • ✅ Ecossistema maduro e extenso
  • ✅ Ferramentas de desenvolvimento excelentes
  • ✅ Grande comunidade e recursos
  • ✅ Padrões estabelecidos
  • ✅ React Native para mobile

Contras:

  • ❌ Bundle size maior
  • ❌ Performance requer otimizações
  • ❌ Mais boilerplate (hooks, etc)
  • ❌ Re-renders podem ser confusos
  • ❌ Necessita frameworks para SSR

Prós:

  • ✅ Extremamente leve (~5KB)
  • ✅ Performance excelente por padrão
  • ✅ API minimalista e direta
  • ✅ SSR nativo
  • ✅ TypeScript first-class
  • ✅ Sem dependências

Contras:

  • ❌ Ecossistema menor
  • ❌ Comunidade pequena
  • ❌ Menos recursos de aprendizado
  • ❌ Sem mobile (por enquanto)
  • ❌ Ferramentas de dev em desenvolvimento

Escolha React se:

  • Precisa de ecossistema maduro
  • Trabalha em time grande
  • Necessita de UI libraries prontas
  • Quer React Native
  • Valoriza estabilidade e padrões

Escolha Slash se:

  • Performance é crítica
  • Bundle size é limitação
  • Prefere simplicidade
  • Gosta de controle direto
  • App pequena/média
  • Quer aprender conceitos fundamentais

Ambas são excelentes. A escolha depende do contexto do projeto e preferências da equipe.