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 documentation,mode: 'universal'
和 mode: 'spa'
已弃用,取而代之的是 ssr: true
和 ssr: 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
目标时,您的生产应用程序将需要一个服务器环境,在该服务器环境中编写并发送对客户端请求的响应。这意味着有了更新后的内容,无需重新构建您的应用程序。此内容是在请求服务器后组成的。这适用于 - universal
和 spa
模式。使用 universal
模式,您的应用程序会呈现 server-side。相比之下,spa
模式没有 server-side 渲染(只有 client-side 导航),整个应用程序作为单页应用程序运行
服务器与静态目标
对于新手来说,决定是使用 server-side 渲染还是静态可能有点棘手。一个可能有助于您做出决定的好问题是,您是否需要为不同 user/circumstances 的每个 page/document/content 项目提供不同的内容。如果是这样,您可能应该选择目标 server
,否则 static
.
每种方法都有其优缺点,例如服务器要求、安全性、速度、CI pipeline/build 流程、SEO、价格等。正确的选择取决于您的用例.
正如您正确提到的那样,从版本 2.13
开始,有两个可用的部署目标。它们是 server
和 static
。 Source
旧方法存在一些问题和困难,主要是客户端通过 asyncData
和 fetch
功能请求您的 API 导航。结果,生成的网站无论如何都不是纯静态的。 here.
描述了旧方法的所有缺点
使用新的 static
目标(同时强制 universal
模式)方法,nuxt generate
命令将 pre-render 你所有的 HTML页面和模拟异步数据请求。旧的 asyncData
和 fetch
这次没有向客户请求您的 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
})
})
}
}
}
在最新版本的 Nuxt (2.14) 中,他们引入了在不更改代码的情况下构建应用程序的优化(以显着缩短构建时间)。
我在 jamstack 中制作网站,使用 nuxt generate
在 netlify 上部署,直到现在,使用 target: 'server'
。我尝试了新的 target: 'static'
以利用此新功能,但我的代码无法构建,因为在这种模式下应用程序似乎无法访问 this.$route
以生成动态页数。
所以,我的问题是:它们之间有何不同?我切换target
的时候要注意什么?
更新:
根据 latest documentation,mode: 'universal'
和 mode: 'spa'
已弃用,取而代之的是 ssr: true
和 ssr: 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
目标时,您的生产应用程序将需要一个服务器环境,在该服务器环境中编写并发送对客户端请求的响应。这意味着有了更新后的内容,无需重新构建您的应用程序。此内容是在请求服务器后组成的。这适用于 - universal
和 spa
模式。使用 universal
模式,您的应用程序会呈现 server-side。相比之下,spa
模式没有 server-side 渲染(只有 client-side 导航),整个应用程序作为单页应用程序运行
服务器与静态目标
对于新手来说,决定是使用 server-side 渲染还是静态可能有点棘手。一个可能有助于您做出决定的好问题是,您是否需要为不同 user/circumstances 的每个 page/document/content 项目提供不同的内容。如果是这样,您可能应该选择目标 server
,否则 static
.
每种方法都有其优缺点,例如服务器要求、安全性、速度、CI pipeline/build 流程、SEO、价格等。正确的选择取决于您的用例.
正如您正确提到的那样,从版本 2.13
开始,有两个可用的部署目标。它们是 server
和 static
。 Source
旧方法存在一些问题和困难,主要是客户端通过 asyncData
和 fetch
功能请求您的 API 导航。结果,生成的网站无论如何都不是纯静态的。 here.
使用新的 static
目标(同时强制 universal
模式)方法,nuxt generate
命令将 pre-render 你所有的 HTML页面和模拟异步数据请求。旧的 asyncData
和 fetch
这次没有向客户请求您的 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
})
})
}
}
}