nextjs配置端口以及不同的环境变量

一、安装cross-env

1、解决方案一

直接设置公开变量:

复制代码
{
  "dev": "cross-env NEXT_PUBLIC_APP_ENV=development next dev -p 4400",

  "dev:test": "cross-env NEXT_PUBLIC_APP_ENV=test next dev -p 4400",

  "build:prod": "cross-env NEXT_PUBLIC_APP_ENV=production next build"
}

然后:

复制代码
process.env.NEXT_PUBLIC_APP_ENV

就会得到:

复制代码
development
test
production

2、解决方案二(推荐)

脚本:

复制代码
{
  "dev": "cross-env APP_ENV=development next dev",

  "dev:test": "cross-env APP_ENV=test next dev",

  "build:prod": "cross-env APP_ENV=production next build"
}

然后在 next.config.ts

复制代码
import type { NextConfig } from 'next';

const APP_ENV = process.env.APP_ENV ?? 'development';

console.log('APP_ENV=', APP_ENV);

const nextConfig: NextConfig = {
  env: {
    NEXT_PUBLIC_APP_ENV: APP_ENV,
  },
};

export default nextConfig;

重启开发服务器。

此时:

复制代码
pnpm dev:test

控制台:

复制代码
APP_ENV=test

浏览器:

复制代码
process.env.NEXT_PUBLIC_APP_ENV

复制代码
test

3、如果仍然显示 development

检查 .env.development 是否有:

复制代码
NEXT_PUBLIC_APP_ENV=development

因为 next.config.tsenv 配置和 .env 文件可能会同时存在。

最简单的做法是:

删除所有 .env* 文件里的 NEXT_PUBLIC_APP_ENV

只保留:

复制代码
NEXT_PUBLIC_API_URL=...

然后统一由:

复制代码
// next.config.ts
env: {
  NEXT_PUBLIC_APP_ENV: APP_ENV,
}

生成。

这样不会出现:

复制代码
.env.development => development
cross-env => test

两个来源打架的问题。

二、根据 APP_ENV 注入对应的 API 地址

复制代码
const config = {
  development: {
    apiUrl: 'https://dev-api.example.com',
  },
  test: {
    apiUrl: 'https://test-api.example.com',
  },
  production: {
    apiUrl: 'https://api.example.com',
  },
};

const APP_ENV = process.env.APP_ENV ?? 'development';

export default {
  env: {
    NEXT_PUBLIC_APP_ENV: APP_ENV,
    NEXT_PUBLIC_API_URL: config[APP_ENV].apiUrl,
  },
};

这样:

复制代码
process.env.NEXT_PUBLIC_API_URL

才会随着:

复制代码
pnpm dev
pnpm dev:test
pnpm build:prod

自动切换。

对于 Next.js 项目,我通常会把所有环境配置集中到 src/config/env.ts,并通过 APP_ENV → next.config.ts → NEXT_PUBLIC_* 这一层映射来管理,而不是在多个 .env 文件里维护同一套前端配置。这样类型更安全,也更容易排查问题。

三、配置端口以及开发启动打开默认浏览器

先安装:

复制代码
pnpm add -D concurrently wait-on open-cli

然后修改 package.json

复制代码
{
  "scripts": {
    "dev": "concurrently \"next dev -p 4400\" \"wait-on http://localhost:4400 && open-cli http://localhost:4400\"",

    "dev:test": "concurrently \"cross-env APP_ENV=test next dev -p 4400\" \"wait-on http://localhost:4400 && open-cli http://localhost:4400\""
  }
}

启动:

复制代码
pnpm dev

或者:

复制代码
pnpm dev:test

服务启动完成后会自动打开默认浏览器访问:

复制代码
http://localhost:4400

为了避免端口写两遍,推荐抽成变量:

复制代码
{
  "scripts": {
    "dev": "cross-env PORT=4400 concurrently \"next dev -p %PORT%\" \"wait-on http://localhost:%PORT% && open-cli http://localhost:%PORT%\""
  }
}

但这在 Windows 和 macOS/Linux 上变量写法不同,所以实际项目里很多人直接写死:

复制代码
{
  "scripts": {
    "dev": "concurrently \"next dev -p 4400\" \"wait-on http://localhost:4400 && open-cli http://localhost:4400\""
  }
}

最简单也最稳定。

如果你已经有开发、测试、生产环境脚本,我推荐这样整理:

复制代码
{
  "scripts": {
    "dev": "concurrently \"cross-env APP_ENV=development next dev -p 4400\" \"wait-on http://localhost:4400 && open-cli http://localhost:4400\"",

    "dev:test": "concurrently \"cross-env APP_ENV=test next dev -p 4400\" \"wait-on http://localhost:4400 && open-cli http://localhost:4400\"",

    "build:test": "cross-env APP_ENV=test next build",
    "build:prod": "cross-env APP_ENV=production next build",

    "start:test": "cross-env APP_ENV=test next start -p 4400",
    "start:prod": "cross-env APP_ENV=production next start -p 4400"
  }
}

这样执行 pnpm devpnpm dev:test 时都会自动打开浏览器。

相关推荐
前端技术官7 小时前
Web Components 为什么火不起来?
react·web components·ssr·shadow dom·custom elements
钛态8 小时前
Vite 中的 CSS 工程化:从 CSS Modules 到 UnoCSS 的渐进式迁移
前端·vue·react·web
circuitsosk21 小时前
智能体任务拆解与执行:基于ReAct+Plan-and-Execute框架的行业Skill构建实录
前端·javascript·python·react.js·react·llm agent·智能体编排
名字还没想好☜4 天前
Next.js 用 cookies()/headers() 读请求信息:动态渲染触发、缓存失效与在 Server Action 里读写 cookie
前端·javascript·缓存·react·next.js·app router
DsirNg4 天前
先守住数据,再下沉交互:RSC 组件分层的实战决策法
react·next.js·app router·前端架构·组件设计·react server components·server actions
递归尽头是星辰5 天前
大模型 Agent 知识体系:Java 开发者视角下的原理、架构与选型边界
react·智能体·spring ai·java 后端·大模型 agent
名字还没想好☜7 天前
Next.js Route Handler 做 SSE 服务端推送:实时进度条、自动重连与什么时候别用 WebSocket
开发语言·javascript·websocket·react·sse·next.js
Richown9 天前
AI + Web3 融合架构:大模型驱动的智能合约自动生成与审计
区块链·react
名字还没想好☜9 天前
React 19 useOptimistic 实战:点赞评论先更新 UI,失败自动回滚
前端·javascript·react.js·ui·react·useoptimistic
名字还没想好☜11 天前
Next.js 用 Server Components 直连数据库:去掉 API 层的边界,和三条别踩的安全红线
前端·javascript·数据库·安全·react·next.js