Changes
- fix(app-vite): bex -> the bridge now recovers on its own after the MV3 background script is terminated. Chrome (service worker) and Firefox (event page) shut the background down after ~30s of inactivity, taking every bridge port with it, and nothing ever came back: content script and app bridges stayed disconnected forever, while a revived background only knew about the port that woke it up. Store policies forbid keeping the background alive, so recovery happens inside the event-driven model instead: a (re)started background broadcasts a one-off message asking previously connected bridges to re-establish their ports, and a client bridge that lost its connection without an explicit
disconnectFromBackground()reconnects transparently on its nextsend()(which also wakes the background up; concurrent calls share one connection attempt).send()also waits up to 1s for a target port that is not registered yet, covering ports that re-register right after a background restart. Cleanup after a failed connection was removing theonDisconnecthandler from the wrong port event, which is fixed too (#17932) - fix(app-vite): ssr/ssg -> stylesheets of shared chunks are now linked in the server-rendered HTML. Vite's SSR manifest only maps a module id to the files of the chunk that module ended up in, so as soon as a dependency is used from more than one place its CSS is hoisted into a shared chunk that is unreachable from
ssrContext.modules-- the typical shape of an external component library used on several pages. The stylesheet then arrived only after hydration, as a flash of unstyled content.quasar.manifest.jsonis now assembled from both manifests Vite generates for the client build, completing each entry with the CSS of the chunks it statically imports (dynamic imports stay out, and so does CSS the HTML shell already carries). The CSS list is rebuilt depth-first through the static import graph rather than appended, so a dependency's rules land before the importer's and a server-rendered page cascades exactly like the same page reached through client-side navigation (#18171) - fix(app-vite): dev server -> SSR/SSG-specific options are no longer ignored while the dev server runs. The mode flags live under
ctx.mode, so both conditionals guarding those diffs were always falsy: changingssr.pwa,ssr.middlewares, themanualStore*family,manualPostHydrationTrigger, or the SSR/SSG offline filename and service worker extenders silently did nothing (no entry regeneration, no service worker rebuild) until a full restart - fix(app-vite): dev server -> reworked run/queue pipeline, fixing several long-standing rough edges. Watcher-triggered rebuilds (PWA manifest and custom service worker, BEX manifest, scripts and firefox UI, SSR webserver boots) now serialize with quasar.config-change runs instead of interleaving with them, and always act on the latest config rather than the one captured when the watcher was created. Toggling
ssr.pwa/ssg.pwawhile dev is running now works in both directions -- off-then-on previously left a stale snapshot so nothing recompiled, and disabling left the watchers running. A failed watcher rebuild no longer deadens every subsequent rebuild, and a failure while applying quasar.config changes no longer takes the dev server down through an unhandled rejection: both are logged and the server keeps serving. Rapid successive quasar.config edits now supersede cleanly (an obsolete run aborts at the next checkpoint, the newest config always wins) and duplicate pending rebuilds coalesce.clientNeedsReloadsemantics are now consistent across all modes (bex and pwa included), removing a redundant full reload right after a server reboot, and the SSR webserver reboots exactly when its own inputs change - fix(app-vite): types -> the
ssr/ssg > manualPostHydrationTriggerJSDoc now points out that it is needed when a Suspense boundary delays hydration (asyncsetup()), and that the hook should then be called from the boundary's@resolve. Full recipe on the SSR and SSG configuring pages (#17961)
Donations
Quasar Framework is an open-source MIT-licensed project made possible due to the generous contributions by sponsors and backers. If Quasar is useful in your workflow and you want to support ongoing maintenance, please consider the following: