| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- #!/usr/bin/env node
- /**
- * 等待 Vite 开发服务器启动的脚本
- * 从配置文件读取端口,并等待服务器就绪
- * 如果配置端口被占用,Vite 会自动尝试下一个端口,此脚本会检测实际使用的端口
- */
- const path = require('path');
- const http = require('http');
- // 获取配置文件
- const configPath = path.join(__dirname, 'config.js');
- const config = require(configPath);
- const startPort = config.vite?.port || 5173;
- const viteHost = config.vite?.host || 'localhost';
- const maxWaitTime = 20; // 最多等待 20 秒
- const maxPortAttempts = 10; // 最多尝试 10 个连续端口
- const checkInterval = 500; // 每 500ms 检查一次
- /**
- * 检查指定端口是否有 Vite 服务器响应
- * 不仅检查端口是否响应,还要确认是 Vite 服务器(通过检查响应头)
- */
- function checkPort(port) {
- return new Promise((resolve) => {
- const req = http.get(`http://${viteHost}:${port}`, (res) => {
- // 检查状态码
- if (res.statusCode !== 200) {
- resolve(false);
- return;
- }
-
- // 读取响应数据以确认是否是 Vite 服务器
- let data = '';
- let resolved = false;
-
- res.on('data', (chunk) => {
- if (resolved) return;
- data += chunk.toString();
- // 如果响应包含 Vite 的特征(如 vite/client 或 Vite),确认是 Vite 服务器
- if (data.length > 100 && (data.includes('/vite') || data.includes('Vite') || data.includes('vite/client'))) {
- resolved = true;
- resolve(true);
- }
- });
-
- res.on('end', () => {
- if (resolved) return;
- // 如果响应结束,检查是否包含 Vite 特征
- // Vite 的 HTML 通常包含 vite/client 或类似的引用
- if (data.includes('/vite') || data.includes('Vite') || data.includes('vite/client')) {
- resolve(true);
- } else {
- resolve(false);
- }
- });
- });
-
- req.on('error', () => {
- resolve(false);
- });
-
- req.setTimeout(2000, () => {
- req.destroy();
- resolve(false);
- });
- });
- }
- /**
- * 查找 Vite 实际使用的端口
- */
- async function findVitePort() {
- // 从配置的端口开始,尝试最多 maxPortAttempts 个连续端口
- for (let offset = 0; offset < maxPortAttempts; offset++) {
- const port = startPort + offset;
- const isReady = await checkPort(port);
- if (isReady) {
- return port;
- }
- }
- return null;
- }
- async function waitForServer() {
- console.log(`Waiting for Vite dev server (starting from port ${startPort})...`);
-
- const startTime = Date.now();
- let lastFoundPort = null;
- let consecutiveChecks = 0;
-
- while (Date.now() - startTime < maxWaitTime * 1000) {
- const port = await findVitePort();
- if (port) {
- // 如果找到的端口和上次一样,连续检查几次确保稳定
- if (port === lastFoundPort) {
- consecutiveChecks++;
- if (consecutiveChecks >= 3) {
- // 连续3次检查到同一个端口,确认服务器稳定运行
- console.log(`\n[OK] Vite dev server is ready at http://${viteHost}:${port}`);
- process.exit(0);
- }
- } else {
- // 端口变化了,重置计数器
- lastFoundPort = port;
- consecutiveChecks = 1;
- }
- } else {
- // 没找到服务器,重置计数器
- lastFoundPort = null;
- consecutiveChecks = 0;
- }
-
- // 显示进度
- process.stdout.write('.');
- await new Promise(resolve => setTimeout(resolve, checkInterval));
- }
-
- console.log(`\n[ERROR] Vite dev server did not start within ${maxWaitTime} seconds`);
- process.exit(1);
- }
- waitForServer();
|