自动找空闲端口再启动 mock-server」的脚本

一个完整的 自动分配 mock-server 和前端服务端口 的启动脚本 ✨,可以放在项目根目录,例如 start-dev.js。


✅ 目录结构约定

项目结构示例:

lua 复制代码
project-root/
├── .env.local
├── start-dev.js ← 👈 新增
├── package.json
├── mock-server/
│   └── index.mjs
├── src/
│   └── muiUI/
│       └── apps/
│           └── cardUI/
│               └── rsbuild.config.ts

✅ 第一步:安装依赖

csharp 复制代码
pnpm add -D dotenv get-port concurrently

✅ 第二步:修改 .env.local 支持默认端口

ini 复制代码
# 可写默认值,但自动脚本可覆盖它
VITE_MOCK_PORT=3001
VITE_DEV_PORT=4200

✅ 第三步:start-dev.js 自动找端口并启动

ini 复制代码
// start-dev.js
import { exec } from 'child_process';
import * as dotenv from 'dotenv';
import getPort from 'get-port';
import path from 'path';
import fs from 'fs';

dotenv.config({ path: path.resolve(__dirname, '.env.local') });

const start = async () => {
  const defaultMockPort = parseInt(process.env.VITE_MOCK_PORT || '3001');
  const defaultDevPort = parseInt(process.env.VITE_DEV_PORT || '4200');

  const mockPort = await getPort({ port: defaultMockPort });
  const devPort = await getPort({ port: defaultDevPort });

  // 动态更新 .env.local 中的端口(可选)
  const envPath = path.resolve(__dirname, '.env.local');
  let envContent = fs.readFileSync(envPath, 'utf-8');

  envContent = envContent
    .replace(/VITE_MOCK_PORT=.*/, `VITE_MOCK_PORT=${mockPort}`)
    .replace(/VITE_DEV_PORT=.*/, `VITE_DEV_PORT=${devPort}`);

  fs.writeFileSync(envPath, envContent);
  console.log(`✅ 端口更新成功:mock=${mockPort}, dev=${devPort}`);

  // 启动 mock-server + 前端服务(cardUI)
  const command = `concurrently -n MOCK,DEV -c yellow,cyan "pnpm --filter mock-server dev" "pnpm --filter @muiUI/cardui dev"`;

  const child = exec(command, { cwd: __dirname });

  child.stdout?.pipe(process.stdout);
  child.stderr?.pipe(process.stderr);
};

start();

✅ 第四步:mock-server/index.mjs 中读取端口

ini 复制代码
// mock-server/index.mjs
import jsonServer from 'json-server';
import dotenv from 'dotenv';

dotenv.config({ path: '../../.env.local' }); // 根据实际位置调整

const port = process.env.VITE_MOCK_PORT || 3001;
const server = jsonServer.create();
const router = jsonServer.router('db.json');
const middlewares = jsonServer.defaults();

server.use(middlewares);
server.use(router);

server.listen(port, () => {
  console.log(`🚀 mock-server running on http://localhost:${port}`);
});

✅ 第五步:package.json 中添加启动命令

json 复制代码
// 根目录的 package.json
{
  "scripts": {
    "dev": "node start-dev.js"
  }
}

🧪 启动项目

复制代码
pnpm dev

它会:

  • 自动找两个没被占用的端口(mock / 前端)
  • 写入 .env.local
  • 并用 concurrently 启动 mock-server 和 cardUI 前端

相关推荐
多客:duokelijie5 天前
代练订单系统选型思路:跨品类游戏接入、订单分层管理、自动结算逻辑拆解!
数据库·mysql·微信小程序·前端框架·uni-app·php·持续部署
Highcharts.js6 天前
React 中原生支持使用 JSX 组件配置自定义表格 Highcharts Grid
前端·javascript·react.js·前端框架·jsx·highcharts·自定义表格
锋行天下7 天前
Langgraph-cli 本地构建失败,改用服务器docker构建的流程
人工智能·前端框架·全栈
狂潮lister7 天前
🚀 《掘金・挖矿小精灵》完整产品与系统架构设计 & V1.3‑LD‑M 落地工程设计文档(**封档版**)
前端·架构·前端框架
王亚博_Abel7 天前
AI 编程时代怎么选前端框架?同一个应用让 Agent 用 12 种框架各写 5 遍,我整理出这套选型方法
前端·人工智能·前端框架
Highcharts.js9 天前
Highcharts 集成到 React 或 Vue 项目中时,如何高效地使用 TypeScript技巧?
vue.js·人工智能·react.js·typescript·前端框架·highcharts
江屿风10 天前
【Plain Language Large Model】【从浏览器到全栈:一课精通Node.js三剑客】流食般投喂
笔记·前端框架·npm·node.js·js·npx
小李科技11 天前
【性能优化】事件委托:目标定位与 React/Vue 实战
前端·vue.js·react.js·面试·性能优化·前端框架
Cosolar12 天前
不收费、不加水印、数据归你:我做了个开源的在线简历工具
后端·面试·前端框架
山东孙燕姿12 天前
前端框架升级:不敢动的组件怎么办
大数据·运维·服务器·网络·人工智能·前端框架