【问题标题】:A single payload.js for all nuxt static generate'd routes when data is the same当数据相同时,所有 nuxt 静态生成路由的单个 payload.js
【发布时间】:2022-11-11 09:07:15
【问题描述】:

我有一个 NuxtJS 站点,只有一个页面 /pages/matrix/index.vue,但有很多指向该页面的动态路由,每个路由使用相同的数据集。在为 Netlify 上的部署生成静态构建时,dist 文件夹当前达到 ~1.2 GB,包括

  • dist/matrix 中的 3125 个 .html 文件(占用约 39% 的空间)
  • payload.js 中的 3125 个文件夹用于路由的子文件夹中的 dist/_nuxt/static/[random]/matrix/ 文件(占用约 61% 的空间)

这 61% 是 220kB payload.js 的 3125 个副本,其中完全相同的一组data: [{}],而只有路线改变:

__NUXT_JSONP__("/matrix/place2/time3,time14,time29", (function(a, b, ...) {
    return {
        data: [{ /* data does not change */ }],
        fetch: {},
        mutations: void 0
    }
}("nor", "does", "this")));

我想知道是否有办法通过某种方式提取数据部分来减少这种冗余?将 ~665 MB 减少到仅 220kB 听起来很诱人。

更多背景:

路由是/matrix/matrix/place1/matrix/place8/time1,time7,time18。生成时,我从无头 CMS 中提取所有数据,并通过 payload option 将其提供给我的页面组件。首先,我使用File System Routing 并像这样导入pages/matrix/index.vue

// pages/matrix/_places/index.vue
<script>
  import Index from '../index'
  export default Index
</script>

感觉不对但有效。我将这种方法归咎于这些有效负载文件的“重复”(坦率地说,没有完全理解静态生成的机制)。我现在用这个nuxt.config.js 设置切换到extendRoutes

router: {
  extendRoutes (routes, resolve) {
    routes.push(
      {
        name: 'matrix-place-times',
        path: '/matrix/:place/:times',
        component: resolve(__dirname, 'pages/matrix/index.vue')
      },
      {
        name: 'matrix-place',
        path: '/matrix/:place',
        component: resolve(__dirname, 'pages/matrix/index.vue')
      }
    )
  }
}

分布在路由子文件夹中的有效负载文件的数量保持不变。
对此有何建议?使用 Nuxt v2.15.7。

【问题讨论】:

  • 这里有什么问题?我猜你的项目已经 brotli'd/gzip'd 所以它不会从中受益更多。否则,如果您有很多页面,1.2GB 看起来还可以。这里有什么烦人的部分?也许去SSR?
  • 我不会称之为问题,因为事情确实有效。确实,每个 220 kB 的 payload.js 在通过网络 gzip 压缩时只有 17 kB。可能对我的项目相当具体(数千条路线使用完全相同的数据集),但生成和上传相同的数据感觉很奇怪。目前我没有 SSR 的计划,坚持使用 Netlify。

标签: javascript vue.js nuxt.js vue-router


【解决方案1】:

我能想到的几件事:

  • 使用 SSR 可以解决其中的一些问题(您告诉过您希望继续使用 Netlify)
  • 使用一些aliased routes 可能是个好主意,特别是如果您在两个不同命名的端点处拥有完全相同的数据
  • this video 还提供了一些关于 ISG 或其他方式的线索,以便对大页面数量有更大的灵活性
  • Nuxt3 能够在Cloudflare workers 上运行,这不是 SSR,也不是完全 ISG,而是一种中间立场,一种不同的方法,但它可以在快速渲染页面时不那么昂贵

【讨论】:

  • 我在矩阵页面上使用router-extras-module&lt;router&gt;{ path: '/matrix', alias: [{ path: '/matrix/:place/:times' }, { path: '/matrix/:place' }]}&lt;/router&gt; 尝试了您建议的别名路由解决方案。它的有效工作方式与我的extendRoutes 解决方案相同,在我的场景中意味着:payload.js 文件的数量与为静态生成时的路由相同。我想,目前,我将使用我的“额外”665MB,并在需要时尽快切换到 SSR(也许是 Vercel)。
  • @hennzen 我认为它也许可以避免生成这些路线,但我想这只是一些更实用的方法。我发现至少在组件中这样做更友好。好的,希望您找到解决问题的好方法!
猜你喜欢
  • 2020-03-17
  • 1970-01-01
  • 1970-01-01
  • 2020-02-21
  • 2020-08-13
  • 2020-08-12
  • 2023-03-06
  • 1970-01-01
  • 2020-08-18
相关资源
最近更新 更多