diff --git a/config/build-options.md b/config/build-options.md index b95f8e16..2c7a2b8e 100644 --- a/config/build-options.md +++ b/config/build-options.md @@ -185,6 +185,71 @@ export default defineConfig({ }) ``` +## build.license {#build-license} + +- **类型:** `boolean | { fileName?: string }` +- **默认:** `false` + +当设置为 `true` 时,构建过程将生成一个 `.vite/license.md` 文件,其中包含所有打包依赖项的许可证信息。该文件可以被托管,用于展示和确认应用程序所使用的依赖项。当传入 `fileName` 参数时,它将被用作相对于 `outDir` 的许可证文件名。示例输出可能如下所示: + +```md +# Licenses + +The app bundles dependencies which contain the following licenses: + +## dep-1 - 1.2.3 (CC0-1.0) + +CC0 1.0 Universal + +... + +## dep-2 - 4.5.6 (MIT) + +MIT License + +... +``` + +如果 `fileName` 以 `.json` 结尾,则会生成原始的 JSON 元数据,可用于进一步处理。例如: + +```json +[ + { + "name": "dep-1", + "version": "1.2.3", + "identifier": "CC0-1.0", + "text": "CC0 1.0 Universal\n\n..." + }, + { + "name": "dep-2", + "version": "4.5.6", + "identifier": "MIT", + "text": "MIT License\n\n..." + } +] +``` + +::: tip +如果你希望在构建后的代码中引用许可证文件,可以使用 `build.rollupOptions.output.banner` 在文件顶部注入注释。例如: + +```js twoslash [vite.config.js] +import { defineConfig } from 'vite' + +export default defineConfig({ + build: { + license: true, + rollupOptions: { + output: { + banner: + '/* See licenses of bundled dependencies at https://example.com/license.md */', + }, + }, + }, +}) +``` + +::: + ## build.manifest {#build-manifest} - **类型:** `boolean | string` diff --git a/config/dep-optimization-options.md b/config/dep-optimization-options.md index 454d6e5d..a6f1984b 100644 --- a/config/dep-optimization-options.md +++ b/config/dep-optimization-options.md @@ -10,7 +10,7 @@ 默认情况下,Vite 会抓取你的 `index.html` 来检测需要预构建的依赖项(忽略了`node_modules`、`build.outDir`、`__tests__` 和 `coverage`)。如果指定了 `build.rollupOptions.input`,Vite 将转而去抓取这些入口点。 -如果这两者都不合你意,则可以使用此选项指定自定义条目——该值需要遵循 [tinyglobby 模式](https://github.com/SuperchupuDev/tinyglobby) ,或者是相对于 Vite 项目根目录的匹配模式数组。当显式声明了 `optimizeDeps.entries` 时默认只有 `node_modules` 和 `build.outDir` 文件夹会被忽略。如果还需忽略其他文件夹,你可以在模式列表中使用以 `!` 为前缀的、用来匹配忽略项的模式。对于明确包含字符串 `node_modules` 的模式,不会忽略 `node_modules`。 +如果这两者都不合你意,则可以使用此选项指定自定义条目——该值需要遵循 [tinyglobby 模式](https://superchupu.dev/tinyglobby/comparison) ,或者是相对于 Vite 项目根目录的匹配模式数组。当显式声明了 `optimizeDeps.entries` 时默认只有 `node_modules` 和 `build.outDir` 文件夹会被忽略。如果还需忽略其他文件夹,你可以在模式列表中使用以 `!` 为前缀的、用来匹配忽略项的模式。对于明确包含字符串 `node_modules` 的模式,不会忽略 `node_modules`。 ## optimizeDeps.exclude {#optimizedeps-exclude} diff --git a/config/server-options.md b/config/server-options.md index 289529b9..accd5a6b 100644 --- a/config/server-options.md +++ b/config/server-options.md @@ -92,8 +92,6 @@ Vite允许响应的主机名。 启用 TLS + HTTP/2。该值是传递给 `https.createServer()` 的 [options 对象](https://nodejs.org/api/https.html#https_https_createserver_options_requestlistener)。 -请注意,仅当同时使用 [`server.proxy` 选项](#server-proxy) 时,才会降级为 TLS。 - 需要一个合法可用的证书。对基本使用的配置需求来说,你可以添加 [@vitejs/plugin-basic-ssl](https://github.com/vitejs/vite-plugin-basic-ssl) 到项目插件中,它会自动创建和缓存一个自签名的证书。但我们推荐你创建和使用你自己的证书。 ## server.open {#server-open} @@ -233,7 +231,7 @@ Direct websocket connection fallback. Check out https://vite.dev/config/server-o 提前转换和缓存文件以进行预热。可以在服务器启动时提高初始页面加载速度,并防止转换瀑布。 -`clientFiles` 是仅在客户端使用的文件,而 `ssrFiles` 是仅在服务端渲染中使用的文件。它们接受相对于 `root` 的文件路径数组或 [`tinyglobby`](https://github.com/SuperchupuDev/tinyglobby) 模式。 +`clientFiles` 是仅在客户端使用的文件,而 `ssrFiles` 是仅在服务端渲染中使用的文件。它们接受相对于 `root` 的文件路径数组或 [`tinyglobby` 模式](https://superchupu.dev/tinyglobby/comparison) 。 请确保只添加经常使用的文件,以免在启动时过载 Vite 开发服务器。 diff --git a/guide/features.md b/guide/features.md index 722f2a08..a1210185 100644 --- a/guide/features.md +++ b/guide/features.md @@ -196,7 +196,7 @@ HTML 文件位于 Vite 项目的[最前端和中心](/guide/#index-html-and-proj - 或仅当 `property` 属性匹配以下值时:`og:image`,`og:image:url`,`og:image:secure_url`,`og:audio`,`og:audio:secure_url`,`og:video`,或 `og:video:secure_url` ```html {4-5,8-9} - + @@ -237,8 +237,8 @@ import { defineConfig } from 'vite' export default defineConfig({ esbuild: { jsxFactory: 'h', - jsxFragment: 'Fragment', - }, + jsxFragment: 'Fragment' + } }) ``` @@ -251,8 +251,8 @@ import { defineConfig } from 'vite' export default defineConfig({ esbuild: { - jsxInject: `import React from 'react'`, - }, + jsxInject: `import React from 'react'` + } }) ``` @@ -427,7 +427,7 @@ const modules = import.meta.glob('./dir/*.js') // vite 生成的代码 const modules = { './dir/bar.js': () => import('./dir/bar.js'), - './dir/foo.js': () => import('./dir/foo.js'), + './dir/foo.js': () => import('./dir/foo.js') } ``` @@ -457,7 +457,7 @@ import * as __vite_glob_0_0 from './dir/bar.js' import * as __vite_glob_0_1 from './dir/foo.js' const modules = { './dir/bar.js': __vite_glob_0_0, - './dir/foo.js': __vite_glob_0_1, + './dir/foo.js': __vite_glob_0_1 } ``` @@ -484,7 +484,7 @@ const modules = import.meta.glob(['./dir/*.js', '!**/bar.js']) ```js // vite 生成的代码 const modules = { - './dir/foo.js': () => import('./dir/foo.js'), + './dir/foo.js': () => import('./dir/foo.js') } ``` @@ -502,7 +502,7 @@ const modules = import.meta.glob('./dir/*.js', { import: 'setup' }) // vite 生成的代码 const modules = { './dir/bar.js': () => import('./dir/bar.js').then((m) => m.setup), - './dir/foo.js': () => import('./dir/foo.js').then((m) => m.setup), + './dir/foo.js': () => import('./dir/foo.js').then((m) => m.setup) } ``` @@ -513,7 +513,7 @@ import 'vite/client' // ---cut--- const modules = import.meta.glob('./dir/*.js', { import: 'setup', - eager: true, + eager: true }) ``` @@ -523,7 +523,7 @@ import { setup as __vite_glob_0_0 } from './dir/bar.js' import { setup as __vite_glob_0_1 } from './dir/foo.js' const modules = { './dir/bar.js': __vite_glob_0_0, - './dir/foo.js': __vite_glob_0_1, + './dir/foo.js': __vite_glob_0_1 } ``` @@ -534,7 +534,7 @@ import 'vite/client' // ---cut--- const modules = import.meta.glob('./dir/*.js', { import: 'default', - eager: true, + eager: true }) ``` @@ -544,7 +544,7 @@ import { default as __vite_glob_0_0 } from './dir/bar.js' import { default as __vite_glob_0_1 } from './dir/foo.js' const modules = { './dir/bar.js': __vite_glob_0_0, - './dir/foo.js': __vite_glob_0_1, + './dir/foo.js': __vite_glob_0_1 } ``` @@ -557,11 +557,11 @@ import 'vite/client' // ---cut--- const moduleStrings = import.meta.glob('./dir/*.svg', { query: '?raw', - import: 'default', + import: 'default' }) const moduleUrls = import.meta.glob('./dir/*.svg', { query: '?url', - import: 'default', + import: 'default' }) ``` @@ -569,11 +569,11 @@ const moduleUrls = import.meta.glob('./dir/*.svg', { // vite 生成的代码 const moduleStrings = { './dir/bar.svg': () => import('./dir/bar.svg?raw').then((m) => m['default']), - './dir/foo.svg': () => import('./dir/foo.svg?raw').then((m) => m['default']), + './dir/foo.svg': () => import('./dir/foo.svg?raw').then((m) => m['default']) } const moduleUrls = { './dir/bar.svg': () => import('./dir/bar.svg?url').then((m) => m['default']), - './dir/foo.svg': () => import('./dir/foo.svg?url').then((m) => m['default']), + './dir/foo.svg': () => import('./dir/foo.svg?url').then((m) => m['default']) } ``` @@ -583,7 +583,7 @@ const moduleUrls = { import 'vite/client' // ---cut--- const modules = import.meta.glob('./dir/*.js', { - query: { foo: 'bar', bar: true }, + query: { foo: 'bar', bar: true } }) ``` @@ -595,7 +595,7 @@ const modules = import.meta.glob('./dir/*.js', { import 'vite/client' // ---cut--- const modulesWithBase = import.meta.glob('./**/*.js', { - base: './base', + base: './base' }) ``` @@ -603,7 +603,7 @@ const modulesWithBase = import.meta.glob('./**/*.js', { // code produced by vite: const modulesWithBase = { './dir/foo.js': () => import('./base/dir/foo.js'), - './dir/bar.js': () => import('./base/dir/bar.js'), + './dir/bar.js': () => import('./base/dir/bar.js') } ``` @@ -619,7 +619,7 @@ const modulesWithBase = { - 这只是一个 Vite 独有的功能而不是一个 Web 或 ES 标准 - 该 Glob 模式会被当成导入标识符:必须是相对路径(以 `./` 开头)或绝对路径(以 `/` 开头,相对于项目根目录解析)或一个别名路径(请看 [`resolve.alias` 选项](/config/shared-options.md#resolve-alias))。 -- Glob 匹配是使用 [`tinyglobby`](https://github.com/SuperchupuDev/tinyglobby) 来实现的 —— 阅读它的文档来查阅 [支持的 Glob 模式](https://github.com/mrmlnc/fast-glob#pattern-syntax)。 +- Glob 匹配是使用 [`tinyglobby`](https://github.com/SuperchupuDev/tinyglobby) 来实现的 —— 阅读它的文档来查阅 [支持的 Glob 模式](https://superchupu.dev/tinyglobby/comparison)。 - 你还需注意,所有 `import.meta.glob` 的参数都必须以字面量传入。你 **不** 可以在其中使用变量或表达式。 ## 动态导入 {#dynamic-import} @@ -657,8 +657,8 @@ init({ imports: { someFunc: () => { /* ... */ - }, - }, + } + } }).then(() => { /* ... */ }) @@ -682,8 +682,9 @@ import wasmUrl from 'foo.wasm?url' const main = async () => { const responsePromise = fetch(wasmUrl) - const { module, instance } = - await WebAssembly.instantiateStreaming(responsePromise) + const { module, instance } = await WebAssembly.instantiateStreaming( + responsePromise + ) /* ... */ } @@ -729,7 +730,7 @@ worker 构造函数会接受可以用来创建 “模块” worker 的选项: ```ts const worker = new Worker(new URL('./worker.js', import.meta.url), { - type: 'module', + type: 'module' }) ```