问题说明
通过npm init vite@latest
命令初始化一个vue项目,然后依次执行npm install
以及npm run dev
,安装依赖命令正常运行,而启动命令报错:
$ npm run dev
> dev
> vite
events.js:352
throw er; // Unhandled 'error' event
^
Error: spawn I:\vite-project\first-project\node_modules\esbuild\esbuild.exe ENOENT
at Process.ChildProcess._handle.onexit (internal/child_process.js:269:19)
at onErrorNT (internal/child_process.js:467:16)
at processTicksAndRejections (internal/process/task_queues.js:82:21)
Emitted 'error' event on ChildProcess instance at:
at Process.ChildProcess._handle.onexit (internal/child_process.js:275:12)
at onErrorNT (internal/child_process.js:467:16)
at processTicksAndRejections (internal/process/task_queues.js:82:21) {
errno: -4058,
code: 'ENOENT',
syscall: 'spawn I:\\vite-project\\first-project\\node_modules\\esbuild\\esbuild.exe',
path: 'I:\\vite-project\\first-project\\node_modules\\esbuild\\esbuild.exe',
spawnargs: [ '--service=0.12.15', '--ping' ]
}
版本信息
$ node -v
v14.17.3
$ npm -v
7.11.1
原因分析
看错误输出定位在esbuild
,Vite通过esbuild
进行预构建,因此需要安装esbuild
。可能是安装失败了,故删除node_modules
后重新进行npm install
,仍然报错。第一时间想到的是node的版本问题,因为有在写electron&vue
,因此有用多版本的node,切换了两个版本后仍然安装失败。于是去搜索相关的issues。
在Vite的issues中看到该反馈"npm run dev" failed because of esbuild. #2452,尤大的回答是:"Your esbuild install failed. This is not a vite issue, most likely an npm / registry / system permission problem."。
说明不是Vite本身的问题,可能是npm/registry/system导致的问题,干脆去esbuild
的issues中看看有没有相同的情况,于是找到了Sometimes can't install esbuild with 3rd-party registry #921。
经过尝试后确定原因是因为使用了第三方的registry(taobao),但是看评论说是npm版本7.0以上导致的问题...
解决方案
方式一:不使用第三方registry
- 将
npm registry
设置为npm默认的镜像仓库。
# nrm use npm
npm config set regisry https://registry.npmjs.org/
- 清理npm缓存(非必要步骤)
npm cache clean -f
- 重新用Vite进行项目的初始化,也可以直接重新安装依赖
如果选择重新初始化的话,就正常使用npm init vite@latest
就行了。
而重新安装依赖的话,需要删除node_modules
和package-lock.json
后,重新进行npm install
。
经过测试,cnpm
和taobao
都会报错,而npm
和yarn registry
可以正常运行,原因未知。
方式二:手动执行安装命令
在用第三方registry进行npm install
之后,执行
node node_modules/esbuild/install.js
手动安装一下esbuild
。