Node v16.15.1使用parallelshell运行npm脚本报ERR_INVALID_ARG_TYPE错误
报错原因
parallelshell@3.0.2 已经停止维护多年,和Node 16+版本存在API兼容问题。该版本的parallelshell内部调用子进程spawn方法时,传入的配置项里cwd直接赋值为process.cwd(函数引用),但Node 14及以上版本要求spawn配置的cwd属性必须是字符串、Buffer或URL类型的实际路径值,不接受函数类型传入,因此抛出ERR_INVALID_ARG_TYPE类型错误。
修复方案
- 方案一:替换为维护状态良好的兼容工具(推荐)
目前社区主流的npm脚本并行执行工具是npm-run-all,对高版本Node兼容性完善,操作步骤如下:- 卸载原有不兼容的parallelshell依赖,执行命令:
npm uninstall parallelshell - 安装npm-run-all到开发依赖:
npm install npm-run-all --save-dev - 修改package.json中scripts字段下的
watch:all配置,替换原parallelshell命令:"watch:all": "npm-run-all --parallel watch:scss lite" - 重新执行
npm start即可正常并行启动scss监听和本地静态服务。
- 卸载原有不兼容的parallelshell依赖,执行命令:
- 方案二:本地临时修复依赖兼容问题
如果不想更换依赖,可以手动修改本地依赖文件做兼容:
打开项目路径下node_modules/parallelshell/index.js文件,定位到104行左右的spawn调用代码,将传入配置里的cwd: process.cwd修改为cwd: process.cwd()(补充括号执行函数,返回实际路径字符串),保存文件后重新执行npm start即可正常运行。注意该修改会在每次重新执行npm install安装依赖后失效,需要重复修改。 - 方案三:降级Node版本(不推荐)
将本地Node版本降级到v12及更早版本,旧版本Node未对spawn的cwd参数做严格类型校验,可以正常运行旧版parallelshell,但旧版本Node存在已知安全漏洞,且无法兼容部分新的前端生态工具,非特殊情况不建议使用。
内容的提问来源于stack exchange,提问作者RJ BergerIII
相关产品推荐
相关产品推荐

