v0.17.0
Release notes from CHANGELOG.md for @async/framework@0.17.0 (2026-07-08).
- Memoized boundary-element lookup in the loader:
loader.swap(...)resolved
its boundary id by walking the entire document on every swap (visible as a
full-document traversal per History selection); the element is now cached
weakly per id and re-resolved only when it leaves the document or loses its
boundary id. - Activation now scans a scope with a single tree traversal: pseudo-event
dispatch (attach/visible/intersect) reuses the shared element collection
instead of a second walk. Component-mounted children keep their own nested
scan. - The Vite plugin excludes the framework entrypoints from
optimizeDeps(opt out withoptimizeFrameworkDeps: true): the published
entrypoints are flat ESM bundles, and Vite's prebundle cache does not watch
file:/link:dependency contents — local framework rebuilds were served
stale untilnode_modules/.vitewas deleted by hand. - Navigation failures from intercepted links, forms, and history events are
now logged withconsole.error(they have no caller to reject to), and
unmatched navigation withoutfallback: "document"logs aconsole.warn
with guidance — previously both failed silently. - Added a commit stall watchdog:
loader._whenCommitted(...)warns
(commitStallWarningMs, default 2000ms,0/falsedisables) when a
boundary commit has not settled, naming the await-inside-scheduler.batch
deadlock composition so it is diagnosable instead of a silent freeze. router.prefetch(...)onserver: trueroutes now caches the fetched
envelope briefly (prefetchTtlMsoption, default 5000ms); the next
navigation with a matching URL and boundary consumes it single-use instead
of refetching.- Added
tests/performance/: deterministic hot-path performance contracts
(activation scan traversal counts, attribute-config memoization, swap
rescan scoping, scheduler/signal write coalescing, single frame wait per
commit batch, router fast-path work counts) plus a hot-path registry
(tests/performance/hot-paths.json). A coverage guardrail keeps the
registry, the// @hot-paths:headers in contract tests, and the
test.performancepipeline task inputs in sync, so changes to a registered
hot-path source automatically re-run the suite. The swap-rescan contracts
caught the boundary-lookup walk fixed above. - Categorized the test tree into suites —
tests/unit/,tests/runtime/,
tests/router/,tests/server/,tests/timing/,tests/performance/,
tests/build/, andtests/examples/— with matchingtest:<suite>
scripts (seetests/README.md). Added a dedicatedtests/timing/suite covering
rendering andrequestAnimationFramegotchas under explicit frame-timed
schedulers: suspended-frame fallbacks, exactly-once frame/fallback races,
FIFO commit ordering, commits scheduled inside open batches, loader swaps
with rebinding and ordering, handler-initiated swaps, signal/swap
coalescing, and router navigation (local partials, server partials with
sub-boundaries, suspended frames, popstate). - Bundle size from bundled TypeScript source:
browser.tsraw 261,577 B (261.6 KB / 0.262 MB), gzip 50,018 B (50.0 KB / 0.050 MB), br 41,211 B (41.2 KB / 0.041 MB) ->browser.min.jsraw 108,975 B (109.0 KB / 0.109 MB), gzip 32,004 B (32.0 KB / 0.032 MB), br 28,111 B (28.1 KB / 0.028 MB); delta raw -152,602 B (-152.6 KB / -0.153 MB), gzip -18,014 B (-18.0 KB / -0.018 MB), br -13,100 B (-13.1 KB / -0.013 MB).
Release evidence
- Release type: stable
- Package profile: framework-browser
- npm pack files: 61
| File | Raw | Gzip | Brotli |
|---|---|---|---|
browser.d.ts |
42.8 KB | 7.8 KB | 6.9 KB |
browser.js |
255.4 KB | 49.1 KB | 40.2 KB |
browser.min.js |
106.4 KB | 31.3 KB | 27.5 KB |
browser.ts |
255.4 KB | 49.2 KB | 40.2 KB |
browser.umd.js |
271.2 KB | 50.3 KB | 40.8 KB |
browser.umd.min.js |
108.0 KB | 31.4 KB | 27.5 KB |
framework.d.ts |
47.0 KB | 8.6 KB | 7.6 KB |
framework.ts |
407.5 KB | 77.8 KB | 61.9 KB |
server.js |
407.4 KB | 77.7 KB | 61.9 KB |
Diff links:
- browser.d.ts: https://github.com/async/framework/compare/HEAD%5E...v0.17.0?diff=unified#diff-browser.d.ts
- browser.js: https://github.com/async/framework/compare/HEAD%5E...v0.17.0?diff=unified#diff-browser.js
- browser.ts: https://github.com/async/framework/compare/HEAD%5E...v0.17.0?diff=unified#diff-browser.ts
- browser.umd.js: https://github.com/async/framework/compare/HEAD%5E...v0.17.0?diff=unified#diff-browser.umd.js
- framework.d.ts: https://github.com/async/framework/compare/HEAD%5E...v0.17.0?diff=unified#diff-framework.d.ts
- framework.ts: https://github.com/async/framework/compare/HEAD%5E...v0.17.0?diff=unified#diff-framework.ts
- server.js: https://github.com/async/framework/compare/HEAD%5E...v0.17.0?diff=unified#diff-server.js
Source: CHANGELOG.md in tag v0.17.0.