target: 'static' 和 target: 'server' 在 Nuxt 2.14 通用模式下的真正区别是什么?

What's the real difference between target: 'static' and target: 'server' in Nuxt 2.14 universal mode?

在最新版本的 Nuxt (2.14) 中,他们引入了在不更改代码的情况下构建应用程序的优化(以显着缩短构建时间)。

我在 jamstack 中制作网站,使用 nuxt generate 在 netlify 上部署,直到现在,使用 target: 'server'。我尝试了新的 target: 'static' 以利用此新功能,但我的代码无法构建,因为在这种模式下应用程序似乎无法访问 this.$route 以生成动态页数。

所以,我的问题是:它们之间有何不同?我切换target的时候要注意什么?

更新:

根据 latest documentationmode: 'universal'mode: 'spa' 已弃用,取而代之的是 ssr: truessr: false

完全静态仅适用于 target: 'static'ssr: true(已弃用的 mode: 'universal' 的对应物)。 ssr: true 是默认值。 ssr: false 是已弃用的 mode: 'spa' 的对应项,不能与 target: 'static' 一起使用。

原回答:

目标

target 属性 视为 托管环境可能会有所帮助 - 无论您需要服务器还是由 CDN 提供的静态文件对你的场景来说已经足够好了。尽管它被称为 target: 'server',但 并不意味着您的应用程序 server-side 呈现 (请参阅下面的 mode)。

在生产环境中使用 static 目标时,您只需要一个 CDN 来为您的静态文件提供服务。这些静态文件是在构建时准备的,并且是 'final'(直到下一个具有更新内容或代码的构建)。在这种情况下不需要任何服务器(除了可能在您的 CI 管道中的 CND 和构建服务器)。

目标和模式

另一方面,当使用 server 目标时,您的生产应用程序将需要一个服务器环境,在该服务器环境中编写并发送对客户端请求的响应。这意味着有了更新后的内容,无需重新构建您的应用程序。此内容是在请求服务器后组成的。这适用于 - universalspa 模式。使用 universal 模式,您的应用程序会呈现 server-side。相比之下,spa 模式没有 server-side 渲染(只有 client-side 导航),整个应用程序作为单页应用程序运行

服务器与静态目标

对于新手来说,决定是使用 server-side 渲染还是静态可能有点棘手。一个可能有助于您做出决定的好问题是,您是否需要为不同 user/circumstances 的每个 page/document/content 项目提供不同的内容。如果是这样,您可能应该选择目标 server,否则 static.

每种方法都有其优缺点,例如服务器要求、安全性、速度、CI pipeline/build 流程、SEO、价格等。正确的选择取决于您的用例.

正如您正确提到的那样,从版本 2.13 开始,有两个可用的部署目标。它们是 serverstaticSource

旧方法存在一些问题和困难,主要是客户端通过 asyncDatafetch 功能请求您的 API 导航。结果,生成的网站无论如何都不是纯静态的。 here.

描述了旧方法的所有缺点

使用新的 static 目标(同时强制 universal 模式)方法,nuxt generate 命令将 pre-render 你所有的 HTML页面和模拟异步数据请求。旧的 asyncDatafetch 这次没有向客户请求您的 API。这已经在构建期间执行。 Source

关于路线。提到的路由可能不会被 nuxt 的爬虫自动检测到,你应该使用 generate.routes 属性.

手动生成它们
import axios from 'axios'

export default {
  generate: {
    routes() {
      return axios.get('https://my-api/users').then(res => {
        return res.data.map(user => {
          return '/users/' + user.id
        })
      })
    }
  }
}