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

如何在Next.js中将部署时环境变量暴露给客户端(用于页面TITLE前缀)

解决方案

针对你的需求,核心是要在**部署阶段(而非构建阶段)**将服务器环境变量注入客户端,同时统一处理所有页面的title前缀,无需逐个页面配置。以下分两种Next.js路由模式给出具体实现:

Pages Router(Next.js 12及更早)

1. 自定义_document.js注入全局变量

_document.js是Next.js服务器端渲染HTML的入口,可直接读取服务器环境变量,并将其注入客户端全局作用域:

// pages/_document.js
import Document, { Html, Head, Main, NextScript } from 'next/document';

class MyDocument extends Document {
  static async getInitialProps(ctx) {
    const initialProps = await Document.getInitialProps(ctx);
    // 读取服务器环境变量(部署时由Docker容器配置)
    const titlePrefix = process.env.TITLE_PREFIX || '默认前缀';
    return { ...initialProps, titlePrefix };
  }

  render() {
    const { titlePrefix } = this.props;
    return (
      <Html>
        <Head>
          {/* 将变量注入客户端window对象 */}
          <script
            dangerouslySetInnerHTML={{
              __html: `window.titlePrefix = "${titlePrefix}";`,
            }}
          />
        </Head>
        <body>
          <Main />
          <NextScript />
        </body>
      </Html>
    );
  }
}

export default MyDocument;

2. 自定义_app.js统一处理Title前缀

在全局_app.js中复用注入的变量,自动为所有页面添加title前缀:

// pages/_app.js
import Head from 'next/head';

function MyApp({ Component, pageProps }) {
  // 客户端直接读取全局变量,服务器端用默认值兜底
  const titlePrefix = typeof window !== 'undefined' ? window.titlePrefix : '默认前缀';

  return (
    <>
      <Head>
        {/* 用页面自定义title(若有)拼接前缀,否则用默认标题 */}
        <title>{`${titlePrefix} - ${Component.title || '我的应用'}`}</title>
      </Head>
      <Component {...pageProps} />
    </>
  );
}

export default MyApp;

App Router(Next.js 13+)

1. 根layout.js注入全局变量+统一配置Title

App Router中,根layout.js作为服务器组件可直接读取环境变量,同时完成全局变量注入和Title模板配置:

// app/layout.js
import { Metadata } from 'next';

// 全局配置Title模板,自动为所有页面添加前缀
export async function generateMetadata() {
  const titlePrefix = process.env.TITLE_PREFIX || '默认前缀';
  return {
    title: {
      default: `${titlePrefix} - 我的应用`,
      template: `${titlePrefix} - %s`, // %s会被页面自定义title替换
    },
  };
}

export default function RootLayout({ children }) {
  const titlePrefix = process.env.TITLE_PREFIX || '默认前缀';

  return (
    <html lang="zh-CN">
      <head>
        {/* 注入客户端全局变量,供客户端JS使用 */}
        <script
          dangerouslySetInnerHTML={{
            __html: `window.titlePrefix = "${titlePrefix}";`,
          }}
        />
      </head>
      <body>{children}</body>
    </html>
  );
}

客户端使用变量

在任意客户端组件中,直接通过window.titlePrefix访问该变量即可,无需额外配置。

方案优势

  • 无需重新构建:变量值由部署时的服务器环境变量决定,符合Docker多服务器部署的需求
  • 全局生效:仅需配置一次,所有页面自动继承Title前缀和全局变量
  • 性能无损耗:变量注入在服务器端渲染阶段完成,不增加客户端请求开销

内容的提问来源于stack exchange,提问作者Emanuele Paolini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 01:48:24