diff --git a/.vitepress/config.ts b/.vitepress/config.ts
index 1693d852..ee34efc1 100644
--- a/.vitepress/config.ts
+++ b/.vitepress/config.ts
@@ -41,10 +41,6 @@ export default defineConfig({
pt: { label: 'Português', link: 'https://pt.vitejs.dev' },
},
- vue: {
- reactivityTransform: true,
- },
-
themeConfig: {
logo: '/logo.svg',
diff --git a/.vitepress/theme/components/HomeSponsors.vue b/.vitepress/theme/components/HomeSponsors.vue
index 16ea073b..cb3a5503 100644
--- a/.vitepress/theme/components/HomeSponsors.vue
+++ b/.vitepress/theme/components/HomeSponsors.vue
@@ -9,8 +9,59 @@ const { data } = useSponsor()
+
+
+
+
+
+
diff --git a/.vitepress/theme/composables/sponsor.ts b/.vitepress/theme/composables/sponsor.ts
index 976dbcfb..3251509a 100644
--- a/.vitepress/theme/composables/sponsor.ts
+++ b/.vitepress/theme/composables/sponsor.ts
@@ -21,6 +21,11 @@ const data = ref()
const dataHost = 'https://sponsors.vuejs.org'
const dataUrl = `${dataHost}/vite.json`
+// no sponsors yet :(
+const viteSponsors: Pick = {
+ gold: [],
+}
+
export function useSponsor() {
onMounted(async () => {
if (data.value) {
@@ -48,7 +53,7 @@ function mapSponsors(sponsors: Sponsors) {
{
tier: 'Gold Sponsors',
size: 'medium',
- items: mapImgPath(sponsors['gold']),
+ items: viteSponsors['gold'].concat(mapImgPath(sponsors['gold'])),
},
]
}
diff --git a/_data/team.js b/_data/team.js
index 19a57825..601412be 100644
--- a/_data/team.js
+++ b/_data/team.js
@@ -120,7 +120,23 @@ export const core = [
name: 'Dominik G.',
title: 'Resident CI Expert',
desc: 'Team Member of Vite and Svelte',
- links: [{ icon: 'github', link: 'https://github.com/dominikg' }],
+ links: [
+ { icon: 'github', link: 'https://github.com/dominikg' },
+ { icon: 'mastodon', link: 'https://elk.zone/m.webtoo.ls/@dominikg' },
+ ],
+ sponsor: 'https://github.com/sponsors/dominikg',
+ },
+ {
+ avatar: 'https://github.com/sheremet-va.png',
+ name: 'Vladimir',
+ title: 'Core team member of Vitest & Vite',
+ desc: 'An open source fullstack developer',
+ links: [
+ { icon: 'github', link: 'https://github.com/sheremet-va' },
+ { icon: 'mastodon', link: 'https://elk.zone/m.webtoo.ls/@sheremet_va' },
+ { icon: 'twitter', link: 'https://twitter.com/sheremet_va' },
+ ],
+ sponsor: 'https://github.com/sponsors/sheremet-va',
},
]
diff --git a/blog/announcing-vite4-3.md b/blog/announcing-vite4-3.md
new file mode 100644
index 00000000..756c3579
--- /dev/null
+++ b/blog/announcing-vite4-3.md
@@ -0,0 +1,86 @@
+---
+sidebar: false
+head:
+ - - meta
+ - property: og:type
+ content: website
+ - - meta
+ - property: og:title
+ content: Announcing Vite 4.3
+ - - meta
+ - property: og:image
+ content: https://vitejs.dev/og-image-announcing-vite4-3.png
+ - - meta
+ - property: og:url
+ content: https://vitejs.dev/blog/announcing-vite4-3
+ - - meta
+ - property: og:description
+ content: Vite 4.3 Release Announcement
+ - - meta
+ - name: twitter:card
+ content: summary_large_image
+---
+
+# Vite 4.3 is out!
+
+_April 20, 2023_
+
+![Vite 4.3 Announcement Cover Image](/og-image-announcing-vite4-3.png)
+
+Quick links:
+
+- Docs: [English](/), [简体中文](https://cn.vitejs.dev/), [日本語](https://ja.vitejs.dev/), [Español](https://es.vitejs.dev/), [Português](https://pt.vitejs.dev/)
+- [Vite 4.3 Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md#430-2023-04-20)
+
+## Performance Improvements
+
+In this minor, we focused on improving the dev server performance. The resolve logic got streamlined, improving hot paths and implementing smarter caching for finding `package.json`, TS config files, and resolved URL in general.
+
+You can read a detailed walkthrough of the performance work done in this blog post by one of Vite Contributors: [How we made Vite 4.3 faaaaster 🚀](https://sun0day.github.io/blog/vite/why-vite4_3-is-faster.html).
+
+This sprint resulted in speed improvements across the board compared to Vite 4.2.
+
+These are the performance improvements as measured by [sapphi-red/performance-compare](https://github.com/sapphi-red/performance-compare), which tests an app with 1000 React Components cold and warm dev server startup time as well as HMR times for a root and a leaf component:
+
+| **Vite (babel)** | Vite 4.2 | Vite 4.3 | Improvement |
+| :----------------- | --------: | -------: | ----------: |
+| **dev cold start** | 17249.0ms | 5132.4ms | -70.2% |
+| **dev warm start** | 6027.8ms | 4536.1ms | -24.7% |
+| **Root HMR** | 46.8ms | 26.7ms | -42.9% |
+| **Leaf HMR** | 27.0ms | 12.9ms | -52.2% |
+
+| **Vite (swc)** | Vite 4.2 | Vite 4.3 | Improvement |
+| :----------------- | --------: | -------: | ----------: |
+| **dev cold start** | 13552.5ms | 3201.0ms | -76.4% |
+| **dev warm start** | 4625.5ms | 2834.4ms | -38.7% |
+| **Root HMR** | 30.5ms | 24.0ms | -21.3% |
+| **Leaf HMR** | 16.9ms | 10.0ms | -40.8% |
+
+![Vite 4.3 vs 4.2 startup time comparison](/vite4-3-startup-time.png)
+
+![Vite 4.3 vs 4.2 HMR time comparison](/vite4-3-hmr-time.png)
+
+You can read more information about the benchmark [here](https://gist.github.com/sapphi-red/25be97327ee64a3c1dce793444afdf6e). Specs and Versions for this performance run:
+
+- CPU: Ryzen 9 5900X, Memory: DDR4-3600 32GB, SSD: WD Blue SN550 NVME SSD
+- Windows 10 Pro 21H2 19044.2846
+- Node.js 18.16.0
+- Vite and React Plugin versions
+ - Vite 4.2 (babel): Vite 4.2.1 + plugin-react 3.1.0
+ - Vite 4.3 (babel): Vite 4.3.0 + plugin-react 4.0.0-beta.1
+ - Vite 4.2 (swc): Vite 4.2.1 + plugin-react-swc 3.2.0
+ - Vite 4.3 (swc): Vite 4.3.0 + plugin-react-swc 3.3.0
+
+Early adopters have also reported seeing 1.5x-2x dev startup time improvement on real apps while testing the Vite 4.3 beta. We'd love to know the results for your apps.
+
+## Profiling
+
+We'll continue to work on Vite's performance. We're working on an official [Benchmark tool](https://github.com/vitejs/vite-benchmark) for Vite that let us get performance metrics for each Pull Request.
+
+And [vite-plugin-inspect](https://github.com/antfu/vite-plugin-inspect) now has more performance-related features to help you identify which plugins or middlewares are the bottleneck for your applications.
+
+Using `vite --profile` (and then pressing `p`) once the page loads will save a CPU profile of the dev server startup. You can open them in an app as [speedscope](https://www.speedscope.app/) to identify performance issues. And you can share your findings with the Vite Team in a [Discussion](https://github.com/vitejs/vite/discussions) or in [Vite's Discord](https://chat.vitejs.dev).
+
+## Next Steps
+
+We decided to do a single Vite Major this year aligning with the [EOL of Node.js 16](https://endoflife.date/nodejs) in September, dropping support for both Node.js 14 and 16 in it. If you would like to get involved, we started a [Vite 5 Discussion](https://github.com/vitejs/vite/discussions/12466) to gather early feedback.
diff --git a/config/server-options.md b/config/server-options.md
index 7b1172d4..6660cd25 100644
--- a/config/server-options.md
+++ b/config/server-options.md
@@ -327,7 +327,7 @@ export default defineConfig({
- **类型:** `false | (sourcePath: string, sourcemapPath: string) => boolean`
- **默认:** `(sourcePath) => sourcePath.includes('node_modules')`
-是否忽略服务器 sourcemap 中的源文件,用于填充 [`x_google_ignoreList` source map 扩展](https://developer.chrome.com/blog/devtools-better-angular-debugging/#the-x_google_ignorelist-source-map-extension)。
+是否忽略服务器 sourcemap 中的源文件,用于填充 [`x_google_ignoreList` source map 扩展](https://developer.chrome.com/articles/x-google-ignore-list/)。
对开发服务器来说 `server.sourcemapIgnoreList` 等价于 [`build.rollupOptions.output.sourcemapIgnoreList`](https://rollupjs.org/configuration-options/#output-sourcemapignorelist)。两个配置选项之间的区别在于,rollup 函数使用相对路径调用 `sourcePath`,而 `server.sourcemapIgnoreList` 使用绝对路径调用。在开发过程中,大多数模块的映射和源文件位于同一个文件夹中,因此 `sourcePath` 的相对路径就是文件名本身。在这些情况下,使用绝对路径更加方便。
diff --git a/config/shared-options.md b/config/shared-options.md
index 8adf2761..dba5a634 100644
--- a/config/shared-options.md
+++ b/config/shared-options.md
@@ -111,7 +111,7 @@ const obj = {
更高级的自定义解析方法可以通过 [插件](/guide/api-plugin) 实现。
::: warning 在 SSR 中使用
-如果你已经为 [SSR 外部化的依赖](/guide/ssr.md#ssr-externals) 配置了别名,你可能想要为真实的 `node_modules` 包配别名. [Yarn](https://classic.yarnpkg.com/en/docs/cli/add/#toc-yarn-add-alias) 和 [pnpm](https://pnpm.js.org/en/aliases) 都支持通过 `npm:` 前缀配置别名。
+如果你已经为 [SSR 外部化的依赖](/guide/ssr.md#ssr-externals) 配置了别名,你可能想要为真实的 `node_modules` 包配别名。[Yarn](https://classic.yarnpkg.com/en/docs/cli/add/#toc-yarn-add-alias) 和 [pnpm](https://pnpm.io/aliases/) 都支持通过 `npm:` 前缀配置别名。
:::
## resolve.dedupe {#resolve-dedupe}
@@ -232,7 +232,7 @@ interface CSSModulesOptions {
- `less` - [选项](https://lesscss.org/usage/#less-options)。
- `styl`/`stylus` - 仅支持 [`define`](https://stylus-lang.com/docs/js.html#define-name-node),可以作为对象传递。
-所有预处理器选项还支持 `additionalData` 选项,可以用于为每个样式内容注入额外代码。
+所有预处理器选项还支持 `additionalData` 选项,可以用于为每个样式内容注入额外代码。请注意,如果注入的是实际的样式而不仅仅是变量时,那么这些样式将会在最终的打包产物中重复出现。
示例:
diff --git a/guide/api-javascript.md b/guide/api-javascript.md
index 3b891d11..de927db8 100644
--- a/guide/api-javascript.md
+++ b/guide/api-javascript.md
@@ -196,6 +196,46 @@ import { preview } from 'vite'
})()
```
+## `PreviewServer`
+
+```ts
+interface PreviewServer extends PreviewServerForHook {
+ resolvedUrls: ResolvedServerUrls
+}
+```
+
+## `PreviewServerForHook`
+
+```ts
+interface PreviewServerForHook {
+ /**
+ * 解析后的 vite 配置对象
+ */
+ config: ResolvedConfig
+ /**
+ * 一个 connect 应用实例。
+ * - 可用作将自定义中间件附加到预览服务器上。
+ * - 还可用作自定义 HTTP 服务器的处理函数
+ * 或作为任何 connect 风格的 Node.js 框架的中间件
+ *
+ * https://github.com/senchalabs/connect#use-middleware
+ */
+ middlewares: Connect.Server
+ /**
+ * 原生 Node http 服务器实例
+ */
+ httpServer: http.Server
+ /**
+ * Vite 在 CLI 中输出的解析后的 URL
+ */
+ resolvedUrls: ResolvedServerUrls | null
+ /**
+ * 打印服务器 URL
+ */
+ printUrls(): void
+}
+```
+
## `resolveConfig` {#resolveconfig}
**类型校验:**
diff --git a/guide/api-plugin.md b/guide/api-plugin.md
index 3cf4e6b9..18a5e1ff 100644
--- a/guide/api-plugin.md
+++ b/guide/api-plugin.md
@@ -309,10 +309,11 @@ Vite 插件也可以提供钩子来服务于特定的 Vite 目标。这些钩子
### `configurePreviewServer` {#configurepreviewserver}
-- **类型:** `(server: { middlewares: Connect.Server, httpServer: http.Server }) => (() => void) | void | Promise<(() => void) | void>`
+- **类型:** `(server: PreviewServerForHook) => (() => void) | void | Promise<(() => void) | void>`
- **种类:** `async`, `sequential`
+- **参见:** [PreviewServerForHook](./api-javascript#previewserverforhook)
- 与 [`configureServer`](/guide/api-plugin.html#configureserver) 相同但是作为预览服务器。它提供了一个 [connect](https://github.com/senchalabs/connect) 服务器实例及其底层的 [http server](https://nodejs.org/api/http.html)。与 `configureServer` 类似,`configurePreviewServer` 这个钩子也是在其他中间件安装前被调用的。如果你想要在其他中间件 **之后** 安装一个插件,你可以从 `configurePreviewServer` 返回一个函数,它将会在内部中间件被安装之后再调用:
+ 与 [`configureServer`](/guide/api-plugin.html#configureserver) 相同,但用于预览服务器。`configurePreviewServer` 这个钩子与 `configureServer` 类似,也是在其他中间件安装前被调用。如果你想要在其他中间件 **之后** 安装一个插件,你可以从 `configurePreviewServer` 返回一个函数,它将会在内部中间件被安装之后再调用:
```js
const myPlugin = () => ({
diff --git a/guide/features.md b/guide/features.md
index 56db86f5..361d48ee 100644
--- a/guide/features.md
+++ b/guide/features.md
@@ -74,7 +74,7 @@ export type { T }
如果你正在使用一个严重依赖 class fields 的库,请注意该库对此选项的预期设置。
-大多数库都希望 `"useDefineForClassFields": true`,如 [MobX](https://mobx.js.org/installation.html#use-spec-compliant-transpilation-for-class-properties),[Vue Class Components 8.x](https://github.com/vuejs/vue-class-component/issues/465) 等。
+大多数库都希望 `"useDefineForClassFields": true`,如 [MobX](https://mobx.js.org/installation.html#use-spec-compliant-transpilation-for-class-properties)。
但是有几个库还没有兼容这个新的默认值,其中包括 [`lit-element`](https://github.com/lit/lit-element/issues/1030)。如果遇到这种情况,请将 `useDefineForClassFields` 设置为 `false`。
@@ -96,7 +96,7 @@ Vite 默认的类型定义是写给它的 Node.js API 的。要将其补充到
///
```
-同时,你也可以将 `vite/client` 添加到 `tsconfig` 中的 `compilerOptions.types` 下:
+或者,你也可以将 `vite/client` 添加到 `tsconfig.json` 中的 `compilerOptions.types` 下:
```json
{
@@ -255,6 +255,7 @@ import otherStyles from './bar.css?inline' // 样式不会注入页面
::: tip 注意
自 Vite 4 起,CSS 文件的默认导入和按名导入(例如 `import style from './foo.css'`)将弃用。请使用 `?inline` 参数代替。
:::
+
## 静态资源处理 {#static-assets}
导入一个静态资源会返回解析后的 URL:
@@ -350,7 +351,7 @@ const modules = {
`import.meta.glob` 都支持以字符串形式导入文件,类似于 [以字符串形式导入资源](https://vitejs.dev/guide/assets.html#importing-asset-as-string)。在这里,我们使用了 [Import Reflection](https://github.com/tc39/proposal-import-reflection) 语法对导入进行断言:
```js
-const modules = import.meta.glob('./dir/*.js', { as: 'raw' })
+const modules = import.meta.glob('./dir/*.js', { as: 'raw', eager: true })
```
上面的代码会被转换为下面这样:
@@ -460,7 +461,7 @@ const modules = {
}
```
-### Glob 导入注意事项
+### Glob 导入注意事项 {#glob-import-caveats}
请注意:
diff --git a/guide/ssr.md b/guide/ssr.md
index 232ee2ae..1458b6ca 100644
--- a/guide/ssr.md
+++ b/guide/ssr.md
@@ -73,7 +73,8 @@ const __dirname = path.dirname(fileURLToPath(import.meta.url))
async function createServer() {
const app = express()
- // 以中间件模式创建 Vite 应用,这将禁用 Vite 自身的 HTML 服务逻辑
+ // 以中间件模式创建 Vite 应用,并将 appType 配置为 'custom'
+ // 这将禁用 Vite 自身的 HTML 服务逻辑
// 并让上级服务器接管控制
const vite = await createViteServer({
server: { middlewareMode: true },
@@ -210,10 +211,12 @@ const html = await vueServerRenderer.renderToString(app, ctx)
当运行 SSR 时依赖会由 Vite 的 SSR 转换模块系统作外部化。这会同时提速开发与构建。
-例如,如果依赖项需要通过 Vite 的管道进行转换,因为在这些依赖在管道中使用 Vite 特性时是不转翻译的,则可以将它们添加到 [`ssr.noExternal`](../config/ssr-options.md#ssrnoexternal) 中。
+如果依赖需要被 Vite 的管道转换,例如因为其中使用了未经过转译的 Vite 特性,那么它们可以被添加到 [`ssr.noExternal`](../config/ssr-options.md#ssr-noexternal) 中。
+
+对于采用链接的依赖,它们将默认不会被外部化,这是为了能使其利用 Vite HMR 的优势。如果你不需要这一功效,例如,想要把这些依赖当成非链接情况来测试,你可以将其添加到 [`ssr.external`](../config/ssr-options.md#ssr-external)。
:::warning 使用别名
-如果你为某个包配置了一个别名,为了能使 SSR 外部化依赖功能正常工作,你可能想要使用的别名应该指的是实际的 `node_modules` 中的包。[Yarn](https://classic.yarnpkg.com/en/docs/cli/add/#toc-yarn-add-alias) 和 [pnpm](https://pnpm.js.org/en/aliases) 都支持通过 `npm:` 前缀来设置别名。
+如果你为某个包配置了一个别名,为了能使 SSR 外部化依赖功能正常工作,你可能想要使用的别名应该指的是实际的 `node_modules` 中的包。[Yarn](https://classic.yarnpkg.com/en/docs/cli/add/#toc-yarn-add-alias) 和 [pnpm](https://pnpm.io/aliases/) 都支持通过 `npm:` 前缀来设置别名。
:::
## SSR 专有插件逻辑 {#ssr-specific-plugin-logic}
diff --git a/guide/troubleshooting.md b/guide/troubleshooting.md
index f774547f..12589a2f 100644
--- a/guide/troubleshooting.md
+++ b/guide/troubleshooting.md
@@ -121,6 +121,12 @@ import './Foo.js' // 应该为 './foo.js'
你需要通过 `http` 协议访问该文件。最简单的办法就是使用 `npx vite preview`。
+## 优化依赖 {#optimize-dependencies}
+
+### 链接本地包时过期预构建依赖项 {#outdated-pre-bundled-deps-when-linking-to-a-local-package}
+
+在 Vite 中通过一个哈希值来决定优化后的依赖项是否有效,这个值取决于包锁定的内容、应用于依赖项的补丁以及 Vite 配置文件中影响 node_modules 打包的选项。这意味着,当使用像 [npm overrides](https://docs.npmjs.com/cli/v9/configuring-npm/package-json#overrides) 这样的功能覆盖依赖项时,Vite 将检测到,并在下一次服务器启动时重新打包您的依赖项。当您使用像 [npm link](https://docs.npmjs.com/cli/v9/commands/npm-link) 这样的功能时,Vite 不会使依赖项无效。如果您链接或取消链接一个依赖项,那么您需要使用 `vite --force` 在下一次服务器启动时强制重新预构建。我们建议使用 overrides,它们现在被每个包管理器所支持(还可以参见 [pnpm overrides](https://pnpm.io/package_json#pnpmoverrides) 和 [yarn resolutions](https://yarnpkg.com/configuration/manifest/#resolutions))。
+
## 其他 {#others}
### Module externalized for browser compatibility {#module-externalized-for-browser-compatibility}
@@ -144,3 +150,7 @@ Vite 无法处理、也不支持仅可在非严格模式(sloppy mode)下运
> TypeError: Cannot create property 'foo' on boolean 'false'
如果这些代码是在依赖中被使用的,你应该使用 [`patch-package`](https://github.com/ds300/patch-package)(或者 [`yarn patch`](https://yarnpkg.com/cli/patch)、[`pnpm patch`](https://pnpm.io/cli/patch) 工具)来做短期补丁处理。
+
+### 浏览器扩展程序 {#browser-extensions}
+
+一些浏览器扩展程序(例如 ad-blockers 广告拦截器),可能会阻止 Vite 客户端向 Vite 开发服务器发送请求。在这种情况下,你可能会看到一个空白屏且没有错误日志。如果遇到这类问题,请尝试禁用扩展程序。
diff --git a/public/og-image-announcing-vite4-3.png b/public/og-image-announcing-vite4-3.png
new file mode 100644
index 00000000..6c297055
Binary files /dev/null and b/public/og-image-announcing-vite4-3.png differ
diff --git a/public/vite4-3-hmr-time.png b/public/vite4-3-hmr-time.png
new file mode 100644
index 00000000..bc9bc434
Binary files /dev/null and b/public/vite4-3-hmr-time.png differ
diff --git a/public/vite4-3-startup-time.png b/public/vite4-3-startup-time.png
new file mode 100644
index 00000000..a0269699
Binary files /dev/null and b/public/vite4-3-startup-time.png differ