一、 问题
起因:在搭建前端部分脚手架,通过npm快速构建项目
bash
npm create vite@latest frontend -- --template vue-ts
出错:
bash
PS E:\Projects\Expandable_Multi-channel_Detection_Platform> npm create vite@latest frontend -- --template vue-ts
Need to install the following packages:
create-vite@9.0.4
Ok to proceed? (y) y
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE package: 'create-vite@9.0.4',
npm WARN EBADENGINE required: { node: '^20.19.0 || >=22.12.0' },
npm WARN EBADENGINE current: { node: 'v20.13.1', npm: '10.5.2' }
npm WARN EBADENGINE }
│
◇ Install with npm and start now?
│ Yes
│
◇ Scaffolding project in E:\Projects\Expandable_Multi-channel_Detection_Platform\frontend...
│
◇ Installing dependencies with npm...
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE package: '@vitejs/plugin-vue@6.0.6',
npm WARN EBADENGINE required: { node: '^20.19.0 || >=22.12.0' },
npm WARN EBADENGINE current: { node: 'v20.13.1', npm: '10.5.2' }
npm WARN EBADENGINE }
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE package: 'vite@8.0.8',
npm WARN EBADENGINE required: { node: '^20.19.0 || >=22.12.0' },
npm WARN EBADENGINE current: { node: 'v20.13.1', npm: '10.5.2' }
npm WARN EBADENGINE }
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE package: 'rolldown@1.0.0-rc.15',
npm WARN EBADENGINE required: { node: '^20.19.0 || >=22.12.0' },
npm WARN EBADENGINE current: { node: 'v20.13.1', npm: '10.5.2' }
npm WARN EBADENGINE }
added 48 packages, and audited 49 packages in 14s
9 packages are looking for funding
run `npm fund` for details
found 0 vulnerabilities
│
◇ Starting dev server...
> frontend@0.0.0 dev
> vite
You are using Node.js 20.13.1. Vite requires Node.js version 20.19+ or 22.12+. Please upgrade your Node.js version.
file:///E:/Projects/Expandable_Multi-channel_Detection_Platform/frontend/node_modules/rolldown/dist/shared/binding-s-V_wTpj.mjs:507
if (loadErrors.length > 0) throw new Error("Cannot find native binding. npm has a bug related to optional dependencies (https://github.com/npm/cli/issues/4828). Please try `npm i` again after removing both package-lock.json and node_modules directory.", { cause: loadErrors.reduce((err, cur) => {
^
Error: Cannot find native binding. npm has a bug related to optional dependencies (https://github.com/npm/cli/issues/4828). Please try `npm i` again after removing both package-lock.json and node_modules directory.
at file:///E:/Projects/Expandable_Multi-channel_Detection_Platform/frontend/node_modules/rolldown/dist/shared/binding-s-V_wTpj.mjs:507:36
at file:///E:/Projects/Expandable_Multi-channel_Detection_Platform/frontend/node_modules/rolldown/dist/shared/binding-s-V_wTpj.mjs:9:48
... 2 lines matching cause stack trace ...
at async ModuleLoader.import (node:internal/modules/esm/loader:316:24)
at async CAC.<anonymous> (file:///E:/Projects/Expandable_Multi-channel_Detection_Platform/frontend/node_modules/vite/dist/node/cli.js:707:27) {
[cause]: Error: Cannot find module '@rolldown/binding-win32-x64-msvc'
Require stack:
- E:\Projects\Expandable_Multi-channel_Detection_Platform\frontend\node_modules\rolldown\dist\shared\binding-s-V_wTpj.mjs
at Module._resolveFilename (node:internal/modules/cjs/loader:1145:15)
... 2 lines matching cause stack trace ...
at require (node:internal/modules/helpers:179:18)
at requireNative (file:///E:/Projects/Expandable_Multi-channel_Detection_Platform/frontend/node_modules/rolldown/dist/shared/binding-s-V_wTpj.mjs:147:21)
at file:///E:/Projects/Expandable_Multi-channel_Detection_Platform/frontend/node_modules/rolldown/dist/shared/binding-s-V_wTpj.mjs:475:18
at file:///E:/Projects/Expandable_Multi-channel_Detection_Platform/frontend/node_modules/rolldown/dist/shared/binding-s-V_wTpj.mjs:9:48
at file:///E:/Projects/Expandable_Multi-channel_Detection_Platform/frontend/node_modules/rolldown/dist/shared/parse-BywQARUG.mjs:3:46
at ModuleJob.run (node:internal/modules/esm/module_job:222:25)
at async ModuleLoader.import (node:internal/modules/esm/loader:316:24) {
code: 'MODULE_NOT_FOUND',
requireStack: [
'E:\\Projects\\Expandable_Multi-channel_Detection_Platform\\frontend\\node_modules\\rolldown\\dist\\shared\\binding-s-V_wTpj.mjs'
],
cause: Error: Cannot find module './rolldown-binding.win32-x64-msvc.node'
Require stack:
- E:\Projects\Expandable_Multi-channel_Detection_Platform\frontend\node_modules\rolldown\dist\shared\binding-s-V_wTpj.mjs
at Module._resolveFilename (node:internal/modules/cjs/loader:1145:15)
at Module._load (node:internal/modules/cjs/loader:986:27)
at Module.require (node:internal/modules/cjs/loader:1233:19)
at require (node:internal/modules/helpers:179:18)
at requireNative (file:///E:/Projects/Expandable_Multi-channel_Detection_Platform/frontend/node_modules/rolldown/dist/shared/binding-s-V_wTpj.mjs:142:12)
at file:///E:/Projects/Expandable_Multi-channel_Detection_Platform/frontend/node_modules/rolldown/dist/shared/binding-s-V_wTpj.mjs:475:18
at file:///E:/Projects/Expandable_Multi-channel_Detection_Platform/frontend/node_modules/rolldown/dist/shared/binding-s-V_wTpj.mjs:9:48
at file:///E:/Projects/Expandable_Multi-channel_Detection_Platform/frontend/node_modules/rolldown/dist/shared/parse-BywQARUG.mjs:3:46
at ModuleJob.run (node:internal/modules/esm/module_job:222:25)
at async ModuleLoader.import (node:internal/modules/esm/loader:316:24) {
code: 'MODULE_NOT_FOUND',
requireStack: [
'E:\\Projects\\Expandable_Multi-channel_Detection_Platform\\frontend\\node_modules\\rolldown\\dist\\shared\\binding-s-V_wTpj.mjs'
]
}
}
}
Node.js v20.13.1
npm ERR! code 1
npm ERR! path E:\Projects\Expandable_Multi-channel_Detection_Platform
npm ERR! command failed
npm ERR! command C:\WINDOWS\system32\cmd.exe /d /s /c create-vite frontend --template vue-ts
npm ERR! A complete log of this run can be found in: C:\Users\admin\AppData\Local\npm-cache\_logs\2026-04-15T03_07_26_963Z-debug-0.log
发现核心问题是
You are using Node.js 20.13.1. Vite requires Node.js version 20.19+ or 22.12+.
即本地node版本较低(20.13.1),与Vite 8+ 所需的版本( 20.19+ or 22.12+.)不符,导致rolldown下的原生模块win32-x64-msvc编译器未能正确安装,进而导致了后续的Vite启动失败。
2. 原因分析
查了一下
bash
npm create vite@latest frontend -- --template vue-ts
的具体执行流程如下:
阶段1. 下载并运行create-vite
bash
Need to install the following packages: create-vite@9.0.4
Ok to proceed? (y) y
npm create会临时下载create-vite包并执行- 这一步并不刚需Node的版本适配,npm仅要求Node能用就行
- 即使出现
EBADENGINE警告也并不会中断
阶段2. Scaffolding(生成项目模板)
text
Scaffolding project in E:\Projects\Expandable_Multi-channel_Detection_Platform\frontend...
- 即在该位置生成项目模板,具体来说,
create-vite根据--template vue-ts参数,从官方地址下载模板文件到该目录; - 这一步也不涉及Node版本,仅有文件的I/O操作,所以项目模板依旧会被成功构建
阶段3. 自动安装依赖
text
Installing dependencies with npm...
-
create-vite会自动在frontend/目录下执行npm Install -
这里开始出现版本兼容性问题,根据错误信息发现:
vite@8.08和@vitejs/plugin-vue@6.06在package-lock,json以及rolldown中分别声明了:



显然,我本地的
20.13.1版本的Node不满足需求, -
npm的行为:
-
发出
EBADENGINE警告,但仍然继续安装 -
对于某些原生模块(如
rolldown,它是 Vite 8 使用的 Rust 打包器),npm 会根据 Node 版本尝试下载对应的预编译二进制文件。 -
因为 Node 版本不匹配,npm 可能找遍了仓库都没找到适配
Node v20.13.1的二进制文件,因此跳过下载正确的原生绑定(@rolldown/binding-win32-x64-msvc),导致安装不完整,最终输出textadded 48 packages, and audited 49 packages in 14s
-
-
表面上看安装成功,但rolldown的原生模块缺失
这里深入了解了一下为何npm 发出了 EBADENGINE警告,但仍继续安装
- npm 的逻辑:engines 字段在 npm 看来通常是"建议性"的。除非你配置了 engine-strict=true,否则 npm 会忽略版本不匹配,继续把 JavaScript 代码(胶水代码)安装好。
- 这本质上是一种开发者体验优先的哲学,是基于生态做出的工程权衡,如不这样,可能导致依赖树爆炸等问题。
bash
# 查看
npm config get engine-strict # 默认为false
## 进行控制
# 临时生效(单次安装)
npm install --engine-strict
# 项目级配置(推荐)
echo "engine-strict=true" >> .npmrc
# 全局配置(不推荐,易污染其他项目)
npm config set engine-strict true
# 验证是否生效
npm config get engine-strict
阶段4. 自动启动开发服务器
text
◇ Starting dev server...
> frontend@0.0.0 dev
> vite
-
create-vite最后会自动运行npm run dev,即执行vite命令。 -
Vite 8 启动时需要加载
rolldown原生绑定,但由于绑定缺失,Vite抛出错误textError: Cannot find module '@rolldown/binding-win32-x64-msvc'
二、解决
显然,卸载当前的Node 20.13.1,并安装Node 20.19+ 或 22.12+ 即可,但如果和本地其他项目所需的Node版本冲突呢?找到了另外两种方案:
1. 使用docker将其容器化
在当前的frontend/下新建一个Dockerfile文件
text
# frontend/Dockerfile
FROM node:22-slim
WORKDIR /app
# 先拷贝依赖清单,利用 Docker 缓存层
COPY package.json package-lock.json* ./
RUN npm install
# 源码通过 volume 挂载,不在镜像内
EXPOSE 5173
CMD ["npm", "run", "dev", "--", "--host", "0.0.0.0"]
在于先前的docker-compose.yml文件中增加前端 frontend 部分:
yaml
services:
oracle-db:
image: gvenzl/oracle-xe:21-slim
container_name: E-MCDP_oracle
ports:
- "1522:1521"
environment:
ORACLE_PASSWORD: ${ORACLE_PASSWORD}
APP_USER: ${APP_USER}
APP_USER_PASSWORD: ${APP_USER_PASSWORD}
volumes:
- oracle-data:/opt/oracle/oradata # 数据持久化
healthcheck:
test: ["CMD", "healthcheck.sh"]
interval: 10s # 每 10 秒检查一次
timeout: 5s # 5s 内完成
retries: 10 # 连续10次失败判定为unhealthy
redis:
image: redis:7-alpine
container_name: E-MCDP_redis
ports:
- "6379:6379"
volumes:
- redis-data:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 3s
retries: 5
frontend:
build:
context: ./frontend
dockerfile: Dockerfile
container_name: E-MCDP-frontend
ports:
- "5173:5173"
volumes:
# 源码挂载:宿主机编辑 → 容器内实时生效
- ./frontend:/app # 全部挂载
- frontend-modules:/app/node_modules
depends_on:
- oracle-db
- redis
# docker-compose.yml 中 frontend 服务额外添加
# extra_hosts:
# - "host.docker.internal:host-gateway"
volumes:
oracle-data:
redis-data:
frontend-modules: # 匿名卷保护容器内 node_modules
而后运行
bash
docker-compose up --build
即可基于先前拉取的基于vue+ts的模板项目中的 package.json package-lock.json等文件在容器中重新构建了项目,并将当前整个前端项目文件夹(node_modules 被单独挂载为一个 Docker volume以避免干扰)挂载到容器中,从而实现了源码热更新和环境依赖的一致性。
另外需要注意的是后端在容器外运行时,localhost:5000 指向的是容器自身,不是宿主机。需要改:
typescript
// frontend/src/utils/request.ts
import axios from 'axios'
// 开发环境下,后端跑在宿主机,容器通过 host.docker.internal 访问
const request = axios.create({
baseURL: 'http://host.docker.internal:5000',
timeout: 10000,
headers: {
'Content-Type': 'application/json',
},
})
2. nvm-windows 管理不同版本的Node
- 下载: https://github.com/coreybutler/nvm-windows/releases
- 安装: 运行
nvm-setup.exe - 使用nvm管理版本:
bash
# 查看可用版本
nvm list available
# 安装Node 22
nvm install 22.14.0
# 切换到Node 22
nvm use 22.14.0
# 设置为默认
nvm alias default 22.14.0
# 验证
node --version