【问题标题】:Nuxt: Is there a way to cache server-side across requests in memory?Nuxt:有没有办法在内存中跨请求缓存服务器端?
【发布时间】:2022-09-25 00:22:42
【问题描述】:

是否可以在构建时发出 API 请求,并将其缓存,以便它可以在内存中用于所有未来的 SSR 请求?

我的用例是我有渲染服务器端所需的数据(出于 SEO 原因),但它存储在数据库中。

我不想为每个 SSR 请求发出这个 API 请求。


理想情况下:

  1. 在构建时发出一次 API 请求
  2. 访问或提交此数据到 Vuex
  3. 不必在每个 SSR 上都请求这个
  4. 每 24 小时刷新一次数据

    我查看了一些 SO 答案,似乎都指向基于 Redis 的缓存。有没有办法在内存中做到这一点。

    例如,我使用nuxtServerInit

    async nuxtServerInit({ dispatch, commit }, context: Context) {
       // check if already in memory?
       if (somehowInMemory) {
           commit(cache)
       } else {
           const serverDataJson = await dispatch(\"getServerData\");
           // store this json in memory?
           cache = serverDataJson;
           commit(cache);
       }
    }
    

    标签: nuxt.js


    【解决方案1】:

    Nuxt2 提供静态站点生成。 Nuxt3 现在有这个未来的实验性。

    您需要做的就是将您的 nuxt.config.ts 文件设置为一个变量:

    export default {
      target: 'static' // default is 'server'
    }
    

    生成您想要的所有页面。您需要创建一个页面/组件,在其中发出请求以获取您需要生成的所有链接。使用<NuxtLink> 标记在模板中为它们创建“for”循环。 Nuxt 在构建时会知道它有很多 NuxtLinks 可以生成为静态站点。

    应用程序将在访问客户端浏览器后立即保留 SPA,因此您仍然需要打开数据库。要从生成中排除页面,您有 generate.exclude 属性。

    您可以在Nuxt2 documentation 中找到更多相关信息

    文件将保存在服务器硬盘上,而不是 RAM 内存中。我很确定您只是想避免对数据库进行不必要的 API 调用,所以这个细节应该不是问题。

    Nuxt 团队没有提供任何工具来每 24 小时重复一次这个过程。但我很确定您可以找到任何解决方案,而不是每天自己生成静态站点。

    【讨论】:

    • 谢谢!有很多页面。这怎么知道所有asyncData 为每个页面拉(与我的问题不同的数据)
    • @d-_-b 编辑了如何生成例如数千篇博客文章。您只需创建一个页面,您可以在其中获取这些页面的链接,并使用<NuxtLink> 标签将它们打印在您的模板中。
    【解决方案2】:

    这是我目前使用的:

    构建模块

    import fs from "fs";
    const getCachedApiRequests: Module<Options> = async function () {
       const data = await getData();
       fs.writeFileSync("./data.json", JSON.stringify(data), "utf8");
    }
    
    
    const config: NuxtConfig = {
        buildModules: [
           async () => {
               await getCachedApiRequests();
           }
        ]
    }
    

    nuxtServerInit.ts

    import data from "./data.json";
    
    export async function nuxtServerInit({ dispatch, commit }, context) {
        commit('setData', data);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-01
      • 2019-06-22
      • 1970-01-01
      • 2012-12-29
      • 2021-01-15
      • 2014-05-11
      • 2016-09-23
      • 1970-01-01
      相关资源
      最近更新 更多