我在与自己辩论,是我没有正确理解下面13个新概念,还是这真的是一个错误?我不确定,但我很感激有人更清楚地提出了正在发生的事情.

在我的‘app’文件夹中,我有一个新的Next 13(最新版本)的简单的page.tsx.

当我使用Fetch获取该页面中的数据,但没有添加任何头时,构建(YAR/NPM构建)最终显示页面是静态构建的(在构建期间),但当我添加必需的头(Authorization)时,构建显示页面是动态呈现的(根据请求).

这是故意的吗?我不能将标题传递给Fetch API并静态呈现页面吗?

这是我使用的代码:

const getData = async () => {
  const res = await fetch(
    "https://endless-app.onrender.com/api/site-settings",
    {
      headers: {
        Authorization: `Bearer 24653f35c767c9d1ed04f15f143eda0ac12b1cd60d`,
      },
    }
  );
  const data = await res.json();
  return data;
};

export default async function About() {
  const data = await getData();


  return (
    <div>
      <h1>About</h1>
    </div>
  );
}  

that ends up as dynamic rendering: enter image description here

只需从FETCH中删除标头,就会结束静态呈现,正如我所希望的那样:

const getData = async () => {
  const res = await fetch(
    "https://endless-app.onrender.com/api/site-settings"
  );
  const data = await res.json();
  return data;
};

enter image description here

感谢任何人的帮助.

谢谢!

推荐答案

如果您在FETCH选项中设置了cache: "force-cache",则可以修复该行为.

如果您使用的是另一个HTTPS客户端API,则可以设置以下保留导出以强制静态呈现:

export const revalidate = 'force-cache'

因此,如果您使用Fetch API,您的代码将如下所示:


const getData = async () => {
  const res = await fetch(
    "https://endless-app.onrender.com/api/site-settings",
    {
      cache: "force-cache",
      headers: {
        Authorization: `Bearer ********************************`,
      },
    }
  );
  const data = await res.json();
  return data;
};

export default async function About() {
  const data = await getData();


  return (
    <div>
      <h1>About</h1>
    </div>
  );
}  

如果您使用的是另一个http客户端API,如axios,则必须使用保留的导出重新验证,并在它们不提供重新验证选项的情况下将其设置为‘强制缓存’:

import axios from "axios";

const getData = async () => {
  const res = await axios.get("https://jsonplaceholder.typicode.com/posts", {
    headers: {
      Authorization: `Bearer ********************************`,
    },
  });
  return res.data;
};

export default async function About() {
  const data = await getData();

  return (
    <div>
      <h1>About</h1>
    </div>
  );
}

export const revalidate = "force-cache";

请记住,此选项不会覆盖由单个FETCH请求设置的重新验证值.因此,第二个选项不适用于Fetch API,因为他们已经实现了一个带有cache: 'force-cache'属性的重新验证选项.

这也被记录在新的Nextjs 13测试版文档CachingRoute Segment Config Options

Reactjs相关问答推荐

ReactJs;Reaction-Hook-Form:仅当 Select 了特定 Select 列表选项时才显示文本输入

为什么登录错误和密码在创建Reaction-Hook-Form后立即被删除?

如何通过reactjs正确显示记录

在ReactJS的monaco编辑器中添加美人鱼语法

滚动视图样式高度没有任何区别

MERN,将动态列表中的元素插入数组

标签文本删除了 MUI 概述的输入

如何在屏幕上使用相同的可重用

Primereact 的日历组件在每个月 12 日之后使用非唯一键生成

Cypress 组件测试不渲染react 组件(但它的内容)

React Native - 身份验证 - 触发值以更改 Auth 和 UnAuth 堆栈导航器

为什么此代码中的 useState 不更新(文本更新但 id 不更新)?

如何解决在 react.js 中找不到模块错误

为什么我在此代码段中看不到 useEffect for count = 1?

如何使用 React Router 在 React 中正确同步 useEffect 和 useLocation 挂钩?

如果 URL 已随功能组件更改,则取消刷新

为什么 React 会多次调用我的应用程序的某些函数?

Material UI 安装和 React v. 18.2 出现问题

调用函数以获取数据并在数据到达时导航到链接

react 路由:router.ts:11 没有匹配的路由位置/管理