Vite 4 Release
Vite 3 was released five months ago. npm downloads per week have gone from 1 million to 2.5 million since then. The ecosystem has matured too, and continues to grow. In this year's Jamstack Conf survey, usage among the community jumped from 14% to 32% while keeping a high 9.7 satisfaction score. We saw the stable releases of Astro 1.0, Nuxt 3, and other Vite-powered frameworks that are innovating and collaborating: SvelteKit, Solid Start, Qwik City. Storybook announced first-class support for Vite as one of its main features for Storybook 7.0. Deno now supports Vite. Vitest adoption is exploding, it will soon represent half of Vite's npm downloads. Nx is also investing in the ecosystem, and officially supports Vite.
Today, the Vite team with the help of our ecosystem partners, is happy to announce the release of Vite 4, powered during build time by Rollup 3. We've worked with the ecosystem to ensure a smooth upgrade path for this new major. Vite is now using Rollup 3, which allowed us to simplify Vite's internal asset handling and has many improvements. See the Rollup 3 release notes here.
Breaking Changes
General Changes
- Rollup now requires at least Node 14.18.0 to run (#4548 and #4596)
- The browser build has been split into a separate package
@rollup/browser
(#4593) - The node build uses the
node:
prefix for imports of builtin modules (#4596) - Some previously deprecated features have been removed (#4552):
- Some plugin context functions have been removed:
this.emitAsset()
: usethis.emitFile()
this.emitChunk()
: usethis.emitFile()
this.getAssetFileName()
: usethis.getFileName()
this.getChunkFileName()
: usethis.getFileName()
this.isExternal()
: usethis.resolve()
this.resolveId()
: usethis.resolve()
- The
resolveAssetUrl
plugin hook has been removed: useresolveFileUrl
- Rollup no longer passes
assetReferenceId
orchunkReferenceId
parameters toresolveFileUrl
- The
treeshake.pureExternalModules
option has been removed: usetreeshake.moduleSideEffects: 'no-external'
- You may no longer use
true
orfalse
foroutput.interop
. As a replacement fortrue
, you can use "compat" - Emitted assets no longer have an
isAsset
flag in the bundle - Rollup will no longer fix assets added directly to the bundle by adding the
type: "asset"
field
- Some plugin context functions have been removed:
- Some features that were previously marked for deprecation now show warnings when used (#4552):
- Some options have been deprecated:
inlineDynamicImports
as part of the input options: useoutput. inlineDynamicImports
manualChunks
as part of the input options: useoutput. manualChunks
maxParallelFileReads
: use `maxParallelFileOpsoutput.preferConst
: useoutput.generatedCode.constBindings
output.dynamicImportFunction
: use therenderDynamicImport
plugin hookoutput.namespaceToStringTag
: useoutput.generatedCode.symbols
preserveModules
as part of the input options: useoutput. preserveModules
- You should no longer access
this.moduleIds
in plugins: usethis.getModuleIds()
- You should no longer access
this.getModuleInfo(...).hasModuleSideEffects
in plugins: usethis.getModuleInfo(...).moduleSideEffects
- Some options have been deprecated:
- Configuration files are only bundled if either the
-configPlugin
or the-bundleConfigAsCjs
options are used. The configuration is bundled to an ES module unless the-bundleConfigAsCjs
option is used. In all other cases, configuration is now loaded using Node's native mechanisms (#4574 and #4621) - The properties attached to some errors have been changed so that there are fewer different possible properties with consistent types (#4579)
- Some errors have been replaced by others (ILLEGAL_NAMESPACE_REASSIGNMENT -> ILLEGAL_REASSIGNMENT, NON_EXISTENT_EXPORT -> MISSING_EXPORT) (#4579)
- Files in
rollup/dist/*
can only be required using their file extension (#4581) - The
loadConfigFile
helper now has a named export of the same name instead of a default export (#4581) - When using the API and sourcemaps, sourcemap comments are contained in the emitted files and sourcemaps are emitted as regular assets (#4605)
- Watch mode no longer uses Node's EventEmitter but a custom implementation that awaits Promises returned from event handlers (#4609)
- Assets may only be deduplicated with previously emitted assets if their source is a
string
(#4644) - By default, Rollup will keep external dynamic imports as
import(…)
in commonjs output unlessoutput.dynamicImportInCjs
is set to false (#4647)
Changes to Rollup Options
- As functions passed to
output.banner/footer/intro/outro
are now called per-chunk, they should be careful to avoid performance-heavy operations (#4543) entryFileNames/chunkFileNames
functions now longer have access to the rendered module information viamodules
, only to a list of includedmoduleIds
(#4543)- The path of a module is no longer prepended to the corresponding chunk when preserving modules (#4565)
- When preserving modules, the
[name]
placeholder (as well as thechunkInfo.name
property when using a function) now includes the relative path of the chunk as well as optionally the file extension if the extension is not one of.js
,.jsx
,.mjs
,.cjs
,.ts
,.tsx
,.mts
, or.cts
(#4565) - The
[ext]
,[extName]
and[assetExtName]
placeholders are no longer supported when preserving modules (#4565) - The
perf
option no longer collects timings for the asynchronous part of plugin hooks as the readings were wildly inaccurate and very misleading, and timings are adapted to the new hashing algorithm (#4566) - Change the default value of
makeAbsoluteExternalsRelative
to "ifRelativeSource" so that absolute external imports will no longer become relative imports in the output, while relative external imports will still be renormalized (#4567) - Change the default for
output.generatedCode.reservedNamesAsProps
to no longer quote properties likedefault
by default (#4568) - Change the default for
preserveEntrySignatures
to "exports-only" so that by default, empty facades for entry chunks are no longer created (#4576) - Change the default for
output.interop
to "default" to better align with NodeJS interop (#4611) - Change the default for
output.esModule
to "if-default-prop", which only adds __esModule when the default export would be a property (#4611) - Change the default for
output.systemNullSetters
totrue
, which requires at least SystemJS 6.3.3 (#4649)
Plugin API Changes
- Plugins that add/change/remove imports or exports in
renderChunk
should make sure to updateChunkInfo.imports/importedBindings/exports
accordingly (#4543) - The order of plugin hooks when generating output has changed (#4543)
- Chunk information passed to
renderChunk
now contains names with hash placeholders instead of final names, which will be replaced when used in the returned code orChunkInfo.imports/importedBindings/exports
(#4543 and #4631) - Hooks defined in output plugins will now run after hooks defined in input plugins (used to be the other way around) (#3846)
Features
- Functions passed to
output.banner/footer/intro/outro
are now called per-chunk with some chunk information (#4543) - Plugins can access the entire chunk graph via an additional parameter in
renderChunk
(#4543) - Chunk hashes only depend on the actual content of the chunk and are otherwise stable against things like renamed/moved source files or changed module resolution order (#4543)
- The length of generated file hashes can be customized both globally and per-chunk (#4543)
- When preserving modules, the regular
entryFileNames
logic is used and the path is included in the[name]
property. This finally gives full control over file names when preserving modules (#4565) output.entryFileNames
now also supports the[hash]
placeholder when preserving modules (#4565)- The
perf
option will now collect (synchronous) timings for all plugin hooks, not just a small selection (#4566) - All errors thrown by Rollup have
name: RollupError
now to make clearer that those are custom error types (#4579) - Error properties that reference modules (such as id and ids) will now always contain the full ids. Only the error message will use shortened ids (#4579)
- Errors that are thrown in response to other errors (e.g. parse errors thrown by acorn) will now use the standardized cause property to reference the original error (#4579)
- If sourcemaps are enabled, files will contain the appropriate sourcemap comment in
generateBundle
and sourcemap files are available as regular assets (#4605) - Returning a Promise from an event handler attached to a RollupWatcher instance will make Rollup wait for the Promise to resolve (#4609)
- There is a new value "compat" for output.interop that is similar to "auto" but uses duck-typing to determine if there is a default export (#4611)
- There is a new value "if-default-prop" for esModule that only adds an
__esModule
marker to the bundle if there is a default export that is rendered as a property (#4611) - Rollup can statically resolve checks for
foo[Symbol.toStringTag]
to "Module" if foo is a namespace (#4611) - There is a new CLI option
-bundleConfigAsCjs
which will force the configuration to be bundled to CommonJS (#4621) - Import assertions for external imports that are present in the input files will be retained in ESM output (#4646)
- Rollup will warn when a module is imported with conflicting import assertions (#4646)
- Plugins can add, remove or change import assertions when resolving ids (#4646)
- The
output.externalImportAssertions
option allows to turn off emission of import assertions (#4646) - Use
output.dynamicImportInCjs
to control if dynamic imports are emitted asimport(…)
or wrappedrequire(…)
when generating commonjs output (#4647)
Bug Fixes
- Chunk hashes take changes in
renderChunk
, e.g. minification, into account (#4543) - Hashes of referenced assets are properly reflected in the chunk hash (#4543)
- No longer warn about implicitly using default export mode to not tempt users to switch to named export mode and break Node compatibility (#4624)
- Avoid performance issues when emitting thousands of assets (#4644)