【问题标题】:How to set base URL based on environment variable in Next.js?如何在 Next.js 中根据环境变量设置基本 URL?
【发布时间】:2021-07-18 07:23:59
【问题描述】:

我在 DigitalOcean 上部署了一个 Strapi 后端和 Next.js 前端应用。 在 DigitalOcean 上为前端设置了一个环境变量:API_URL = ${APP_URL}/api

我获取这个变量来生成基本 url:

// constants.js
export const BASE_URL =
  process.env.NODE_ENV === "production"
    ? process.env.API_URL
    : "http://localhost:1337";

它似乎工作正常,应用程序从 localhost 和部署中的后端获取内容。当我尝试加载图像时,问题就出现了,该路径应该是基本 url 和获取的相对路径的连接。我为此创建了一个 utilitz 函数:

// utilities.js
import { BASE_URL } from "./constants";
export const getImageURL = (relPath) => `${BASE_URL}${relPath}`;

当我将此函数用于 html img 标签时,它会在 dev 和 prod 环境中加载:

<img src={getImageURL(homePage.Hero[0].Image.url)} />

但是当我尝试为同一组件中的 div 设置背景时,基本 url 未定义,并且图像未出现在部署的站点中(在 localhost 上工作正常)。

我不知道为什么 url 生成对于代码的某些部分是可以的,而对于其他部分则不行。

部署的构建命令是:yarn build && next export -o _static

这是完整的组件:

import styles from "../styles/Home.module.css";
import { getImageURL } from "../lib/utilities";
import { useEffect } from "react";
import { BASE_URL } from "../lib/constants";

export default function Home({ homePage }) {
  console.log(BASE_URL); // undefined

  useEffect(() => {
    if (window) {
      console.log(BASE_URL); // undefined
      document.getElementById("container").style.backgroundImage = `url('${getImageURL(homePage.Hero[0].Image.url)}')`; // url is undefined/realtivepath
    }
  });


  return (
    <div id="container">
      <img src={getImageURL(homePage.Hero[0].Image.url)} />
    </div>
  );
}

export const getStaticProps = async () => {
  const res = await fetch(`${BASE_URL}/home-page`); // OK for dev and deploy
  const homePage = await res.json();
  return {
    props: {
      homePage,
    },
  };
};

【问题讨论】:

  • 你能分享你的next.config.js文件吗?

标签: javascript node.js environment-variables next.js digital-ocean


【解决方案1】:

默认情况下,出于安全考虑,Next.js 不会将所有 process.env.X 变量暴露给浏览器

为了向浏览器公开环境变量,它的名称中必须有 NEXT_PUBLIC_ 前缀。

在您的情况下,将 API_URL 重命名为 NEXT_PUBLIC_API_URL,然后使用它。

欲了解更多信息:https://nextjs.org/docs/basic-features/environment-variables

【讨论】:

  • 如果你有多个服务,如何选择正确的环境?似乎一切都在“生产”下加载
  • 我不确定“多个服务”,next.js 是一个进程,它加载.env 文件
  • 例如,staging、production 和 dev 可能是都需要生产构建的云服务。
  • 您需要创建 3 个单独的 env 文件,每个环境一个,并根据正在运行的 env(staging、prod、dev)提供正确的文件
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-25
  • 2021-09-23
  • 2016-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多