今天想给我的 Vite 项目换个端口启动,很自然地就敲下了这个:
npm run dev --port 2000
回车,满心欢喜。
结果,Vite 还是“倔强”地跑在了它默认的 5173 端口上。
VITE v5.4.19 ready in 170 ms
➜ Local: http://localhost:5173/
...
回头看了下 npm 的输出,发现它实际执行的命令是 vite --mode development 2000。
等一下... 我的 --port 呢?被 npm 吃了吗?
罪魁祸首:npm 的参数解析
是,也不是。
当你运行 npm run dev --port 2000 时,npm 会:
- 找到
package.json里的dev脚本,准备执行它(比如vite --mode development)。 - 然后
npm开始看你给的其他参数,也就是--port 2000。 npm会以为--port 2000是给npm run命令本身的参数,而不是给dev脚本的。npm run命令不认识什么--port,它就把这个不认识的标记给扔了。- 但是
2000这个值被它当作了一个“非选项参数”(non-option argument),并好心地(错误地)把它追加到了脚本命令的最后面。 - 所以,最终执行的命令就成了
vite --mode development 2000。
vite 也不认识这个孤零零的 2000 是啥意思,于是就忽略它,用了默认端口 5173。
解决方案:用 -- 告诉 npm “别碰我的参数”
正确的姿势是这样的:
npm run dev -- --port 2000
注意看,在 dev 和 --port 之间,多了一个 --(双破折号)。
这个 -- 是一个很古老、很标准的约定,在很多命令行工具里都通用。
它的意思很简单,就是告诉 npm:
“OK,
npm run dev的参数(npm自己的参数)到此结束了。从这个--往后,所有的东西,你一个字都别动,原封不动地、完整地、直接地,丢给你在package.json里找到的那个脚本。”
这样一来,npm 就会忠实地执行:
vite --mode development --port 2000
Vite 成功收到了 --port 2000,一切就都对了。
一句话总结
下次再想给 npm run 后面的脚本传自定义参数时,记住先加个 --。
又学到了一个没啥用但很关键的小知识。收工。