Vite 8.1.0 Stable Adds Bundled Dev Mode (15x Startup on 10k React Components), Ships WASM ESM Imports and Chunk Import Map, Extends server.fs.deny With .npmrc and Private Keys

Vite 8.1.0 Stable Adds Bundled Dev Mode (15x Startup on 10k React Components), Ships WASM ESM Imports and Chunk Import Map, Extends server.fs.deny With .npmrc and Private Keys

lschvn

Vite 8.1.0 stable, published 2026-06-23 by github-actions from the v8.1.0 tag (commit 63b1489, release: v8.1.0), is the first feature release on the Vite 8 stable branch since the 8.1-beta on 2026-06-15. The release ships with the same code line that produced the beta, plus one new documented experimental entry point (Bundled Dev Mode), three weeks of bug-fix patches (the beta CHANGELOG lists 22 commits between v8.1.0-beta.0 and v8.1.0), a tightened default server.fs.deny list, a tilde-pinned Rolldown dependency that lets the bundler ship patch releases without a Vite PR, and a runtime deprecation warning for envFile: false. The same day, Rolldown 1.1.3 ships with ten follow-up fixes including a browser-main-thread crash and a watch-mode close-reentrancy fix.

The release lands eight days after the beta, which is faster than the Vite 7 → Vite 8 cadence. The Vite team's announcement post notes that Vite is now seeing 41.6 million weekly downloads on npm, "almost reaching the total downloads of Vite 7." Bundled Dev Mode is the feature that justifies the new minor line on its own: a 15x cold-start improvement on a 10,000-component React app, and Linear's real-world 3x faster cold start + 10x fewer network requests.

Bundled Dev Mode, the headline

The single biggest addition in 8.1.0 stable is Bundled Dev Mode, which is no longer a flag with no docs. It now has a dedicated CLI entry point, --experimental-bundle, and a documented config option, experimental.bundledDev: true:

vite.config.js
import { defineConfig } from 'vite'

export default defineConfig({
  experimental: {
    bundledDev: true,
  },
})

The default Vite dev server is unbundled: each source module is served as its own ESM file, and the browser resolves the import graph. That is what made Vite fast at small scale, but as apps grew past a few thousand modules the per-module request overhead dominated cold start and full reload. Bundled Dev Mode keeps the same dev-server ergonomics (HMR, the plugin pipeline, env vars) but pre-bundles the application with Rolldown and serves the prebuilt chunks. The Vite Team measured 15x faster cold start on a 10,000-component React app, 10x faster full reloads, and instant HMR regardless of app size; the Linear team reported 3x faster cold start rendering, ~40% faster full reloads, and 10x fewer network requests on their app.

The feature is still experimental because the plugin surface is being shaped. The release notes call out that "if you are using a third party plugin, it may not work with this mode" and that the focus is on browser-side core features for now; the design document lays out the planned plugin contract. Two follow-ups are already merged into the next 8.x line: PR #22587 folded bundledDev into DevEnvironment instead of being a separate subclass (it shipped in 8.1-beta.0), and PR #22617 makes sure incremental build errors are surfaced rather than dropped on the floor in bundled-dev mode.

WASM ESM Integration and Chunk Import Map graduate

The two big beta features graduate unchanged from the 8.1-beta.0 branch: PR #21779 implements the WASM ESM Integration draft from the WebAssembly community group as direct .wasm imports with no ?init suffix, and PR #21580 adds build.chunkImportMap, an opt-in build option that uses browser import maps to keep chunk hashes stable when only a single source file changes.

The WASM feature replaces the old import init from './add.wasm?init'; const instance = await init(); pattern with import { add } from './add.wasm'. Vite parses the binary, extracts imports and exports, and emits glue code that returns a properly-typed WebAssembly.Module instance. The legacy ?init, ?url, and ?raw query suffixes still work, so existing projects do not need to migrate in lockstep. The feature is independent of browser support today, because Vite still does the parsing and glue generation; the browser-level spec just standardizes the long-term target.

The chunk import map feature matters at a different scale: it is a real cache-stability improvement for production builds, not a dev-server convenience. In a default Rolldown build, every chunk filename contains a content hash, and import statements point directly at the hashed URL. When a single source file changes, every chunk that imports it (directly or transitively) gets a new hash, which cascades through the import graph and invalidates more chunks than strictly necessary. Import maps decouple the import statement from the chunk URL: the statement says import { x } from '/chunks/x.js', the import map says /chunks/x.js resolves to /chunks/x-abc123.js, and when the chunk content is unchanged the hashed URL stays the same and the browser reuses it. The implementation relies on import.meta.resolve in the browser, so chunkImportMap only works on browsers that support it; the companion plugin-legacy covers older browsers with SystemJS.

Lightning CSS, one step closer to default

PR #21748 makes Vite honor plugin dependencies declared by Lightning CSS itself, and PR #18389 adds support for external CSS files imported inside CSS files. Both pieces were already shipping as Lightning CSS issues (lightningcss#479 and lightningcss#877) and are now wired into Vite. The release notes say the team is "thinking of changing the default CSS preprocessor to Lightning CSS in the next major release." To try it now, set css.transformer: 'lightningcss' in vite.config.js and share feedback in vitejs/vite#13835.

server.fs.deny extension

PR #22707 (sapphi.red, feat: extend server.fs.deny list with common files) tightens the default secure-by-default dev server. The deny list goes from ['.env', '.env.*', '*.{crt,pem}', '**/.git/**'] (Vite 8.0.x) to ['.env', '.env.*', '*.{crt,pem,key,p12,pfx,cer,der}', '.npmrc', '.yarnrc.yml', '**/.git/**'] (Vite 8.1.0). The new entries cover private-key and certificate material in .key, .p12, .pfx, .cer, and .der files (the same family as the existing .crt and .pem coverage) plus the package-manager credential files .npmrc and .yarnrc.yml.

The PR description is explicit that this is not framed as a vulnerability fix: "we do not consider this as a vulnerability as it's not possible to cover every sensitive files possible. But we can add common ones as we go. And the server.fs.deny list is documented, so if you need more than these, you should add as you see fit." In practice this is the kind of change that prevents accidental credential leaks when a developer serves a project's root directory without a custom server.fs.allow configuration, which is the default for new projects. The behavior is the same in dev and SSR mode.

Tilde-pinned Rolldown

PR #22693 (use ~ for Rolldown) is small but worth flagging for ecosystem users. Vite's package.json previously pinned rolldown as "rolldown": "1.1.1" (exact version); 8.1.0 pins it as "rolldown": "~1.1.1" (tilde range, accepts any 1.1.x). The motivation is operational: Rolldown ships patch releases on a faster cadence than Vite, and Vite was having to bump rolldown manually for every patch release. With the tilde range, 1.1.2 (2026-06-18) and 1.1.3 (2026-06-24) flow into Vite users via the lockfile without a Vite PR each time.

The risk is the tilde-range version drift: a Rolldown patch that lands in 1.1.x and changes behavior could land in a Vite user's install without an explicit Vite release. The mitigation is that patch semver is meant to be backwards-compatible, and the Vite team's release cadence is fast enough that they can ship a Vite patch within a day or two if a bad rolldown patch slips through. The 1.1.3 release the same day as this article is the new rhythm: a Rolldown bug fix can be in Vite users' installs within hours of being merged.

envFile: false deprecation warning

PR #22555 adds a runtime deprecation warning when envFile: false is used. The behavior does not change; the existing backward-compatible mapping of envFile: false to envDir: false is preserved. The motivation is that envFile was already marked deprecated in the type definition, but the runtime path stayed silent, which made migration harder for programmatic API users and left behavior inconsistent with other deprecated Vite options that warn when used. The fix is a one-line warning plus the matching config tests; users who already use envDir: false get no warning.

Other changes between beta and stable

The 22-commit CHANGELOG diff between v8.1.0-beta.0 and v8.1.0 is mostly bug fixes plus the Rolldown 1.1.2 bump:

  • PR #22714 handles malformed URIs in the memory-files middleware.
  • PR #22715 caches falsy values in perEnvironmentState, which is a small correctness fix for environments that previously re-evaluated expensive work on every request.
  • PR #22711 makes the glob hmr matcher respect the caseSensitive option.
  • PR #22713 omits the nonce attribute on import maps when cspNonce is unset (a small HTML correctness fix).
  • PR #22611 skips null-valued exports in expandGlobIds glob resolution.
  • PR #22691 keeps resolved build options as a getter so plugins that introspect config.build see the resolved values.
  • PR #22706 uses literal envPrefix queries for Vite Task.
  • PR #22736 inlines the dev-id value in the CSS selector (a small client-side size optimisation).
  • PR #22724 removes the unused removeRawQuery utility.
  • PR #22692 renames chunkImportMap related options to use the rolldownOptions property.
  • PR #22695 bumps Rolldown to 1.1.2.

Why the timing matters

The Vite team published the announcing-vite8-1 post on the same day as the release, which is a faster-than-usual turnaround from "beta" to "stable + announcement" (eight days for 8.1 vs roughly three weeks for the 8.0 line). The 41.6M weekly downloads stat is a reminder that Vite is now in the same install-base tier as React, and the Bundled Dev Mode metrics are the kind of headline numbers that justify a minor line bump on their own.

For users on the Vite 8 stable line, the upgrade is npm install -D vite@8.1.0 plus a one-time config edit if your project sets any server.hmr WebSocket options. For users still on Vite 7 or earlier, the Vite 8 stable release notes cover the Rolldown migration and the larger plugin surface changes. The 8.1 line is the recommended stable target for new projects today, with 8.2 and 9.0 already open as milestones on the Vite repo.

Frequently Asked Questions

Oxlint v1.71 and Oxfmt v0.56 Ship the v0.137 Crates Wins, Land 18 New Linter Rules, and Tame React Lifecycle Traversal with a Streamed-Iterator Refactor

Oxlint apps_v1.71.0 and oxfmt apps_v0.56.0, both published on 2026-06-22, close out the v0.137 crates cycle. Oxlint v1.71 picks up the new treeshaking pure typed arrays minifier pass (#23469), the prefer-query-selector compound selector fix, 28 lint bug fixes (most of them Yunfei He's fixer-rewrite work), 13 performance entries anchored on a bucketed rule dispatch refactor (#23450, #23452, #23482-#23486, #23489, #23492), and the oxlint Tokio-on-LSP-only startup (#23447). Oxfmt v0.56.0 ships 9 bug fixes (CRLF normalization for `// @ts-ignore` suppressed text in #23701 and #23702, the member-chain panic fix #23698, the default-export-with-type-cast preservation #23697) and 3 formatter performance entries that remove arena copies on bigint, numeric-literal, and string-literal text. v1.71 is the first apps release since v1.70.0 on 2026-06-15, and the last one before the v0.138 crates release that will land on Monday 2026-06-29.

Node.js 24.18.0 'Krypton' LTS Lands Buffer.poolSize at 64 KiB, Web Crypto's TurboSHAKE and KangarooTwelve, and http.writeInformation for Arbitrary 1xx Codes

Node.js 24.18.0 'Krypton' (LTS), published 2026-06-23, ships the Buffer.poolSize 64 KiB default that landed on Current in 26.3.0, adds RFC 9861's TurboSHAKE and KangarooTwelve to Web Cryptography (PR #62183, 1,521 additions, 13 files), adds http.writeInformation for arbitrary 1xx status codes (PR #63155, 306 additions, 7 files), exposes V8 precise coverage start to the JS inspector runtime (commit 8c989ec4a3), adds JWK import-export for the ML-KEM and SLH-DSA post-quantum key types (PR #62706, 842 additions, 39 files), lands the BoringSSL-side wiring of ML-DSA, ML-KEM, ChaCha20-Poly1305, and AES-KW for Web Crypto (PR #63255), hardens WebCrypto against prototype pollution (PR #63363), aligns crypto.diffieHellman key argument names and accepts key data inputs (PR #62527), reverts the 24.16.0 'noop pause/resume on destroyed streams' behavior (PR #63834), and ships a single-line hotfix on 22.23.1 that backs out an http agent change from the 06-18 security release that triggered an unexpected re-stream.

Related articles

More coverage with overlapping topics and tags.

Oxlint v1.71 and Oxfmt v0.56 Ship the v0.137 Crates Wins, Land 18 New Linter Rules, and Tame React Lifecycle Traversal with a Streamed-Iterator Refactor
tooling

Oxlint v1.71 and Oxfmt v0.56 Ship the v0.137 Crates Wins, Land 18 New Linter Rules, and Tame React Lifecycle Traversal with a Streamed-Iterator Refactor

Oxlint apps_v1.71.0 and oxfmt apps_v0.56.0, both published on 2026-06-22, close out the v0.137 crates cycle. Oxlint v1.71 picks up the new treeshaking pure typed arrays minifier pass (#23469), the prefer-query-selector compound selector fix, 28 lint bug fixes (most of them Yunfei He's fixer-rewrite work), 13 performance entries anchored on a bucketed rule dispatch refactor (#23450, #23452, #23482-#23486, #23489, #23492), and the oxlint Tokio-on-LSP-only startup (#23447). Oxfmt v0.56.0 ships 9 bug fixes (CRLF normalization for `// @ts-ignore` suppressed text in #23701 and #23702, the member-chain panic fix #23698, the default-export-with-type-cast preservation #23697) and 3 formatter performance entries that remove arena copies on bigint, numeric-literal, and string-literal text. v1.71 is the first apps release since v1.70.0 on 2026-06-15, and the last one before the v0.138 crates release that will land on Monday 2026-06-29.
SWC v1.15.43 Lands the React Compiler as a First-Class Transform, Fixes a Silent Template Literal Minifier Bug, and Aligns `unsafe_math` with Terser
tooling

SWC v1.15.43 Lands the React Compiler as a First-Class Transform, Fixes a Silent Template Literal Minifier Bug, and Aligns `unsafe_math` with Terser

SWC v1.15.43, published on 2026-06-22 with swc_core v71.0.3, ships the experimental Rust React Compiler as a configurable SWC transform via .swcrc jsc.transform.reactCompiler (PR #11917, 54 files, 12,986 additions); fixes a silent template literal minifier bug where `compress` dropped text after the left template's last interpolation when concatenating two template literals (#11939); gates Number(x) -> +x on both `unsafe: true` AND `unsafe_math: true` to match terser v4.3.11+ (#11944, #11949); corrects scope for ES2022 private property brand checks (#11953); and lands seven internal React Compiler fixes (#11940, #11943, #11946, #11950, #11951, #11952, #11957) plus a parser fix that allows no-default builds (#11956) and a docs entry on the untrusted input security scope (#11937).
Oxc v0.137 Teaches the Minifier to Treeshake Pure Typed Arrays and Set/Map Literals, Lands an Incremental Scoping Refresh, and Fixes a React Compiler Edge Case
tooling

Oxc v0.137 Teaches the Minifier to Treeshake Pure Typed Arrays and Set/Map Literals, Lands an Incremental Scoping Refresh, and Fixes a React Compiler Edge Case

Oxc release crates_v0.137.0, published on 2026-06-18, ships two new minifier passes (treeshake pure typed arrays and Set/Map array literals via #23469, and inline const values for read-only vars via #22593), a long-running incremental scoping refresh that retires the LiveUsageCollector collector entirely (#23197), a friendly parser error for adjacent JSX elements (#23378), a React Compiler bug fix for computed-key imports (#23586), and two breaking changes to the ESTree config API (#23573, #23574). The minifier pass list also gets a Proxy-aware object-introspection fix (#23483) and a new Map/WeakSet/WeakMap preservation rule for string arguments (#23470). v0.137 is the first crates release since v0.135 on 2026-06-08 and the second since Bun's native React Compiler integration landed on 2026-06-20.

Comments

Log in Log in to join the conversation.

No comments yet. Be the first to share your thoughts.