Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .vitepress/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,7 @@ export default defineConfig({
link: '/guide/philosophy',
},
{
text: '从 v3 迁移',
text: '从 v4 迁移',
link: '/guide/migration'
},
],
Expand Down
6 changes: 4 additions & 2 deletions config/build-options.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ type ResolveModulePreloadDependenciesFn = (
context: {
importer: string
},
) => (string | { runtime?: string })[]
) => string[]
```

`resolveDependencies` 函数将为每个动态导入调用,同时带着一个它所依赖的 chunk 列表。并且它还会为每个在入口 HTML 文件中导入的 chunk 调用。 可以返回一个新的依赖关系数组,可能被过滤后变少了,也可能有更多依赖注入进来了,同时它们的路径也被修改过。`deps` 路径是相对于 `build.outDir` 的。若在注入该模块到 HTML head 时使用 `new URL(dep, import.meta.url)` 获取绝对路径,则对于 `hostType === 'js'`,允许返回一个相对于 `hostId` 的路径。
Expand Down Expand Up @@ -186,7 +186,7 @@ Git LFS 占位符会自动排除在内联之外,因为它们不包含它们所
- **类型:** `boolean`
- **默认:** `false`

在 SSR 构建过程中,静态资源不会输出,因为其通常被认为会当作客户端构建的一部分输出。这个选项允许框架强制在客户端和 SSR 构建中都输出它们。将静态资源在构建后合并是框架的责任。
在 SSR 构建期间,静态资源不会被输出,因为它们通常被认为是客户端构建的一部分。这个选项允许框架强制在客户端和 SSR 构建中都输出它们。将静态资源在构建后合并是框架的责任。

## build.minify {#build-minify}

Expand All @@ -209,6 +209,8 @@ npm add -D terser

传递给 Terser 的更多 [minify 选项](https://terser.org/docs/api-reference#minify-options)。

此外,你还可以传递一个 `maxWorkers: number` 选项来指定最大的工作线程数。默认为 CPU 核心数减 1。

## build.write {#build-write}

- **类型:** `boolean`
Expand Down
23 changes: 7 additions & 16 deletions config/server-options.md
Original file line number Diff line number Diff line change
Expand Up @@ -180,25 +180,16 @@ Direct websocket connection fallback. Check out https://vitejs.dev/config/server

传递给 [chokidar](https://github.com/paulmillr/chokidar#api) 的文件系统监听器选项。

Vite 服务器默认会忽略对 `.git/` 和 `node_modules/` 目录的监听。如果你需要对 `node_modules/` 内的包进行监听,你可以为 `server.watch.ignored` 赋值一个取反的 glob 模式,例如:

```js
export default defineConfig({
server: {
watch: {
ignored: ['!**/node_modules/your-package-name/**'],
},
},
// 被监听的包必须被排除在优化之外,
// 以便它能出现在依赖关系图中并触发热更新。
optimizeDeps: {
exclude: ['your-package-name'],
},
})
```
Vite 服务器的文件监听器默认会监听 `root` 目录,同时会跳过 `.git/` 和 `node_modules/` 目录。当监听到文件更新时,Vite 会应用 HMR 并且只在需要时更新页面。

如果设置为 `null`,则不会监听任何文件。`server.watcher` 将提供一个兼容的事件发射器,但是调用 `add` 或 `unwatch` 将没有任何效果。

::: warning 监听 `node_modules` 中的文件

目前没有可行的方式来监听 `node_modules` 中的文件。若要了解更多详情和可能的临时替代方案,你可以关注 [issue #8619](https://github.com/vitejs/vite/issues/8619)。

:::

::: warning 在 Windows Linux 子系统(WSL)上使用 Vite

当需要再 Windows Subsystem for Linux (WSL) 2 上运行 Vite 时,如果项目文件夹位于 Windows 文件系统中,你需要将此选项设置为 `{ usePolling: true }`。这是由于 Windows 文件系统的 [WSL2 限制](https://github.com/microsoft/WSL/issues/4739) 造成的。
Expand Down
16 changes: 16 additions & 0 deletions config/ssr-options.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,19 @@
- **默认:** `node`

SSR 服务器的构建目标。

## ssr.resolve.conditions {#ssr-resolve-conditions}

- **类型:** `string[]`
- **相关:** [解析情景](./shared-options.md#resolve-conditions)

在 SSR 构建中,包入口的解析条件。默认为 [`resolve.conditions`](./shared-options.md#resolve-conditions)。

这些条件会在插件管道中使用,并且只会影响 SSR 构建期间的非外部化依赖项。使用 `ssr.resolve.externalConditions` 来影响外部化导入。

## ssr.resolve.externalConditions {#ssr-resolve-externalconditions}

- **类型:** `string[]`
- **默认:** `[]`

在 SSR 导入(包括 `ssrLoadModule`)外部化依赖项时使用的条件。
10 changes: 9 additions & 1 deletion guide/api-hmr.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,10 @@ interface ViteHotContext {
event: T,
cb: (payload: InferCustomEventPayload<T>) => void,
): void
off<T extends string>(
event: T,
cb: (payload: InferCustomEventPayload<T>) => void,
): void
send<T extends string>(event: T, data?: InferCustomEventPayload<T>): void
}
```
Expand Down Expand Up @@ -179,7 +183,11 @@ import.meta.hot.accept((module) => {

自定义 HMR 事件可以由插件发送。更多细节详见 [handleHotUpdate](./api-plugin#handleHotUpdate)。

## `hot.send(event, data)` {##hot-send-event-data}
## `hot.off(event, cb)` {#hot-offevent-cb}

从事件监听器中移除回调函数。

## `hot.send(event, data)` {#hot-send-event-data}

发送自定义事件到 Vite 开发服务器。

Expand Down
4 changes: 0 additions & 4 deletions guide/dep-pre-bundling.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,6 @@ export default defineConfig({

当对链接的依赖进行更改时,请使用 `--force` 命令行选项重新启动开发服务器,以使更改生效。

::: warning 重复删除
由于链接的依赖项解析方式不同,传递依赖项(transitive dependencies)可能会被错误地去重,从而在运行时出现问题。如果遇到此问题,请使用 `npm pack` 命令来修复它。
:::

## 自定义行为 {#customizing-the-behavior}

有时候默认的依赖启发式算法(discovery heuristics)可能并不总是理想的。如果您想要明确地包含或排除依赖项,可以使用 [`optimizeDeps` 配置项](/config/dep-optimization-options.md) 来进行设置。
Expand Down
69 changes: 69 additions & 0 deletions guide/migration-from-v3.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
# 从 v3 迁移 {#migration-from-v3}

## Rollup 3 {#rollup-3}

Vite 现在正式启用 [Rollup 3](https://github.com/vitejs/vite/issues/9870),这使得我们可以简化 Vite 内部的资源处理并同时拥有许多改进。详情请查看 [Rollup 3 版本记录](https://github.com/rollup/rollup/releases/tag/v3.0.0)。

Rollup 3 尽最大可能兼容了 Rollup 2。如果你在项目中使用了自定义的 [`rollupOptions`](../config/build-options.md#rollup-options) 并(升级后)遇到了问题,请先查看 [Rollup 迁移指南](https://rollupjs.org/migration/) 来更新升级你的配置。

## 现代浏览器基准线变化 {#modern-browser-baseline-change}

当前对于现代浏览器的构建目标及现调整为了默认 `safari14` 以求更广的 ES2020 兼容性(从 `safari13` 升级)。这意味着现代化构建现在可以使用 [`BigInt`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt),同时 [空值合并运算符](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing) 将不再被转译。如果你需要支持更旧版本的浏览器,你可以照常添加 [`@vitejs/plugin-legacy`](https://github.com/vitejs/vite/tree/main/packages/plugin-legacy)。

## 其他一般性变化 {#general-changes}

### 编码 {#encoding}

构建的默认字符集现在是 utf8(查看 [#10753](https://github.com/vitejs/vite/issues/10753) 了解更多细节)。

### 以字符串形式导入 CSS {#importing-css-as-a-string}

在过往的 Vite 3 之中,以默认导入形式导入一个 `.css` 文件的可能会造成对 CSS 的双重加载。

In Vite 4, the manifest files (`build.manifest`, `build.ssrManifest`) was generated in the root of `build.outDir` by default. From Vite 5, those will be generated in the `.vite` directory in the `build.outDir` by default.

这种双重加载出现的原因是 `.css` 文件是将会被释放(emit)到最终产物的,并且很可能 CSS 字符串将会在应用代码中被使用到,就比如被框架运行时注入的时候。对于现在的 Vite 4,`.css` 默认导出 [已经被废弃](https://github.com/vitejs/vite/issues/11094)。在这种情况下你将需要使用 `?inline` 这个查询参数后缀,而这时将不会将导入的 `.css` 样式文件释放到最终产物。

CLI shortcuts, like `r` to restart the dev server, now require an additional `Enter` press to trigger the shortcut. For example, `r + Enter` to restart the dev server.

### 默认情况下的生产构建 {#production-builds-by-default}

不管所传递的 `--mode` 是什么,`vite build` 总是构建生产版本。之前,若将 `mode` 改为 `production` 之外的模式会构建开发版本,如果现在希望用于开发构建,可以在 `.env.{mode}` 文件中设置 `NODE_ENV=development`。

在本次变动中,如果 `process.env.NODE_ENV` 已经被定义,`vite dev` 和 `vite build` 将不再覆盖它。所以如果在构建前设置了 `process.env.NODE_ENV = 'development'`,将会构建开发版本。这在并行执行多个构建或开发服务器时提供了更多的控制权。

请参阅更新后的 [`mode` 文档](/guide/env-and-mode.md#modes) 了解更多详细信息。

### 环境变量 {#environment-variables}

Vite 现在使用 `dotenv` 16 和 `dotenv-expand` 9(之前是 `dotenv` 14 和 `dotenv-expand` 5)如果你有一个包含 `#` 或者 `` ` `` 的值,你将需要将它们以双引号包裹起来。

```diff
-VITE_APP=ab#cd`ef
+VITE_APP="ab#cd`ef"
```

了解更多详情,请查看 [`dotenv`](https://github.com/motdotla/dotenv/blob/master/CHANGELOG.md) 和 [`dotenv-expand` 更新日志](https://github.com/motdotla/dotenv-expand/blob/master/CHANGELOG.md)。

## 进阶 {#advanced}

下列改动仅会影响到插件/工具的作者:

- [[#11036] feat(client)!: remove never implemented hot.decline](https://github.com/vitejs/vite/issues/11036)
- 使用 `hot.invalidate` 来代替
- [[#9669] feat: align object interface for `transformIndexHtml` hook](https://github.com/vitejs/vite/issues/9669)
- 使用 `order` 来代替 `enforce`

此外,还有其他一些只影响少数用户的破坏性变化。

- [[#11101] feat(ssr)!: remove dedupe and mode support for CJS](https://github.com/vitejs/vite/pull/11101)
- 您应该迁移到 SSR 的默认 ESM 模式,CJS SSR 支持可能会在下一个 Vite 主要版本删除。
- [[#10475] feat: handle static assets in case-sensitive manner](https://github.com/vitejs/vite/pull/10475)
- 您的项目不应该依赖于会被不同操作系统忽略大小写的文件名。
- [[#10996] fix!: make `NODE_ENV` more predictable](https://github.com/vitejs/vite/pull/10996)
- 有关此更改的解释,请参阅 PR。
- [[#10903] refactor(types)!: remove facade type files](https://github.com/vitejs/vite/pull/10903)

## 从 v2 迁移 {#migration-from-v2}

请先查看之前 Vite v3 文档中的 [从 v2 迁移指南](https://cn.vitejs.dev/guide/migration-from-v2.html) 了解迁移到 v3 所需要的更改,然后再继续执行本页提到的相关更改。
78 changes: 35 additions & 43 deletions guide/migration.md
Original file line number Diff line number Diff line change
@@ -1,73 +1,65 @@
# 从 v3 迁移 {#migration-from-v3}
# Migration from v4 {#migration-from-v4}

## Rollup 3 {#rollup-3}
## Node.js 支持 {#nodejs-support}

Vite 现在正式启用 [Rollup 3](https://github.com/vitejs/vite/issues/9870),这使得我们可以简化 Vite 内部的资源处理并同时拥有许多改进。详情请查看 [Rollup 3 版本记录](https://github.com/rollup/rollup/releases/tag/v3.0.0)
Vite 不再支持 Node.js 14 / 16 / 17 / 19,因为它们已经到了 EOL。现在需要 Node.js 18 / 20+

Rollup 3 尽最大可能兼容了 Rollup 2。如果你在项目中使用了自定义的 [`rollupOptions`](../config/build-options.md#rollup-options) 并(升级后)遇到了问题,请先查看 [Rollup 迁移指南](https://rollupjs.org/migration/) 来更新升级你的配置。
## 废弃 CJS Node API {#deprecate-cjs-node-api}

## 现代浏览器基准线变化 {#modern-browser-baseline-change}
CJS 的 Node API 已经被废弃。当调用 `require('vite')` 时,将会记录一个废弃警告。你应该更新你的文件或框架来导入 Vite 的 ESM 构建。

当前对于现代浏览器的构建目标及现调整为了默认 `safari14` 以求更广的 ES2020 兼容性(从 `safari13` 升级)。这意味着现代化构建现在可以使用 [`BigInt`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt),同时 [空值合并运算符](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing) 将不再被转译。如果你需要支持更旧版本的浏览器,你可以照常添加 [`@vitejs/plugin-legacy`](https://github.com/vitejs/vite/tree/main/packages/plugin-legacy)。
在一个基础的 Vite 项目中,请确保:

## 其他一般性变化 {#general-changes}

### 编码 {#encoding}
1. `vite.config.js` 配置文件的内容使用 ESM 语法。
2. 最近的 `package.json` 文件中有 `"type": "module"`,或者使用 `.mjs` 扩展名,例如 `vite.config.mjs`。

构建的默认字符集现在是 utf8(查看 [#10753](https://github.com/vitejs/vite/issues/10753) 了解更多细节)。
对于其他项目,有几种常见的方法:

### 以字符串形式导入 CSS {#importing-css-as-a-string}
- **配置 ESM 为默认,如果需要则选择 CJS:** 在项目 `package.json` 中添加 `"type": "module"`。所有 `*.js` 文件现在都被解释为 ESM,并且需要使用 ESM 语法。你可以将一个文件重命名为 `.cjs` 扩展名来继续使用 CJS。
- **保持 CJS 为默认,如果需要则选择 ESM:** 如果项目 `package.json` 没有 `"type": "module"`,所有 `*.js` 文件都被解释为 CJS。你可以将一个文件重命名为 `.mjs` 扩展名来使用 ESM。
- **动态导入 Vite:** 如果你需要继续使用 CJS,你可以使用 `import('vite')` 动态导入 Vite。这要求你的代码必须在一个 `async` 上下文中编写,但是由于 Vite 的 API 大多是异步的,所以应该还是可以管理的。

在过往的 Vite 3 之中,以默认导入形式导入一个 `.css` 文件的可能会造成对 CSS 的双重加载
查看 [排错指南](https://cn.vitejs.dev/guide/troubleshooting.html#vite-cjs-node-api-deprecated) 获取更多信息

```ts
import cssString from './global.css'
```
## 其他一般性变化 {#general-changes}

这种双重加载出现的原因是 `.css` 文件是将会被释放(emit)到最终产物的,并且很可能 CSS 字符串将会在应用代码中被使用到,就比如被框架运行时注入的时候。对于现在的 Vite 4,`.css` 默认导出 [已经被废弃](https://github.com/vitejs/vite/issues/11094)。在这种情况下你将需要使用 `?inline` 这个查询参数后缀,而这时将不会将导入的 `.css` 样式文件释放到最终产物。
### 允许路径包含 `.` 回退到 index.html {#allow-path-containing-to-fallback-to-index-html}

```ts
import stuff from './global.css?inline'
```
在 Vite 4 中,即使 `appType` 被设置为 `'SPA'`(默认),访问包含 `.` 的路径也不会回退到 index.html。从 Vite 5 开始,它将会回退到 index.html。

### 默认情况下的生产构建 {#production-builds-by-default}
注意浏览器将不再在控制台中显示 404 错误消息,如果你将图片路径指向一个不存在的文件(例如 `<img src="./file-does-not-exist.png">`)。

不管所传递的 `--mode` 是什么,`vite build` 总是构建生产版本。之前,若将 `mode` 改为 `production` 之外的模式会构建开发版本,如果现在希望用于开发构建,可以在 `.env.{mode}` 文件中设置 `NODE_ENV=development`。
### Manifest 文件现在默认生成到 `.vite` 目录中 {#manifest-files-are-now-generated-in-vite-directory-by-default}

在本次变动中,如果 `process.env.NODE_ENV` 已经被定义,`vite dev` 和 `vite build` 将不再覆盖它。所以如果在构建前设置了 `process.env.NODE_ENV = 'development'`,将会构建开发版本。这在并行执行多个构建或开发服务器时提供了更多的控制权
在 Vite 4 中,manifest 文件(`build.manifest`,`build.ssrManifest`)默认会生成在 `build.outDir` 的根目录中。从 Vite 5 开始,这些文件将默认生成在 `build.outDir` 中的 `.vite` 目录中

请参阅更新后的 [`mode` 文档](/guide/env-and-mode.md#modes) 了解更多详细信息。
### CLI 快捷功能键需要一个额外的 `Enter` 按键 {#cli-shortcuts-require-an-additional-enter-press}

### 环境变量 {#environment-variables}
CLI 快捷功能键,例如 `r` 重启开发服务器,现在需要额外的 `Enter` 按键来触发快捷功能。例如,`r + Enter` 重启开发服务器。

Vite 现在使用 `dotenv` 16 和 `dotenv-expand` 9(之前是 `dotenv` 14 和 `dotenv-expand` 5)如果你有一个包含 `#` 或者 `` ` `` 的值,你将需要将它们以双引号包裹起来
这个改动防止 Vite 吞噬和控制操作系统特定的快捷键,允许更好的兼容性,当将 Vite 开发服务器与其他进程结合使用时,并避免了[之前的注意事项](https://github.com/vitejs/vite/pull/14342)

```diff
-VITE_APP=ab#cd`ef
+VITE_APP="ab#cd`ef"
```
## 移除部分废弃 API

了解更多详情,请查看 [`dotenv`](https://github.com/motdotla/dotenv/blob/master/CHANGELOG.md) 和 [`dotenv-expand` 更新日志](https://github.com/motdotla/dotenv-expand/blob/master/CHANGELOG.md)。
- CSS 文件的默认导出(例如 `import style from './foo.css'`):使用 `?inline` 查询参数代替
- `import.meta.globEager`:使用 `import.meta.glob('*', { eager: true })` 来代替
- `ssr.format: 'cjs'` 和 `legacy.buildSsrCjsExternalHeuristics`([#13816](https://github.com/vitejs/vite/discussions/13816))

## 进阶 {#advanced}

下列改动仅会影响到插件/工具的作者:

- [[#11036] feat(client)!: remove never implemented hot.decline](https://github.com/vitejs/vite/issues/11036)
- 使用 `hot.invalidate` 来代替
- [[#9669] feat: align object interface for `transformIndexHtml` hook](https://github.com/vitejs/vite/issues/9669)
- 使用 `order` 来代替 `enforce`
- [[#14119] refactor!: merge `PreviewServerForHook` into `PreviewServer` type](https://github.com/vitejs/vite/pull/14119)

此外,还有其他一些只影响少数用户的破坏性变化。

- [[#11101] feat(ssr)!: remove dedupe and mode support for CJS](https://github.com/vitejs/vite/pull/11101)
- 您应该迁移到 SSR 的默认 ESM 模式,CJS SSR 支持可能会在下一个 Vite 主要版本删除。
- [[#10475] feat: handle static assets in case-sensitive manner](https://github.com/vitejs/vite/pull/10475)
- 您的项目不应该依赖于会被不同操作系统忽略大小写的文件名。
- [[#10996] fix!: make `NODE_ENV` more predictable](https://github.com/vitejs/vite/pull/10996)
- 有关此更改的解释,请参阅 PR。
- [[#10903] refactor(types)!: remove facade type files](https://github.com/vitejs/vite/pull/10903)
- [[#14098] fix!: avoid rewriting this (reverts #5312)](https://github.com/vitejs/vite/pull/14098)
- 之前顶层 `this` 将会在构建时被默认地改写为 `globalThis`,这个行为现在已被移除
- [[#14231] feat!: add extension to internal virtual modules](https://github.com/vitejs/vite/pull/14231)
- 内置虚拟模块的 id 现在包含一个扩展名(`.js`)
- [[#5657] fix: return 404 for resources requests outside the base path](https://github.com/vitejs/vite/pull/5657)
- 过去,Vite 对于不带 `Accept: text/html` 的请求,会将其当作带有基础路径的请求来处理。现在 Vite 不再这样做,而是返回 404。

## 从 v2 迁移 {#migration-from-v2}
## 从 v3 迁移 {#migration-from-v3}

请先查看之前 Vite v3 文档中的 [Migration from v2 Guide](https://cn.vitejs.dev/guide/migration-from-v2.html) 了解迁移到 v3 所需要的更改,然后再继续执行本页提到的相关更改
请先查看 [从 v3 迁移指南](https://cn.vitejs.dev/guide/migration-from-v3.html) 文档查看对您的应用所有需要迁移的改动,然后再执行本篇指南所述的改动
Loading