Vite 8.3.5 was marked Latest on the GitHub releases page on October 21. It is a patch, but a large one: the release notes list roughly twenty fixes, one performance change, a lint migration and a handful of refactors. The theme is visible in the scope tags: seven entries are tagged bundled-dev, the experimental mode that serves a Rolldown bundle during development instead of unbundled modules. If you opted into it, this is the release to read. If you did not, several other fixes still apply to you.
Bundled dev: what got fixed
The notes list these bundled-dev entries:
server.originis now applied to asset URLs (#23683).- The fallback page declares a UTF-8 charset (#23846).
build.chunkImportMapis ignored in this mode (#23685).- User-defined
import.meta.envvalues are included in theimport.meta.envobject (#23713). - Forwarded error stacks are mapped through the bundle's source maps (#23741).
- Served output files are normalised (#23684).
- HMR propagation stops at modules that are no longer imported (#23839).
The last one deserves attention. Propagation that continues through a module nobody imports any more is the kind of bug that shows up as a stale update or a reload that should have been a hot update. The notes give only the title, so I would not claim more than that. The import.meta.env fix is similar: if you read user-defined values off that object, a missing key in bundled dev was a mode-specific difference worth re-testing.
A practical stance for a team using this mode: pin the minor version, keep the default dev server one script away, and run your smoke tests against both. The notes name the mode but do not say how to enable it, and I did not fetch the docs for it, so check the Vite guide for the current switch.
Chunk import maps
Two build fixes concern chunk import maps:
- A missing chunk import map is now handled (#23777).
- Preload dependencies are included when hashing the chunk import map (#23793).
The second matters for cache correctness. A content hash that ignores a dependency of the chunk can leave a stale URL in the map while the file behind it changed. Again, the notes give titles only, not failure scenarios. The conservative advice: if you enabled build.chunkImportMap, rebuild after upgrading and diff the emitted map and chunk names between 8.3.4 and 8.3.5 before you ship.
Resolver, CSS and server
Smaller fixes that can affect ordinary projects:
- Subpath imports with more than one
#now resolve (#23631), andresolve.exportsmoved to 2.0.4 (#23739). If you usepackage.jsonimportswith unusual keys, this is relevant. - A literal
%inside CSSurl()no longer fails (#23676). - The server strips
baseonly when the path matches a full segment (#23641). My reading is that withbase: "/app", a request for/application.jsshould no longer be treated as/lication.js. The notes do not spell that out, so test it if you serve under a sub-path. - Socket errors on upgrade requests that the HMR server does not take are handled (#23728). That affects projects that run their own WebSocket endpoint next to Vite.
Optimizer
The dependency optimizer received four changes, mostly around lockfile detection:
- It falls back to
yarn.lockfor the lockfile hash (#23667), and skips the patches directory check in that fallback (#23725). - It skips the patches directory hash for
nublockfiles (#23761). - It scans
oxc.jsxInjectimports (#23758).
The lockfile hash decides when pre-bundled dependencies are invalidated, so a wrong or missing hash means either needless re-optimisation or stale dependencies. The oxc.jsxInject fix matters if you inject an import through that option: my inference is that such imports were not being scanned for discovery, which is how you end up with a late "new dependency found" reload in dev.
Performance, lint and internals
The one performance change: SSR now extracts inline source maps without a regular expression (#23775). No numbers were published, so measure on your own app before expecting anything.
Housekeeping you may notice in the repo or in a lockfile diff:
- Vite itself migrated to Oxlint (#23746).
@vercel/detect-agentwas replaced withstd-env(#23744), which swaps one dependency in the graph.- Several dev-server refactors consolidated ModuleURL and BrowserURL handling (#23790, #23791, #23815, #23828). They are internal, but they are the shared paths for import resolution and HTML transforms, so any regression would likely show up there.
Upgrade notes
- Update in a branch and run a production build. Compare chunk names and any import map output with your last good build.
- If you use bundled dev, test HMR after removing an import mid-session.
- If you serve under a custom
base, request a path that merely starts with the same characters as the base. - If you use Yarn, clear
node_modules/.viteonce, since the lockfile-hash fallback is new. This is cautious advice, not something the notes require.
Also on the releases page: Vite 6.4.5 (October 21) with no notes beyond a pointer to the changelog, and create-vite@9.3.1 (October 20), which pins TypeScript to v6 for now according to its commit title. That ties into yesterday's post on the TypeScript 7 rollback.