首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >next.config.js中的访问请求对象

next.config.js中的访问请求对象
EN

Stack Overflow用户
提问于 2019-12-11 07:56:11
回答 2查看 1.5K关注 0票数 2

我正在使用一个next.config.js文件处理一个应用程序,该文件根据环境变量设置一组配置变量,以便在应用程序的其他地方使用。我想在这个列表中添加更多基于URL的内容,我正在使用包jekrb/next-absolute-url来读取URL。

我遇到的问题是在他们的示例中使用了const { origin } = absoluteUrl(req),但是我不能让它在next.config.js文件中工作。它只是告诉我没有定义req

下面是我当前的next.config.js文件的一个简化示例。

代码语言:javascript
复制
const withTM = require('next-transpile-modules');
const withCSS = require('@zeit/next-css');
const withFonts = require('next-fonts');
const withImages = require('next-images');
const withOffline = require('next-offline');
const compose = require('crocks/helpers/compose');
const absoluteUrl = require('next-absolute-url');

const { origin } = absoluteUrl(req);

require('dotenv').config();

const injectedConfig = {
  serverRuntimeConfig: {
    KEY: process.env.VALUE,
  },
  publicRuntimeConfig: {
    KEY: process.env.VALUE,
  },
}

module.exports = compose(
  withCSS,
  withFonts,
  withImages,
  withTM,
  withOffline
)(injectedConfig);
EN

回答 2

Stack Overflow用户

发布于 2019-12-11 08:10:14

它不能工作,因为这个"req"对象实际上是一个客户端请求,这意味着它只在运行时上工作。next.config.js在配置时运行,因此在配置时不可用。

您可以使用常规env变量或.env文件并使用多滕诺夫加载它。

票数 0
EN

Stack Overflow用户

发布于 2019-12-11 10:02:35

我认为可以使用自定义文档来实现这一点:

代码语言:javascript
复制
import Document, { Html, Head, Main, NextScript } from "next/document";

class MyDocument extends Document {
  static async getInitialProps(ctx) {
    const { pathname, query } = ctx;

    // having pathname and query, read config from elsewhere

    const initialProps = await Document.getInitialProps(ctx);
    return { ...initialProps, config: { pathname, query } };
  }

  render() {
    return (
      <Html>
        <Head>
          <script
            id="config"
            dangerouslySetInnerHTML={{
              __html: JSON.stringify(this.props.config, null, 1)
            }}
          />
        </Head>
        <body>
          <Main />
          <NextScript />
        </body>
      </Html>
    );
  }
}

export default MyDocument;

Document#getInitalProps中,您可以获得当前的pathname并从某个地方读取相应的配置,然后在<script>内部呈现配置。虽然看上去很讨厌。此外,它还需要一个自定义_app来从<script>标记中读取配置。在_app中,您可以使用配置填充一个React上下文,以便在其他组件中方便地使用它。

UPD

下面是如何使用<script>标记中的内容:创建一个自定义应用程序组件,在componentDidMount中获取该元素并解析该元素,然后将其用作上下文值。

代码语言:javascript
复制
import App from "next/app";
import React from "react";

export const ConfigContext = React.createContext({});

export default class MyApp extends App {
  constructor() {
    super();
    this.state = { config: {} };
  }
  componentDidMount() {
    const config = JSON.parse(document.getElementById("config").textContent);
    this.setState({ config });
  }
  render() {
    const { Component, pageProps } = this.props;
    return (
      <ConfigContext.Provider value={this.state.config}>
        <Component {...pageProps} />
      </ConfigContext.Provider>
    );
  }
}

在页面组件中,您可以从上下文中读取它:

代码语言:javascript
复制
import React, { useContext } from "react";

import { ConfigContext } from "./_app";

export default props => {
  const config = useContext(ConfigContext);
  return (
    <div>
      <pre>{JSON.stringify(config, null, 1)}</pre>
    </div>
  );
};

同样,这个问题似乎是一个解决方案:https://github.com/zeit/next.js/issues/9524

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59281119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档