解决Windows下根目录运行 pnpm dev “无法启动 Vite 前端,只能启动 Express 后端”

这是一个非常常见的问题!你运行 pnpm dev 在根目录,只启动了 Express 后端,Vite 前端没启动 ,说明你的 dev 脚本没有正确并行启动两个服务。

我们来一步步排查并解决这个问题 ✅


🔍 问题分析

你当前的 package.json(根目录)脚本是:

json 复制代码
"scripts": {
  "dev": "pnpm --filter backend start & pnpm --filter frontend dev"
}

这个命令在 Windows 系统上会失败,因为:

❌ 问题 1:& 在 Windows CMD/PowerShell 中不支持并行执行

  • & 是 Unix/Linux 的并行符号
  • Windows 的 CMD 不支持 & 来并行运行两个命令
  • 所以只有第一个命令 pnpm --filter backend start 执行了,第二个被忽略

❌ 问题 2:pnpm --filter frontend dev 要求 frontend 包有 "dev" 脚本

  • 你必须在 frontend/package.json 中定义 "dev": "vite",否则会报错

✅ 解决方案(跨平台兼容)

✅ 方法一:使用 concurrently(推荐 ★★★★★)

concurrently 是一个专门用于并行运行多个命令的工具,支持 Windows、macOS、Linux。


第一步:安装 concurrently(在根目录)

bash 复制代码
pnpm add -D concurrently

第二步:修改根目录 package.jsonscripts

json 复制代码
{
  "scripts": {
    "dev": "concurrently \"pnpm --filter backend start\" \"pnpm --filter frontend dev\"",
    "build": "pnpm --filter frontend build && pnpm --filter backend build",
    "preview": "node backend/server.mjs"
  }
}

🔥 注意:

  • 使用 concurrently 并行执行
  • 命令用 \" 转义(JSON 字符串)
  • 支持所有操作系统 ✅

第三步:确保 frontend/package.jsondev 脚本

打开 frontend/package.json,确保有:

json 复制代码
{
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "preview": "vite preview"
  }
}

如果没有,添加它。


第四步:启动项目

bash 复制代码
pnpm dev

你会看到输出类似:

csharp 复制代码
[backend] 🚀 Express 服务器运行在 http://localhost:3000
[frontend] VITE v4.0.0  ready in 123ms
[frontend] ➜  Local:   http://localhost:5173/

✅ 两个服务都启动了!


✅ 方法二:使用 npm-run-all(备选)

bash 复制代码
pnpm add -D npm-run-all

然后修改脚本:

json 复制代码
{
  "scripts": {
    "dev": "run-p backend:start frontend:dev",
    "backend:start": "pnpm --filter backend start",
    "frontend:dev": "pnpm --filter frontend dev"
  }
}

run-p = 并行执行(parallel)


✅ 方法三:手动分开启动(调试用)

如果你只想快速验证,可以开两个终端

bash 复制代码
# 终端 1:启动后端
cd backend
node server.mjs
bash 复制代码
# 终端 2:启动前端
cd frontend
pnpm dev

🧪 验证是否成功

访问:

  • http://localhost:5173 → 应该看到 Vue 页面
  • http://localhost:3000/api/hello → 应该返回 JSON
  • ✅ 浏览器访问 http://localhost:5173 能调通 /api/hello(通过 Vite 代理)

🛠️ 补充建议

1. 添加 .env 控制环境

frontend/.env 中添加:

env 复制代码
VITE_APP_API_BASE=/api

在代码中使用:

js 复制代码
fetch(import.meta.env.VITE_APP_API_BASE + '/hello')

2. 确保 Vite 代理配置正确

vite.config.js 中:

js 复制代码
proxy: {
  '/api': {
    target: 'http://localhost:3000',
    changeOrigin: true,
  }
}

3. 检查端口冲突

  • 确保 3000(Express)和 5173(Vite)都没被占用
  • 可以用 lsof -i :3000(macOS/Linux)或 netstat -ano | findstr :3000(Windows)查看

✅ 总结:修复步骤

步骤 操作
1 pnpm add -D concurrently
2 修改根 package.json 脚本为 concurrently "..." "..."
3 确保 frontend/package.json"dev": "vite"
4 运行 pnpm dev

🎉 现在你的 pnpm dev 应该能同时启动 Express 后端和 Vite 前端了!

如果还有问题,请贴出:

  • 你运行 pnpm dev 的完整终端输出
  • frontend/package.jsonscripts
  • 你用的操作系统(Windows/macOS/Linux)

我可以帮你精准定位问题!

相关推荐
一枚前端小能手9 小时前
🏷️ HTML 属性参考 - 常用与全局属性的行为、兼容性与最佳实践
前端·javascript·html
付十一9 小时前
更新!Figma MCP + Cursor:大前端时代的UI到代码自动化
android·前端·ai编程
万岳科技程序员小金9 小时前
多端统一的教育系统源码开发详解:Web、小程序与APP的无缝融合
前端·小程序·软件开发·app开发·在线教育系统源码·教育培训app开发·教育培训小程序
软件架构师-叶秋9 小时前
Vue3+tyepescript+ElementPlus+Axios前端技术栈
前端·vue3·elementplus
刘一说9 小时前
Spring Boot 中的定时任务:从基础调度到高可用实践
spring boot·后端·wpf
濮水大叔9 小时前
VonaJS: 直观好用的分布式锁
typescript·node.js·nestjs
小坏讲微服务9 小时前
使用 Spring Cloud Gateway 实现集群
java·spring boot·分布式·后端·spring cloud·中间件·gateway
AAA阿giao9 小时前
HTML/CSS/JS 页面渲染机制:揭秘浏览器如何将平凡代码点化为视觉魔法
前端·css·html
lichenyang4539 小时前
从零到一:编写一个简单的 Umi 插件并发布到 npm
前端·react.js·前端框架
一颗宁檬不酸9 小时前
ajxa实例操作
前端·ajax·api