Skip to content
On this page

Comparison with Other Frameworks

How Inglorious Web stacks up against popular alternatives.

vs React

FeatureReactInglorious Web
ConceptComponent-basedEntity-based
RenderingVirtual DOMFull-tree re-render
StateComponent state + ReduxSingle entity store
Bundle Size60.4KB (gzipped)15.4KB (gzipped)
Learning CurveMediumLow
HooksRequiredNot needed
TestingComplex (mount, act)Trivial (trigger)
PerformanceGreat for large appsGreat for all apps
Signal ReactivityNoNo (full-tree)
SSR/SSG✅ Yes✅ Yes (SSX)
MobileReact NativeNot native

Example: Counter

React:

jsx
function Counter() {
  const [count, setCount] = useState(0)
  return (
    <div>
      <p>{count}</p>
      <button onClick={() => setCount(count + 1)}>+</button>
    </div>
  )
}
1
2
3
4
5
6
7
8
9

Inglorious Web:

javascript
const counter = {
  create(entity) {
    entity.count = 0
  },

  increment(entity) {
    entity.count++
  },
  render(entity, api) {
    return html`
      <div>
        <p>${entity.count}</p>
        <button @click=${() => api.notify("#counter:increment")}>+</button>
      </div>
    `
  },
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

When to Choose

Choose React if:

  • Building very large enterprise apps
  • Need React Native for mobile
  • Ecosystem is important
  • Team expertise is React

Choose Inglorious Web if:

  • Want simplicity and small bundle
  • Learning web development
  • Building traditional HTML apps
  • Testing speed matters
  • Prefer full-tree rendering

vs Vue

FeatureVueInglorious Web
ConceptComponent-basedEntity-based
RenderingVirtual DOMFull-tree
ReactivitySignals (Vue 3)Immutable mutations
Bundle Size47.2KB (gzipped)15.4KB (gzipped)
Learning CurveLowVery low
TemplatesVue templateslit-html + optional Vue plugin
TestingMount + assertionsTrigger + assertions
DevToolsYesYes (Redux DevTools)
TypeScript✅ Excellent✅ Excellent
SSR/SSG✅ Yes✅ Yes (SSX)

Example: Form

Vue:

vue
<template>
  <form @submit.prevent="handleSubmit">
    <input v-model="email" />
    <span v-if="errors.email">{{ errors.email }}</span>
    <button type="submit">Submit</button>
  </form>
</template>

<script>
export default {
  data() {
    return { email: "", errors: {} }
  },
  methods: {
    handleSubmit() {
      /* ... */
    },
  },
}
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

Inglorious Web:

javascript
const form = {
  async submit(entity, api) {
    entity.errors = validate(entity.values)
    if (!Object.keys(entity.errors).length) {
      // submit
    }
  },

  render(entity, api) {
    return html`
      <form @submit=${() => api.notify("#form:submit")}>
        <input
          value="${entity.values.email}"
          @input=${(e) => (entity.values.email = e.target.value)}
        />
        <span>${entity.errors.email || ""}</span>
        <button type="submit">Submit</button>
      </form>
    `
  },
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

When to Choose

Choose Vue if:

  • Like reactive/signal style
  • Want template syntax
  • Prefer component abstraction
  • Need extensive ecosystem

Choose Inglorious Web if:

  • Like imperative/mutation style
  • Prefer JavaScript-only
  • Want smaller bundle
  • Building simpler apps
  • Testing speed matters

vs Solid

FeatureSolidInglorious Web
ConceptSignal-basedEntity-based
ReactivityFine-grainedFull-tree
Bundle Size8.5KB (gzipped)15.4KB (gzipped)
PerformanceExcellentGreat
Learning CurveMediumVery low
JSXRequiredOptional
TestingModerateTrivial
Signals✅ Yes❌ No
Full-tree❌ No✅ Yes

Example: List

Solid:

jsx
const [todos, setTodos] = createSignal([])

return (
  <ul>
    <For each={todos()}>{(todo) => <li>{todo.title}</li>}</For>
  </ul>
)
1
2
3
4
5
6
7

Inglorious Web:

javascript
render(entity, api) {
  return html`
    <ul>
      ${repeat(entity.todos, (t) => t.id, (todo) =>
        html`<li>${todo.title}</li>`
      )}
    </ul>
  `
}
1
2
3
4
5
6
7
8
9

When to Choose

Choose Solid if:

  • Fine-grained reactivity is important
  • Bundle size is critical
  • Want JSX with signals
  • Building very reactive UIs

Choose Inglorious Web if:

  • Like full-tree simplicity
  • Want smallest footprint with good performance
  • Prefer mutation-based updates
  • Testing speed is priority
  • Learning new concepts

vs Svelte

FeatureSvelteInglorious Web
ConceptCompiler-based componentsEntity-based
SyntaxCustom (Svelte)JavaScript + lit-html
Bundle Size15KB (gzipped)15.4KB (gzipped)
Learning CurveMediumVery low
CompilerRequiredNo
ReactivitySignals-like (labeled statements)Full-tree
Scoped CSS✅ Built-in❌ Manual
TestingModerateTrivial

Example: Toggle

Svelte:

svelte
<script>
  let isOpen = false
</script>

<button on:click={() => isOpen = !isOpen}>
  {isOpen ? 'Close' : 'Open'}
</button>
1
2
3
4
5
6
7

Inglorious Web:

javascript
const toggle = {
  toggle(entity) {
    entity.isOpen = !entity.isOpen
  },
  render(entity, api) {
    return html`
      <button @click=${() => api.notify("#toggle:toggle")}>
        ${entity.isOpen ? "Close" : "Open"}
      </button>
    `
  },
}
1
2
3
4
5
6
7
8
9
10
11
12

When to Choose

Choose Svelte if:

  • Want scoped CSS
  • Like compiler-based approach
  • Prefer Svelte syntax
  • Want smallest bundle size

Choose Inglorious Web if:

  • Prefer pure JavaScript
  • No compiler complexity
  • Want trivial testing
  • Like entity-based architecture

vs Next.js

FeatureNext.jsInglorious Web + SSX
TypeMeta-frameworkFramework + SSX
BaseReactInglorious Web
RoutingFile-basedFile-based
SSR/SSG✅ Yes✅ Yes
API Routes✅ Yes❌ No
Bundle SizeLarge (React)Small
Learning CurveHighLow
EcosystemHugeSmall
TestingComplexTrivial

When to Choose

Choose Next.js if:

  • Building with React
  • Need API routes
  • Want large ecosystem
  • Building large applications

Choose Inglorious Web + SSX if:

  • Prefer simpler architecture
  • Want smaller bundle
  • Building static-heavy sites
  • Testing speed matters
  • Learning web development

vs Astro

FeatureAstroInglorious Web + SSX
TypeMeta-frameworkFramework + SSX
JS DefaultNone (islands)Needed for interactivity
Islands Arch✅ Yes❌ No
Bundle SizeTiny (default)Small
ComponentsMany (React, Vue, Svelte)Inglorious only
Learning CurveMediumLow
File Routing✅ Yes✅ Yes

When to Choose

Choose Astro if:

  • Want islands architecture
  • Love static-first approach
  • Want framework flexibility
  • Building content sites

Choose Inglorious Web + SSX if:

  • Want single framework consistency
  • Prefer entity-based patterns
  • Building traditional web apps
  • Want unified testing approach

Comparison Table

All frameworks side-by-side:

MetricInglorious WebReactVueSvelteSolid
Bundle (gzipped)15.4KB60.4KB47.2KB15KB8.5KB
PerformanceExcellentGreatGreatExcellentExcellent
JSXOptionalYesOptionalNoOptional
Batteries includedYesNoNoYesNo
ReactivityFull tree renderuseStateRefsSignalsSignals
State ManagementBuilt-inMultiple choicesMultiple choicesBuilt-inBuilt-in
Learning CurveVery LowMediumLowMediumMedium
TestingEasyHardMediumMediumMedium
ModelEntity-basedComponent-basedComponent-basedComponent-basedComponent-based
Job MarketTinyHugeLargeMediumSmall

Philosophy Comparison

React: "Learn once, write anywhere" — Components are reusable, but need complex state management.

Vue: "Progressive enhancement" — Gradually adopt complexity as needed.

Solid: "Fine-grained reactivity" — Maximize performance through signal tracking.

Svelte: "Write less code" — Compiler handles boilerplate.

Inglorious Web: "Simplicity first" — Entity-based, full-tree rendering, no magic. Perfect for learning and small-to-medium apps.

Migration Paths

From React

  • Change component props to entity properties
  • Use api.notify() instead of setState()
  • Replace component tree with entity renders
  • Remove Redux/Zustand (single store now)
  • Testing becomes much faster!

From Vue

  • Change templates to lit-html
  • Use api.notify() instead of event emitters
  • Replace components with entities
  • Remove Vuex (single store now)

From Solid

  • Replace signals with mutable entities
  • Use full-tree instead of fine-grained
  • Remove effects (no needed)
  • Single store instead of multiple atoms

Choose Inglorious Web If You Want

Simplicity — No signals, hooks, or complex patterns

Fast Testing — Trigger events and assert state

Small Bundle — 28KB for Web + Store + lit-html

Entity-Based — Consistent entity-centric architecture

Full-Tree Rendering — Predictable rendering flow

To Learn Web Dev — All web fundamentals, no framework magic

Type Composition — Extend behaviors without inheritance

Next Steps

Still deciding? Try all of them in a simple project and see which feels best to you! 🚀

Released under the MIT License.