← 返回目录

第 17 卷

第 17 / 26 卷日期:

  • configureServer:自定义 Dev Server 配置(如添加 Koa 中间件、修改服务器选项)。
  • handleHotUpdate:控制热更新流程(如过滤需要热更新的模块、自定义模块替换逻辑)。
  • configurePreviewServer:自定义预览服务器(生产构建后预览)的配置。
  1. 插件工作原理详解

Vite 插件的工作核心是“管道式拦截与处理”,结合开发环境和生产环境的不同流程,具体原理如下:

(1)开发环境(Dev Server)

  1. 浏览器发起模块请求(如 /src/main.js),Vite Dev Server 接收请求。
  2. 请求首先经过插件的 resolveId 钩子,解析模块的真实路径(如处理别名 @/main.js →

/src/main.js)。

  1. 接着通过 load 钩子加载模块内容(如读取本地 src/main.js 文件内容)。
  2. 然后通过 transform 钩子转换模块内容(如将 TypeScript 转译为 JavaScript、将 SASS 转译

为 CSS)。

  1. 最后将处理后的 ESM 格式内容返回给浏览器,完成一次模块请求的处理。
  2. 若涉及 Dev Server 扩展(如跨域代理、中间件),则通过 configureServer 钩子添加的逻辑

介入请求处理流程。

(2)生产环境(Rollup 打包)

  1. Vite 调用 Rollup 进行打包,Rollup 启动后会扫描入口模块,构建依赖图。
  2. 在模块解析阶段,触发插件的 resolveId 钩子,解析模块路径。
  3. 在模块加载阶段,触发 load 钩子加载模块内容。
  4. 在模块转换阶段,触发 transform 钩子处理模块内容。
  5. Rollup 按照插件处理后的模块和依赖关系,打包生成最终的产物文件(如

dist/assets/index.[hash].js)。

  1. 自定义 Vite 插件示例

以“替换模块中特定字符串”的简单插件为例,展示插件的实现方式:

Code block

1// vite-plugin-replace-string.js

2export default function replaceStringPlugin(options = {}) {
3const { search, replace } = options;
4return {
10return code.replace(new RegExp(search, 'g'), replace);
11}
12return code; //无替换时返回原代码
13},
14configureServer(server) {
15//自定义Dev Server:添加一个中间件
16server.middlewares.use((req, res, next) => {
17if (req.url === '/custom-path') {
18res.end('Hello from custom middleware!');
19return;
20}
21next();
22});
23}
24};
25 }

26 27// 在 vite.config.js 中使用

28import { defineConfig } from 'vite';

29import replaceStringPlugin from './vite-plugin-replace-string';

30 31export default defineConfig({

32plugins: [ 33replaceStringPlugin({

34search: 'process.env.NODE_ENV',
35replace: '"development"'
36})
37]
38 });

二十二、Vite项目如何配置代理(Proxy)来解决跨域请求问题?

在 Vite 项目中,跨域请求问题通常通过配置 Dev Server 代理(Proxy)解决。核心原理是:利用浏览器与 Dev Server 之间无跨域限制(同源),将前端发起的跨域请求转发到 Dev Server,再由 Dev

Server 代理转发到目标后端服务器,从而规避浏览器的同源策略限制。Vite 的代理配置基于 httpproxy-middleware 实现,支持丰富的自定义选项。

  1. 核心配置方式

Vite 的代理配置在 vite.config.js 的 server.proxy 选项中设置,支持两种配置格式:对象

1// vite.config.js 2import { defineConfig } from 'vite';

3 4export default defineConfig({

5server: {

6proxy: 'http://localhost:3001' //目标后端服务器地址
7//前端发起的所有请求(如/api/user)都会被转发到http://localhost:3001/api/user
8}
9 });

(2)高级配置:多代理规则(对象格式)

适用于复杂场景(如多后端服务、路径重写、自定义请求头),通过键值对定义代理规则,键为需要匹配的请求路径前缀,值为代理选项:

Code block

1// vite.config.js 2import { defineConfig } from 'vite';

3 4export default defineConfig({

5server: { 6proxy: {

7// 规则1:匹配以 /api 开头的请求 8'/api': {

9target: 'http://localhost:3001', //目标后端服务器地址
10changeOrigin: true, //开启跨域:修改请求头中的Origin为目标服务器地址
11rewrite: (path) => path.replace(/^\/api/, ''), //路径重写:去掉/api前

缀(如 /api/user → /user)

12headers: { // 自定义请求头

13'X-Custom-Header': 'vite-proxy'
14}
15},
16//规则2:匹配以/auth开头的请求(转发到另一个后端服务)
17'/auth': {
18target: 'http://localhost:3002',
19changeOrigin: true,
20secure: false //若目标服务器是HTTPS且证书不被信任,设置为false跳过证书验

证 21}

22}

全站分卷索引 · 26 卷
  1. 1第 1 卷
  2. 2第 2 卷
  3. 3第 3 卷
  4. 4第 4 卷
  5. 5第 5 卷
  6. 6第 6 卷
  7. 7第 7 卷
  8. 8第 8 卷
  9. 9第 9 卷
  10. 10第 10 卷
  11. 11第 11 卷
  12. 12第 12 卷
  13. 13第 13 卷
  14. 14第 14 卷
  15. 15第 15 卷
  16. 16第 16 卷
  17. 17第 17 卷
  18. 18第 18 卷
  19. 19第 19 卷
  20. 20第 20 卷
  21. 21第 21 卷
  22. 22第 22 卷
  23. 23第 23 卷
  24. 24第 24 卷
  25. 25第 25 卷
  26. 26第 26 卷