命令启动程序的时候,自动打开chrome 浏览器, 如果浏览器是开着的,端口跟协议都没变的情况下,不用重新打开一个窗口,刷新即可
实现自动刷新浏览器,而不是重新打开新窗口
✅ 方式一:使用浏览器控制插件(如 Chrome 插件)
- 使用 WebSocket 通知浏览器刷新。
- 启动脚本中监听文件改动或端口激活状态,向浏览器发送刷新命令。
✅ 方式二:使用 open
时加 --new-tab
或检测已有标签页
如果是 Node.js 的 open
包或 child_process.exec('start chrome ...')
,默认每次都会打开一个新的窗口。
✅ 可以优化为:
使用 --new-tab
参数、或更进一步做浏览器控制:
sql
import { exec } from 'child_process';
exec(`start chrome http://localhost:4200 --new-tab`);
⚠️ 注意:不同平台参数不一致:
系统 | 浏览器命令参数 |
---|---|
Windows | start chrome URL |
macOS | open -a "Google Chrome" URL |
Linux | google-chrome URL 或 xdg-open |
❗更强的方案(推荐):
👉 使用 livereload
或 browser-sync
进行自动刷新
如果你希望开发时 Mock、页面自动刷新体验好,可以:
- 在
start-dev.mjs
启动脚本中引入livereload
- 配合
connect-livereload
、browser-sync
实现 页面不关闭、自动刷新
✅ 最佳实践建议:
功能 | 建议方案 |
---|---|
define 中的环境变量值 |
使用 process.env.XYZ ,并 不要嵌套多余引号 |
环境变量来源 | 建议从 proxy.config.js / .env.json 统一读取,不直接写死 |
启动时打开浏览器行为 | 检测是否已打开、使用 --new-tab 、或者使用自动刷新方案代替 |
自动刷新浏览器 | 推荐使用 livereload 、browser-sync 提升体验 |
二、下面实现一个 "自动刷新浏览器功能"的run.mjs
版本,支持 mock + dev 一起启动,还能检测端口变化和刷新页面。 下面是一个基于你现有项目结构和需求优化后的 run.mjs
文件,实现:
✅ 启动 mock-server 和前端 dev
✅ 支持自动打开并刷新浏览器
✅ 支持从 proxy.config.js
自动读取 mockPort
和 devPort
✅ 自动找空闲端口(如被占用)
✅ 支持 mock 开关控制
✅ start-dev.mjs
文件内容:
ini
import { exec } from 'child_process';
import path from 'path';
import open from 'open';
import detect from 'detect-port';
import { fileURLToPath } from 'url';
import { createRequire } from 'module';
import fs from 'fs';
const require = createRequire(import.meta.url);
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const { proxy } = require('./proxy.config.js');
// ---- 配置读取 ----
const isMock = proxy?.mock?.enabled ?? true;
const basePath = proxy?.mock?.basePath ?? '/xd/api';
const devPortDefault = proxy?.devPort ?? 4200;
const mockPortDefault = proxy?.mock?.port ?? 3001;
// ---- 自动找空闲端口 ----
const findPort = async (defaultPort) => {
try {
return await detect(defaultPort);
} catch {
return defaultPort;
}
};
const run = async () => {
const devPort = await findPort(devPortDefault);
const mockPort = isMock ? await findPort(mockPortDefault) : null;
// 注入 devPort 到代理 config(可选写回)
console.log(`🟢 Dev Port: ${devPort}`);
if (mockPort) console.log(`🟡 Mock Port: ${mockPort}`);
const commands = [];
if (isMock) {
commands.push(`cross-env MOCK_PORT=${mockPort} pnpm -F mock-server dev`);
}
commands.push(`cross-env DEV_PORT=${devPort} pnpm -F @muiUI/cardui dev`);
// 执行 concurrently 启动所有服务
const cmd = `npx concurrently "${commands.join('" "')}"`;
const child = exec(cmd);
// pipe 日志输出
child.stdout?.pipe(process.stdout);
child.stderr?.pipe(process.stderr);
// 打开浏览器并尝试刷新
const localUrl = `http://localhost:${devPort}`;
console.log(`🌐 Opening browser at ${localUrl}`);
await open(localUrl);
};
run();
✅ proxy.config.js
示例(改进)
yaml
export const proxy = {
"/xd/api": {
devTarget: "http://muhome-dev.service.com:81",
uatTarget: "http://muhome-uat.service.com:81"
},
devPort: 4200,
mock: {
enabled: true,
port: 3001,
basePath: "/xd/api"
}
};
✅ 优点说明:
功能 | 实现状态 |
---|---|
动态 mock 控制 | ✅ |
自动打开浏览器 | ✅ |
自动找端口 | ✅ |
自动刷新(模拟) | ✅(重开模拟刷新) |
环境文件依赖减少 | ✅ |
🔁 浏览器"自动刷新"说明
open()
方法无法刷新现有窗口,只能新开窗口或标签页。- 若希望刷新旧窗口,需集成浏览器插件或 devServer 配置热更新(推荐用 WebSocket + livereload 插件)。
- 当前脚本是自动重开策略,兼容性好、依赖少。
可以进一步实现:
- 浏览器只打开一次
- 多窗口通信刷新 可以考虑引入
livereload
模块或 WebSocket 自定义服务。