A JavaScript Framework With No Build Step
No npm install. No webpack, vite, or bundler config. No compiler between your code and the browser. Six tiers, from a 46 KB interactive-widget build up to a full build with SSR and routing, and every one of them is still just a script tag.
What "No Build Step" Actually Means
A lot of frameworks say they're lightweight and still hand you a package.json. WildflowerJS doesn't. There is no compilation stage between the code you write and the code the browser runs:
No npm install
Using WildflowerJS in a page requires zero packages. Point a <script> tag at the file, self-hosted or from a CDN, and it runs.
No compiler
No JSX, no .vue single-file components, no template-to-render-function step. What you write in the HTML file is what the browser parses.
Works from a plain file
Double-click the HTML file and it runs in the browser. No dev server required to get started, no port to remember, no terminal to keep open.
No config files
No vite.config.js, no webpack.config.js, no .babelrc. There's nothing to configure because there's nothing to build.
The Complete Setup
This is the entire toolchain. Not a simplified excerpt: the whole thing.
<!DOCTYPE html>
<html>
<head>
<script src="https://cdn.jsdelivr.net/npm/wildflowerjs@1/dist/wildflower.min.js"></script>
</head>
<body>
<div data-component="hello">
<p>Hello, <span data-bind="name">World</span>!</p>
<input data-model="name" placeholder="Enter your name">
</div>
<script>
wildflower.component('hello', {
state: { name: 'World' }
});
</script>
</body>
</html>
Save that as a .html file and open it. Typing in the input updates the greeting live. There's no second step where this code gets transformed into different code before it runs. This is the code that runs.
What You Don't Give Up
Most script-tag libraries earn "no build step" by staying small in scope: a bit of DOM sugar, maybe two-way binding, and that's the ceiling. Reach for routing, server-side rendering, or shared state across components, and you're back to reaching for a bundler.
WildflowerJS scales up instead of switching approaches. Every tier below is still a single <script> tag, and the ceiling goes all the way to server-side rendering:
- Components and stores, with the full lifecycle (init, destroy, update hooks), computed properties, props-based composition, error boundaries, and shared state, in every tier, starting from the smallest
- Forms and events, including native browser validation and cross-field rules on
data-model, plus a directive and hook system for extending the framework itself, in every tier - Lists with keyed reconciliation, including nested lists, from the
minitier up - Entity pools for high-throughput, per-frame workloads like simulations and games, from the
litetier up - Plugins, portals, and transitions from the standard tier up
- Routing for multi-page single-page apps, in the
spaandfulltiers - Server-side rendering and live data queries, so the same markup can be rendered ahead of time and hydrated in the browser, in the
fulltier
None of it requires a compilation step to unlock, at any tier. It's in the file you link.
The Real Numbers
Here's what actually crosses the network, compressed, for every tier:
| Build | What it adds | Transferred (Brotli) |
|---|---|---|
wildflower.nano.min.js |
Reactive state, computed properties, binding, forms, components, stores | 46.2 KB |
wildflower.mini.min.js |
+ Lists, with keyed reconciliation | 67.5 KB |
wildflower.lite.min.js |
+ Entity pools, for per-frame and high-throughput rendering | 71.5 KB |
wildflower.min.js |
+ Plugins, portals, transitions | 74.8 KB |
wildflower.spa.min.js |
+ Routing | 79.2 KB |
wildflower.full.min.js |
+ Server-side rendering, live data queries | 85.1 KB |
Each tier is the whole framework at that size, not a render layer with the rest bolted on separately. Nothing else to add for state management or forms at any tier; reach for spa or full only when you actually need routing or server-side rendering.
Why This Matters Beyond Convenience
Skipping the build step isn't just faster to start. It changes what can go wrong later:
No supply chain to inherit
- No
node_modules, no transitive dependency graph - No postinstall scripts running on your machine or in CI
- Nothing to audit but the one file you already chose to trust
Nothing to come back and fix
- A project you open in a year still runs; there's no toolchain to have gone stale
- No dependency bump breaks the build, because there's no build
- What you shipped is what's still running
Try It Now
The example above is the complete quickstart. From here: