Vite 项目启动时打印自定义启动信息

在开发和维护前端项目时,特别是使用 Vite 这样的现代构建工具,我们经常需要在项目启动时输出一些自定义的启动信息,例如当前运行的环境、API 地址以及端口号等。本文将介绍如何通过自定义 Vite 插件,在项目启动时打印这些信息,并提供详细的代码和注释说明。

需求分析

在启动 Vite 开发服务器时,我们希望能够看到以下信息:

  • 当前连接的服务器名称
  • 本地地址
  • 网络地址
  • 环境名称
  • API 基础地址
  • 端口号

实现思路

我们可以通过编写一个 Vite 插件来实现这个功能。Vite 插件系统非常灵活,允许我们在不同的生命周期钩子中执行自定义逻辑。这里,我们将利用 configureServer 钩子来添加自定义的启动信息打印逻辑。

插件代码

下面是插件的完整代码,并附带详细的 JSDoc 注释:

import envConfig from '../env'
 
/**
 * Vite 插件,用于在服务器启动时输出自定义的启动信息。
 * @returns {Object} Vite 插件配置对象
 */
export default function viteCustomStartupInfo() {
  return {
    name: 'vite-custom-startup-info',
    /**
     * 配置 Vite 服务器,在服务器启动时打印自定义的启动信息。
     * @param {Object} server - Vite 服务器实例
     */
    configureServer(server) {
      server.httpServer.once('listening', () => {
        const mode = server.config.mode;
        const env = envConfig[mode];
 
        const { port, host } = server.config.server;
        const localAddress = `http://localhost:${port}/?displayPosition=1`;
        const networkAddress = `http://${host}:${port}/`;
 
        const serverInfo = {
 
          'Local': localAddress,
          'Network': networkAddress,
          'name': env.VITE_NAME,
          'url': env.VITE_API_BASE_URL,
          'port': env.VITE_PORT
        };
        console.log(`当前连接服务器=========>> \n`);
        console.table(JSON.stringify(serverInfo, null, 2));
      });
    }
  }
}
 

代码说明

1. 引入环境配置

我们首先从 ../env 文件中引入环境配置,这个配置文件包含了各个环境的变量信息,如 API 基础地址、端口号等。

import envConfig from '../env'

2. 定义插件函数

定义一个名为 viteCustomStartupInfo 的函数,它返回一个 Vite 插件配置对象。插件的名称为 vite-custom-startup-info

export default function viteCustomStartupInfo() {
  return {
    name: 'vite-custom-startup-info',
    ...
  }
}

3. 配置服务器

在插件对象中,使用 configureServer 钩子来配置 Vite 服务器。这个钩子接收一个 server 参数,代表 Vite 服务器实例。

configureServer(server) {
  server.httpServer.once('listening', () => {
    const mode = server.config.mode;
    const env = envConfig[mode];
    ...
  });
}

4. 获取配置信息

server.config 中获取当前的模式(mode)和服务器配置(porthost),并根据模式从 envConfig 中获取相应的环境变量。

const mode = server.config.mode;
const env = envConfig[mode];
 
const { port, host } = server.config.server;
const localAddress = `http://localhost:${port}/?displayPosition=1`;
const networkAddress = `http://${host}:${port}/`;

5. 打印启动信息

将获取的信息整理成一个对象,并使用 JSON.stringify 将其格式化为漂亮的 JSON 字符串,然后打印到控制台。

const serverInfo = {
  '当前连接服务器': '=========>>',
  'Local': localAddress,
  'Network': networkAddress,
  'name': env.VITE_NAME,
  'url': env.VITE_API_BASE_URL,
  'port': env.VITE_PORT
};
 
console.log(JSON.stringify(serverInfo, null, 2));

环境配置文件

为了让插件能够正确读取环境变量,我们需要一个环境配置文件 env.js。下面是配置文件的代码,并附带详细的 JSDoc 注释:

/**
 * @typedef {Object} EnvironmentConfig
 * @property {string} VITE_API_BASE_URL - API 基础 URL
 * @property {number} VITE_PORT - 应用端口
 * @property {string} OTHER_VARIABLE - 其他变量
 * @property {string} VITE_NAME - 环境名称
 * @property {string} VITE_APP_ENV - 应用环境标识
 */
 
/**
 * 应用环境配置
 * @type {{development: EnvironmentConfig, staging: EnvironmentConfig, production: EnvironmentConfig, zxq: EnvironmentConfig}}
 */
 
const env = {
  development: {
    VITE_API_BASE_URL: 'https://dev.api.yourservice.com',
    VITE_PORT: 3000,
    OTHER_VARIABLE: 'value_for_dev',
    VITE_NAME: 'dev环境',
    VITE_APP_ENV: 'dev'
  },
  staging: {
    VITE_API_BASE_URL: 'https://staging.api.yourservice.com',
    VITE_PORT: 3001,
    OTHER_VARIABLE: 'value_for_staging',
    VITE_NAME: 'staging环境',
    VITE_APP_ENV: 'staging'
  },
  production: {
    VITE_API_BASE_URL: 'https://api.yourservice.com',
    VITE_PORT: 3002,
    OTHER_VARIABLE: 'value_for_production',
    VITE_NAME: 'prod环境',
    VITE_APP_ENV: 'prod'
  }
};
 
export default env

代码说明

1. 定义 EnvironmentConfig 类型

通过 JSDoc 注释定义一个 EnvironmentConfig 类型,描述环境配置对象的结构。

/**
 * @typedef {Object} EnvironmentConfig
 * @property {string} VITE_API_BASE_URL - API 基础 URL
 * @property {number} VITE_PORT - 应用端口
 * @property {string} OTHER_VARIABLE - 其他变量
 * @property {string} VITE_NAME - 环境名称
 * @property {string} VITE_APP_ENV - 应用环境标识
 */

2. 定义环境配置对象

定义一个包含所有环境配置的对象 env,每个环境(如 developmentstagingproduction)都有自己的配置。

/**
 * 应用环境配置
 * @type {{development: EnvironmentConfig, staging: EnvironmentConfig, production: EnvironmentConfig, zxq: EnvironmentConfig}}
 */
 
const env = {
  development: {
    VITE_API_BASE_URL: 'https://dev.api.yourservice.com',
    VITE_PORT: 3000,
    OTHER_VARIABLE: 'value_for_dev',
    VITE_NAME: 'dev环境',
    VITE_APP_ENV: 'dev'
  },
  staging: {
    VITE_API_BASE_URL: 'https://staging.api.yourservice.com',
    VITE_PORT: 3001,
    OTHER_VARIABLE: 'value_for_staging',
    VITE_NAME: 'staging环境',
    VITE_APP_ENV: 'staging'
  },
  production: {
    VITE_API_BASE_URL: 'https://api.yourservice.com',
    VITE_PORT: 3002,
    OTHER_VARIABLE: 'value_for_production',
    VITE_NAME: 'prod环境',
    VITE_APP_ENV: 'prod'
  }
};
 
export default env

效果展示

当你运行 Vite 开发服务器时,将会在控制台看到如下输出:

当前连接服务器=========>>
 
{
  "Local": "http://localhost:3001/?displayPosition=1",
  "Network": "http://0.0.0.0:3001/",
  "name": "staging环境",
  "url": "https://staging.api.yourservice.com",
  "port": 3001
}

总结

通过编写一个简单的 Vite 插件,并结合环境配置文件,我们可以在开发服务器启动时打印出自定义的启动信息。这对于调试和确认环境配置非常有帮助。希望本文对你有所帮助,如果有任何问题或建议,欢迎交流讨论。

Happy coding! 🚀