You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Next.js中获取启动命令里-p参数的取值?

获取Next.js启动命令中-p参数的端口值

我的Next.js应用通过以下命令启动:

yarn dev

对应的package.json脚本定义如下:

{
   "scripts": {
     "dev": "next dev -p 4000"
   }
}

问题是:通过这种方式启动时process.env.PORT并未被设置,怎么从-p选项里拿到4000这个值?

现有如下函数,需要把其中的????替换成-p参数的值,没设置的话默认用3000:

const getBaseUrl = () => {
  if (typeof window !== 'undefined') return '';  // 浏览器端使用相对路径

  // 如何将????替换为-p参数的值,未设置则默认用3000

  return 'http://localhost:????';  // 开发环境SSR需要使用localhost
}

几种可行的解决方法

方法1:直接解析命令行参数

Node.js的process.argv会包含启动时的所有命令行参数,我们可以从中提取-p后面的端口:

const getBaseUrl = () => {
  if (typeof window !== 'undefined') return '';  // 浏览器端使用相对路径

  // 从命令行参数中提取-p对应的端口
  const argv = process.argv;
  const portIndex = argv.indexOf('-p');
  const port = portIndex !== -1 ? argv[portIndex + 1] : '3000';

  return `http://localhost:${port}`;  // 开发环境SSR需要使用localhost
}

要是你习惯用--port替代-p(Next.js也支持这个写法),把indexOf('-p')改成indexOf('--port')就行。

方法2:读取package.json里的脚本配置

如果端口是固定写在package.json的scripts里,也可以直接读这个文件解析端口:

const fs = require('fs');
const path = require('path');

const getBaseUrl = () => {
  if (typeof window !== 'undefined') return '';  // 浏览器端使用相对路径

  // 读取package.json解析端口
  let port = '3000';
  try {
    const packageJson = JSON.parse(fs.readFileSync(path.join(process.cwd(), 'package.json'), 'utf8'));
    const devScript = packageJson.scripts?.dev;
    if (devScript) {
      const portMatch = devScript.match(/-p\s+(\d+)/);
      if (portMatch) {
        port = portMatch[1];
      }
    }
  } catch (err) {
    // 读取失败就用默认端口
  }

  return `http://localhost:${port}`;  // 开发环境SSR需要使用localhost
}

不过这种方法有个局限:要是启动时手动改了端口(比如yarn dev -p 5000),就拿不到实际用的端口了,所以更推荐第一种方法。

方法3:提前设置环境变量

换个思路,在启动脚本里先设置环境变量,再启动Next.js:
修改package.json的脚本:

{
   "scripts": {
     "dev": "PORT=4000 next dev -p $PORT"
   }
}

这样process.env.PORT就会被设为4000,函数里直接用就行:

const getBaseUrl = () => {
  if (typeof window !== 'undefined') return '';  // 浏览器端使用相对路径

  const port = process.env.PORT || '3000';

  return `http://localhost:${port}`;  // 开发环境SSR需要使用localhost
}

Windows系统下要改成set PORT=4000 && next dev -p %PORT%,想跨平台的话可以装个cross-env包:

yarn add cross-env -D

然后脚本改成:

{
   "scripts": {
     "dev": "cross-env PORT=4000 next dev -p $PORT"
   }
}

内容的提问来源于stack exchange,提问作者Yanick Rochon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 12:05:13