Signals, Web Components, routing, forms, motion, runtime-agnostic SSR and a dependency-free server — 23 tree-shakeable entry points behind the $() you already know. A bundler is a choice, not a prerequisite.
install
npm install @bquery/bquerybun add @bquery/bquerypnpm add @bquery/bquery<script type="module">
import { $, signal, effect } from 'https://unpkg.com/@bquery/bquery@1/dist/full.es.mjs';
</script>Node ≥ 24 · Bun ≥ 1.4 · Deno · edge · evergreen browsers — support matrix
import { $, effect, signal } from '@bquery/bquery';
const count = signal(0);
// No virtual DOM: the effect writes straight to
// the element it read, and nothing else re-renders.
effect(() => {
$('#counter').text(`Count: ${count.value}`);
});
$('#counter').on('click', () => {
count.value++;
});import { createServer } from '@bquery/bquery/server';
const app = createServer();
app.get('/', async (ctx) => {
return ctx.renderResponse(`<h1 bq-text="message"></h1>`, {
message: 'Hello from bQuery SSR',
});
});
// No framework dependencies. Runs on Node, Bun or Deno.
await app.listen({ port: 3000 });<button id="counter">Count: 0</button>
<script type="module">
import { $, signal, effect } from 'https://unpkg.com/@bquery/bquery@1/dist/full.es.mjs';
const count = signal(0);
effect(() => $('#counter').text(`Count: ${count.value}`));
$('#counter').on('click', () => count.value++);
</script>bQuery keeps the ergonomics that made $() stick — a typed, chainable wrapper around real DOM nodes — and puts fine-grained reactivity, components, routing and SSR underneath it.
| You want… | bQuery gives you |
|---|---|
| A jQuery-style DOM API on reactive primitives | $(selector) returns a typed BQueryElement; signals and effects join the same chain — no virtual DOM, no diffing pass. |
| Zero build for small projects | One <script type="module"> from a CDN. No Vite, no bundler, no transpiler. |
| A real framework once the project grows | 23 tree-shakeable entry points: routing, state, forms, SSR, server, motion, a11y, i18n, devtools, testing, plugins. |
| One stack for client and server | @bquery/bquery/ssr and /server render and serve from the same runtime — Node, Bun, Deno or edge. |
| Security defaults that don't fight you | Every HTML-writing API sanitizes untrusted input; Trusted Types and CSP-friendly patterns are first-class. |
| Predictable bundle size | Zero runtime dependencies, sideEffects: false, one entry point per module. /full exists for CDN consumers only. |
A signal write notifies exactly the computeds and effects that read it. Effects write to the elements they touched. There is no component re-render to opt out of.
import { batch, computed, effect, signal } from '@bquery/bquery/reactive';
const items = signal([{ done: false }, { done: true }]);
const open = computed(() => items.value.filter((item) => !item.done).length);
effect(() => {
console.log(`${open.value} open`); // runs once now, then on every change
});
batch(() => {
items.value = [...items.value, { done: false }]; // one notification,
items.value = [...items.value, { done: false }]; // not two
});Read the whole model in Reactivity, or the API surface in reactive.
Every public module is its own sub-path export with its own types, so bundlers drop what you never touch. The root entry is a convenience, not a requirement.
01
DOM, reactivity, threads, sanitization
02
Components, directives, motion, input
03
Routing, state, forms, locale, a11y
04
Node, Bun, Deno, edge
05
Inspect and verify
Batteries included means the boring parts are already solved — sanitization, focus management, locale negotiation, request dedup, worker pools, hydration.
Load ES modules from a CDN and ship. Vite, Rollup and friends stay optional — never a prerequisite.
Signals, computed values, scopes, batching, debounced and throttled watchers. No virtual DOM, no diffing pass.
HTTP client, request dedup, polling, pagination, WebSocket and SSE composables, REST helpers.
Typed custom elements with scoped reactivity, slots, refs and lifecycle hooks — plus a previewable default library.
Every HTML-writing API sanitizes untrusted input. Trusted Types and CSP-friendly patterns ship in the box.
Zero-build worker tasks, RPC helpers, bounded pools, reactive worker state and CSP-safe module workers.
SPA routing with guards and typed navigation results, plus signal-based state with persistence and plugins.
Reactive form state with schema validation, ICU messages and locale negotiation, focus traps and WCAG audits.
Runtime-agnostic rendering and streaming, plus a dependency-free backend with sessions and WebSockets.
Springs, tweens, FLIP, timelines and parallax; drag-and-drop with real keyboard accessibility.
Timeline inspection, signal and store diffs, snapshot import/export, component mounts and userEvent helpers.
Zero runtime dependencies, sideEffects: false, one entry point per module. The /full bundle is CDN-only.
You do not have to adopt the whole framework at once. Start where your app is, and compose more modules in when you need them.