Quick Start
Create a New Project
npx @evjs/create-app my-app
cd my-app && npm install
Both arguments are optional — if omitted, the CLI prompts interactively.
Available Templates
| Template | Description |
|---|---|
basic-csr | Client-side rendering only, no server functions |
basic-server-fns | Minimal server functions with "use server" |
configured-server-fns | Server functions with ev.config.ts + Query proxy |
complex-routing | Params, search, layouts, loaders, nested routes |
with-tailwind | Tailwind CSS via plugin loaders |
Development
ev dev
Your browser opens to http://localhost:3000 with Hot Module Replacement. Server functions in *.server.ts files are auto-discovered — no config needed.
Production Build
ev build
Project Structure
my-app/
├── index.html # HTML template (must have <div id="app">)
├── ev.config.ts # Optional config
├── src/
│ ├── main.tsx # App bootstrap
│ ├── global.ts # Global typings & transport init
│ ├── pages/ # Route pages (file-based routing)
│ │ ├── __root.tsx # Root layout
│ │ └── home.tsx # Home page (index route)
│ └── api/ # Server function files
│ └── *.server.ts
├── package.json
└── tsconfig.json
App Bootstrap
// src/main.tsx
import { createApp } from "@evjs/client";
import { rootRoute } from "./pages/__root";
import { homeRoute } from "./pages/home";
import "./global";
const routeTree = rootRoute.addChildren([homeRoute]);
const app = createApp({ routeTree });
app.render("#app");
// src/global.ts
import { initTransport } from "@evjs/client";
declare module "@tanstack/react-router" {
interface Register {
router: any;
}
}
Packages
| Package | Purpose |
|---|---|
@evjs/cli | CLI binary (ev dev, ev build) |
@evjs/ev | Config, plugin, and bundler types (defineConfig) |
@evjs/create-app | Project scaffolding (npx @evjs/create-app) |
@evjs/client | Client runtime (React + TanStack) |
@evjs/server | Server runtime (Hono) |
@evjs/build-tools | Server function transforms |
@evjs/bundler-webpack | Webpack adapter |
@evjs/manifest | Shared manifest schema |
Required Dependencies
{
"dependencies": {
"@evjs/client": "0.0.0",
"@evjs/server": "0.0.0",
"react": "^19.0.0",
"react-dom": "^19.0.0"
},
"devDependencies": {
"@evjs/cli": "*",
"@types/react": "^19.0.0",
"@types/react-dom": "^19.0.0",
"typescript": "^6.0.2"
}
}
Key Rules
- Config file:
ev.config.ts(notevjs.config.ts) - Import
defineConfigfrom@evjs/ev, not from@evjs/server - HTML must have
<div id="app">for the render target - Do NOT add
"type": "module"to your project'spackage.json— the server bundle uses CJS format src/main.tsxshould be minimal — define routes inpages/