今天想给我的 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 会:

  1. 找到 package.json 里的 dev 脚本,准备执行它(比如 vite --mode development)。
  2. 然后 npm 开始看你给的其他参数,也就是 --port 2000
  3. npm以为 --port 2000 是给 npm run 命令本身的参数,而不是给 dev 脚本的。
  4. npm run 命令不认识什么 --port,它就把这个不认识的标记给扔了。
  5. 但是 2000 这个值被它当作了一个“非选项参数”(non-option argument),并好心地(错误地)把它追加到了脚本命令的最后面。
  6. 所以,最终执行的命令就成了 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 后面的脚本传自定义参数时,记住先加个 --

又学到了一个没啥用但很关键的小知识。收工。