Instalação e Setup
Instalação via npm/bun
Section titled “Instalação via npm/bun”Usando Bun (Recomendado)
Section titled “Usando Bun (Recomendado)”bun add @ezbug/slashUsando npm
Section titled “Usando npm”npm install @ezbug/slashUsando pnpm
Section titled “Usando pnpm”pnpm add @ezbug/slashUsando yarn
Section titled “Usando yarn”yarn add @ezbug/slashConfiguração TypeScript
Section titled “Configuração TypeScript”Slash é TypeScript-first e requer TypeScript 5.0+. Configure seu tsconfig.json com as opções recomendadas:
{ "compilerOptions": { "target": "ES2022", "module": "ESNext", "moduleResolution": "bundler", "lib": ["ES2022", "DOM", "DOM.Iterable"], "strict": true, "esModuleInterop": true, "skipLibCheck": true, "resolveJsonModule": true, "isolatedModules": true, "jsx": "preserve", "jsxImportSource": "@ezbug/slash", "types": ["bun-types"] }}Opções importantes
Section titled “Opções importantes”target: "ES2022": Slash utiliza features modernas do JavaScriptstrict: true: Type safety completojsx: "preserve": Para uso com HTM (não é necessário transpilação JSX)moduleResolution: "bundler": Recomendado para Bun e bundlers modernos
Estrutura de Projeto Básica
Section titled “Estrutura de Projeto Básica”Client-Side Rendering (CSR)
Section titled “Client-Side Rendering (CSR)”Estrutura mínima para uma SPA:
my-slash-app/├── src/│ ├── main.ts # Entry point│ ├── App.ts # Root component│ └── components/│ └── Counter.ts├── index.html├── package.json└── tsconfig.jsonindex.html
Section titled “index.html”<!DOCTYPE html><html lang="pt-BR"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>My Slash App</title></head><body> <div id="app"></div> <script type="module" src="/src/main.ts"></script></body></html>src/main.ts
Section titled “src/main.ts”import { render } from '@ezbug/slash'import { App } from './App'
const root = document.getElementById('app')if (root) { render(App(), root)}src/App.ts
Section titled “src/App.ts”import { html } from '@ezbug/slash'import { Counter } from './components/Counter'
export const App = () => html` <div> <h1>Welcome to Slash!</h1> ${Counter()} </div>`src/components/Counter.ts
Section titled “src/components/Counter.ts”import { html, createState } from '@ezbug/slash'
export const Counter = () => { const count = createState(0)
return html` <div> <p>Count: ${count}</p> <button onclick=${() => count.set(count.get() + 1)}> Increment </button> </div> `}Server-Side Rendering (SSR)
Section titled “Server-Side Rendering (SSR)”Estrutura para aplicação com SSR:
my-slash-ssr/├── src/│ ├── server.ts # Server entry (Bun/Node)│ ├── client.ts # Client entry (hydration)│ ├── App.ts # Shared root component│ └── components/│ └── Counter.ts├── public/│ └── index.html├── package.json└── tsconfig.jsonsrc/server.ts
Section titled “src/server.ts”import { renderToString } from '@ezbug/slash'import { App } from './App'
const server = Bun.serve({ port: 3000, async fetch(req) { const html = renderToString(App())
return new Response(` <!DOCTYPE html> <html lang="pt-BR"> <head> <meta charset="UTF-8"> <title>My SSR App</title> </head> <body> <div id="app">${html}</div> <script type="module" src="/client.js"></script> </body> </html> `, { headers: { 'Content-Type': 'text/html' } }) }})
console.log(`Server running at http://localhost:${server.port}`)src/client.ts
Section titled “src/client.ts”import { render } from '@ezbug/slash'import { App } from './App'
const root = document.getElementById('app')if (root) { // Hydrate existing DOM from server render(App(), root)}Templates de Projeto
Section titled “Templates de Projeto”Slash fornece templates prontos para uso:
Template SPA (slash-spa)
Section titled “Template SPA (slash-spa)”# Clone o templategit clone https://github.com/ezbug/slash-spa my-appcd my-app
# Instale dependênciasbun install
# Execute em desenvolvimentobun run dev
# Build para produçãobun run buildLocalização no monorepo: packages/slash-spa
Template SSR (slash-ssr)
Section titled “Template SSR (slash-ssr)”# Clone o templategit clone https://github.com/ezbug/slash-ssr my-ssr-appcd my-ssr-app
# Instale dependênciasbun install
# Execute servidor de desenvolvimentobun run dev
# Build e serve em produçãobun run buildbun run startLocalização no monorepo: packages/slash-ssr
Build Setup
Section titled “Build Setup”Com Bun (Recomendado)
Section titled “Com Bun (Recomendado)”Bun tem suporte nativo para Slash através do export "bun" no package.json:
{ "exports": { ".": { "bun": "./src/index.ts", "import": "./dist/index.mjs" } }}Quando usar Bun como runtime, o source TypeScript é carregado diretamente sem build.
Com Vite
Section titled “Com Vite”bun add -D viteimport { defineConfig } from 'vite'
export default defineConfig({ esbuild: { jsxFactory: 'h', jsxFragment: 'Fragment', jsxInject: `import { h } from '@ezbug/slash'` }})Com esbuild
Section titled “Com esbuild”bun add -D esbuildimport * as esbuild from 'esbuild'
await esbuild.build({ entryPoints: ['src/main.ts'], bundle: true, outfile: 'dist/bundle.js', format: 'esm', target: 'es2022'})Verificação da Instalação
Section titled “Verificação da Instalação”Crie um arquivo de teste para verificar se tudo está funcionando:
import { h, html, createState, render } from '@ezbug/slash'
console.log('✅ Imports OK')
const state = createState(42)console.log('✅ State created:', state.get())
const element = html`<div>Hello Slash!</div>`console.log('✅ HTM working:', element)
const hElement = h('div', null, 'Hello from h()')console.log('✅ Hyperscript working:', hElement)Execute:
bun run test.tsSaída esperada:
✅ Imports OK✅ State created: 42✅ HTM working: [object HTMLDivElement]✅ Hyperscript working: [object HTMLDivElement]Troubleshooting
Section titled “Troubleshooting”Erro: Cannot find module ‘@ezbug/slash’
Section titled “Erro: Cannot find module ‘@ezbug/slash’”Solução: Verifique se a instalação foi concluída:
bun installErro: TypeScript não reconhece tipos
Section titled “Erro: TypeScript não reconhece tipos”Solução: Adicione "types": ["bun-types"] no tsconfig.json e rode:
bun install @types/bun --devErro: htm template not working
Section titled “Erro: htm template not working”Solução: Certifique-se de importar html de @ezbug/slash:
import { html } from '@ezbug/slash'Performance ruim em desenvolvimento
Section titled “Performance ruim em desenvolvimento”Solução: Use Bun para desenvolvimento (carrega TypeScript diretamente):
bun run src/main.tsPróximos Passos
Section titled “Próximos Passos”Agora que seu ambiente está configurado, aprenda a:
- Renderização Básica - Criar e renderizar elementos
- Sistema de Estado - Gerenciar estado reativo
- Componentes - Construir componentes reutilizáveis