簡體   English   中英

如何在 Next.js 中不選擇進入 ISR 來防止靜態生成的頁面被緩存

[英]How to prevent statically generated pages from being cached without opting into ISR in Next.js

我正在嘗試自定義Cache-Control標頭,我的 NextJS 服務器在提供在構建時 (SSG) 生成的頁面時響應這些標頭。 理由很簡單:假設每個服務器響應都由 CDN 根據其標頭緩存,並且假設我希望在推出新部署后立即刷新每個 static 頁面,默認緩存策略( s-maxage=31536000, stale-while-revalidate , source ) 不適合我。

revalidate option ,如果設置為10引發構建錯誤),將非常接近預期的行為,但它會產生不幸的副作用,即最多每秒重新生成一次頁面。 如上所述,該頁面嚴格為 static,因此每分鍾服務器渲染 60 次只會浪費資源。

export const getStaticProps: GetStaticProps<
  EntityProps,
  EntityPathParams
> = async (context) => {
  const id = context.params.id;
  const entity = getEntity(id);
  // Activates ISR--waste of resources
  return { props: entity, revalidate: 1 };
};

應該注意的是,在其next.config.js中設置的Cache-Control標頭在生產中非常“有幫助”地被覆蓋,因此這不是一個可行的解決方案。

module.exports = {
  // ...
  async headers() {
    return [
      // Overridden in production
      {
        source: '/entity/:path',
        headers: [
          {
            key: 'Cache-Control',
            value: 'public, max-age=0, must-revalidate',
          },
        ],
      },
    ];
  },
};

此時我看不到任何自定義標題的方法。 我錯了嗎? 你能給我指點一些額外的資源嗎? 你知道任何替代方法嗎?

你不能。 如果您使用的是 SSG,則站點會在構建期間構建,這意味着當用戶看到該站點時根本不涉及服務器。 頁面構建完成后,您將包含所有資產 html 和 js 文件的 out 文件夾發送到一些 static 網站托管,例如 AWS S3。 在那里,您可以自定義發送到瀏覽器的緩存標頭。

摘要:SSG 發生在 nextjs 構建時,它生成 HTML,然后托管服務器必須提供這些文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM