【问题标题】:How to generate 100% Static website with Nuxt.js without API request?如何在没有 API 请求的情况下使用 Nuxt.js 生成 100% 静态网站?
【发布时间】:2019-01-19 18:21:51
【问题描述】:

我正在使用Nuxt.js 进行测试以生成一个静态网站。

是否可以在使用 API 获取数据时生成一个 100% 的静态站点,从而摆脱 API 和请求?

根据我目前的测试,所有文件都已正确生成并托管在Github Pages 上并且可以访问,除了:

  1. 直接通过 URL 栏点击页面时,没有错误(预期行为)
  2. 当通过路由导航到页面时,页面仍在向 API 发送请求(在本地机器之外不存在),即使已经获取了数据并且 .html 文件在生成过程中已使用数据生成。

使用asyncData 从 API 获取组件的数据。

【问题讨论】:

  • 有一个讨论 100%static site possible?#1949 归结为:在静态生成期间发出请求 (nuxt.config.js ... {generate:),将它们保存到 json 文件,然后将其导入文件要么是 vuex 状态,要么是直接进入组件。我想知道是否有现成的解决方案,这样我们就不必编写自己的自行车并错过边缘情况,对于 Angular,有 TransferHttpCacheModule...
  • 在遇到那个线程之前,这正是我所做的,在生成过程中用数据填充 vuex。谢谢你分享这个:)

标签: vue.js nuxt.js


【解决方案1】:

解决方案是使用 vuex(状态管理)并在生成过程中用数据填充状态。

状态将已填充到生成的.html 文件中

有关更多信息,请参阅此thread 正在讨论的地方。

示例

async fetch({ store }) {
  if (_.isEmpty(store.getters['tags/getTags'])) {
    await store.dispatch('tags/fetchTags');
  }
},
  • fetch 方法用于在渲染页面之前填充存储
  • fetchTags 是向 api 发出请求并填充状态的操作
  • 逻辑非常简单:如果tags 状态尚未填充,则通过向 api 发出请求来填充它
  • 运行nuxt generate 时,将为部署填充状态,因此不会向 api 发送请求
  • 状态将被注入到 .html 文件中(下图供参考)


如果有人有更好的解决方案,请分享,我很乐意接受这个答案作为正确答案:)

【讨论】:

  • 您能否分享解决方案中的至少一些示例代码?不是很清楚,你是把状态保存到文件然后读取,还是在路由变化之间神奇地起作用?
  • 添加了关于我是如何完成的示例代码。状态将被填充并保存到 .js 文件中(我们称之为 nuxtjs 魔术)。然后由于生成的静态网站仍然是 Vue 应用程序,一切都按预期工作
【解决方案2】:

如果您在 github 页面中托管您的网站,有一个技巧可以通过直接在地址栏中输入 url 来访问您的路线。您只需要配置您的 webpack 以生成多个具有相同 entry 点的 index 文件,这些文件将根据您的 routes 存储在每个 directory 中。

如果您使用vue-cli 来生成您的项目,这很容易实现。

例如,我有这些路线:

,

我只需要在我的项目的根目录中创建一个vue.config.js

vue.config.js 文件中,我只需要根据我的router 上的内容再注册几个pages。 每个entry 点应该是你的main.js 文件,模板应该是你的index.html

文件名应该是<your-route>/index.html

如果您在filename 中输入子目录,如果这些目录在编译期间不存在,Vue 将自动创建这些目录。所以如果你输入的文件名是photography/index.html,Vue会自动在dist目录下创建一个photography目录。

如果您检查您的dist 目录,您将看到内部带有index.html 的目录。

因此,当您在地址栏中输入您的路线时,它实际上会访问这些目录之一并显示index.html

这就是我对我在github 帐户中托管的主页所做的实际操作。

这是我的 github 页面: https://wisdomsky.github.io/

我有两个页面aboutphotography,如果你在地址栏中输入https://wisdomsky.github.io/photography,它将呈现我的摄影页面,而不是接收 Github 404 页面。

【讨论】:

  • 感谢您的详细回答,您的回答是解决第 1 点,它按预期工作:)。如果您检查您的摄影页面,您仍然会看到它正在发出请求 api 以取消飞溅(这可能是您想要的行为),但对我来说,带有数据的 .html 文件已经生成,所以没有必要尝试再次从 api 获取该数据。
  • 在 Nuxt.JS 中,您可以确定您的页面是来自 client 还是来自 server。您可以使用它来包装您的 API 调用,以便在您的页面通过客户端提供时不会再次调用它们。见nuxtjs.org/examples
  • @Julian Paolo Dayag,好吧,如果不会在客户端上发出请求,那么您最终会在路由上得到空内容,因为它不会被请求。您要么必须在没有 SPA 路由的简单 .html 文件之间进行路由,要么将 nuxt generate 的请求缓存到文件中,这样客户端就无法从该准备好的文件中读取数据而仍然具有 SPA 路由。
  • 我的解决方案是在生成过程中使用 vuex 并填充 store manager
猜你喜欢
  • 2020-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-23
  • 2017-12-04
  • 1970-01-01
  • 2011-07-09
  • 2011-12-06
相关资源
最近更新 更多