本文档介绍了 Vite 在开发过程中如何服务静态文件,涵盖了内置的 public 目录功能和原始文件系统访问 API。这与 资源处理 不同,后者侧重于 Vite 在构建过程中如何处理和优化图片、字体和其他媒体文件等资源。
Vite 的静态文件服务系统实现了三个独立的中间件函数,它们通过不同的机制处理文件访问。
servePublicMiddleware 在服务器根目录下提供 config.publicDir(默认为 public/)中的文件。serveRawFsMiddleware 通过 FS_PREFIX(/@fs/)提供直接的文件系统访问。serveStaticMiddleware 从 config.root 提供静态文件。来源:packages/vite/src/node/server/middlewares/static.ts79-121 packages/vite/src/node/server/middlewares/static.ts123-195 packages/vite/src/node/server/middlewares/static.ts197-235
Public 目录通过 Vite 配置中的 publicDir 选项进行配置。
默认情况下,它设置为相对于项目根目录的 'public'。将其设置为 false 可禁用此功能。
文件系统访问通过服务器配置中的 fs 选项进行配置。
来源:packages/vite/src/node/config.ts214-240
每个静态文件中间件函数都使用 sirv 库,并带有自定义的 sirvOptions 配置用于文件服务。
shouldServe 函数调用 checkLoadingAccess,该函数根据文件系统安全规则返回 'allowed'、'denied' 或 'fallback'。
来源:packages/vite/src/node/server/middlewares/static.ts31-77 packages/vite/src/node/server/middlewares/static.ts286-299
servePublicMiddleware 函数直接在服务器根目录下提供 server.config.publicDir 中的文件,且不进行任何转换。
该中间件会跳过处理导入请求、内部请求(例如 /@vite-client)以及带有查询参数(如 ?url)的 URL。
来源:packages/vite/src/node/server/middlewares/static.ts79-121
serveRawFsMiddleware 函数处理以 FS_PREFIX(/@fs/)开头的请求,以提供直接的文件系统访问。
FS_PREFIX 被定义为 '/@fs/',允许访问任何文件系统路径,但会受到 checkLoadingAccess 安全验证的约束。
来源:packages/vite/src/node/server/middlewares/static.ts197-235 packages/vite/src/node/constants.ts9
serveStaticMiddleware 函数会进行别名解析和安全检查,从 server.config.root 提供静态文件。
来源:packages/vite/src/node/server/middlewares/static.ts123-195
Vite 通过 checkLoadingAccess 和 isFileLoadingAllowed 函数实现文件系统访问控制。
| 功能 | 目的 |
|---|---|
isFileServingAllowed | 为实现向后兼容而弃用的包装器。 |
isFileLoadingAllowed | 核心访问控制逻辑,使用 config.server.fs 设置。 |
checkLoadingAccess | 为文件访问返回 'allowed'、'denied' 或 'fallback'。 |
checkServingAccess | 基于 URL 的服务请求访问控制。 |
respondWithAccessDenied | 生成带有安全消息的 403 错误响应。 |
来源:packages/vite/src/node/server/middlewares/static.ts241-314 packages/vite/src/node/server/middlewares/static.ts316-332
server.fs 配置控制着 serveRawFsMiddleware 和 serveStaticMiddleware 的文件系统访问。
| 属性 | 类型 | 默认 | 描述 |
|---|---|---|---|
strict | 布尔值 | true | 启用文件系统访问限制。 |
allow | string[] | [workspaceRoot] | 允许文件系统访问的目录。 |
deny | string[] | ['.env', '.env.*', '*.{crt,pem}'] | 禁止访问的文件模式。 |
来源:playground/fs-serve/root/vite.config.js13-24 playground/fs-serve/root/vite.config-deny.js13-18
静态文件服务系统与 Vite 的其他几个系统进行了交互:
来源:packages/vite/src/node/server/index.ts859-917 packages/vite/src/node/server/middlewares/transform.ts106-215
将不需要处理且频繁访问的资源放入 public 目录。
public/
├─ favicon.ico
├─ logo.png
├─ robots.txt
└─ fonts/
└─ open-sans.woff2
这些文件将可以通过 `/favicon.ico`、`/logo.png` 等方式访问。
使用 `/@fs/` 前缀来访问项目根目录以外的文件。
将静态 HTML 文件放在项目根目录或 public 目录中。
public/
└─ about.html // Accessible at /about.html
来源:packages/vite/src/node/server/middlewares/static.ts59-110 packages/vite/src/node/server/middlewares/static.ts158-209
fs.strict: false,因为它会绕过安全检查。/@fs/ 前缀,在可能的情况下优先从项目内部导入。fs.allow,而不是禁用 strict 模式。来源: packages/vite/src/node/server/middlewares/static.ts270-418