Skip to content

feat(dev-server): /@ng/component endpoint + HMR runtime bus (#145) - #186

Merged
lukekania merged 2 commits into
milestone/v0.11.0-builder-parityfrom
feat/hmr-component-endpoint
Jun 9, 2026
Merged

feat(dev-server): /@ng/component endpoint + HMR runtime bus (#145)#186
lukekania merged 2 commits into
milestone/v0.11.0-builder-parityfrom
feat/hmr-component-endpoint

Conversation

@lukekania

Copy link
Copy Markdown
Owner

Runtime scaffolding for component-level HMR (#145), ahead of the compiler codegen that populates it. Stacked on #185.

Changes

  • dev-server: new DevServerEvent::ComponentUpdate { id, timestamp }event: angular:component-update SSE frame; a shared ComponentUpdates registry (id → update-module source) on DevServerConfig, served at GET /@ng/component?c=<id> (text/javascript, empty 200 for unknown ids, 400 when c is absent) — mirrors @angular/build's component middleware.
  • client: the injected script publishes a window.__ngcHmr bus and dispatches angular:component-update to registered handlers; new HMR_RUNTIME_PRELUDE binds import.meta.hot to that bus.
  • serve: share the registry with the dev server and prepend the runtime prelude to the entry chunk on each HMR build so per-component initializers can resolve import.meta.hot.

Scope

The registry stays empty and component edits still trigger a full reload until the template-compiler emits update modules (next slice, stacked on this branch).

Tests

  • dev-server: angular:component-update SSE frame shape; query_param raw-encoded extraction; /@ng/component endpoint (registered id → module, unknown → empty 200, missing c → 400); client exposes the __ngcHmr bus + prelude.

Targets the milestone branch via the stack; retarget to it once #185 merges.

lukekania added 2 commits June 8, 2026 17:00
First slice of Hot Module Replacement: read the `hmr` flag and hot-swap
global stylesheets in place without a full page reload.

- project-resolver: parse `architect.serve.options.hmr` (base + active
  serve configuration override) into `ResolvedAngularProject.hmr`;
  defaults to false.
- cli: add `--hmr` / `--no-hmr` to `serve` (CLI wins over angular.json,
  else inherit, else false). When HMR is on and a rebuild touches only
  global stylesheet entries, emit a CSS-update instead of a reload.
- dev-server: new `DevServerEvent::CssUpdate { timestamp }` →
  `event: css-update` SSE frame; the injected client swaps the
  `styles.css` <link> with a cache-busted href, preserving page state.

Component template/style HMR and the `/@ng/component` update endpoint
land in follow-up slices on the milestone branch.
Runtime scaffolding for component-level HMR, ahead of the compiler
codegen that populates it.

- dev-server: new `DevServerEvent::ComponentUpdate { id, timestamp }` →
  `event: angular:component-update` SSE frame; a shared `ComponentUpdates`
  registry (id → update-module source) on `DevServerConfig`, served at
  `GET /@ng/component?c=<id>` (text/javascript, empty 200 for unknown ids,
  400 when `c` is absent) — mirrors @angular/build's component middleware.
- client: the injected script publishes a `window.__ngcHmr` bus and
  dispatches `angular:component-update` to registered handlers; new
  `HMR_RUNTIME_PRELUDE` binds `import.meta.hot` to that bus.
- serve: share the registry with the dev server and prepend the runtime
  prelude to `main.js` on each HMR build so per-component initializers can
  resolve `import.meta.hot`.

The registry stays empty and component edits still trigger a full reload
until the template-compiler emits update modules (next slice).
@lukekania
lukekania changed the base branch from feat/hmr-config-css-swap to milestone/v0.11.0-builder-parity June 9, 2026 14:09
@lukekania
lukekania merged commit 8aeb49f into milestone/v0.11.0-builder-parity Jun 9, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant