import{_ as l,o as s,c as e,a as n}from"./app.cd69620c.js";const h=JSON.parse('{"title":"服务端渲染(SSR)","description":"","frontmatter":{},"headers":[{"level":2,"title":"邂逅SPA和SSR","slug":"邂逅spa和ssr","link":"#邂逅spa和ssr","children":[{"level":3,"title":"SPA的优点与缺点","slug":"spa的优点与缺点","link":"#spa的优点与缺点","children":[]},{"level":3,"title":"SEO优化","slug":"seo优化","link":"#seo优化","children":[]}]},{"level":2,"title":"服务端渲染 SSR","slug":"服务端渲染-ssr-1","link":"#服务端渲染-ssr-1","children":[{"level":3,"title":"SSR的优点","slug":"ssr的优点","link":"#ssr的优点","children":[]},{"level":3,"title":"SSR的缺点","slug":"ssr的缺点","link":"#ssr的缺点","children":[]},{"level":3,"title":"SSR 解决方案","slug":"ssr-解决方案","link":"#ssr-解决方案","children":[]}]},{"level":2,"title":"静态网站生成 SSG","slug":"静态网站生成-ssg","link":"#静态网站生成-ssg","children":[{"level":3,"title":"SSR与SSG的优势","slug":"ssr与ssg的优势","link":"#ssr与ssg的优势","children":[]},{"level":3,"title":"跨请求状态污染","slug":"跨请求状态污染","link":"#跨请求状态污染","children":[]}]},{"level":2,"title":"Nuxt3 系统学习","slug":"nuxt3-系统学习","link":"#nuxt3-系统学习","children":[{"level":3,"title":"认识Nuxt3","slug":"认识nuxt3","link":"#认识nuxt3","children":[]},{"level":3,"title":"搭建Nuxt3环境","slug":"搭建nuxt3环境","link":"#搭建nuxt3环境","children":[]}]}],"relativePath":"note/SSR.md","lastUpdated":1676392774000}'),a={name:"note/SSR.md"},i=n(`
我们使用Vue开发的网页一般都是单页面应用程序(SPA Single Page Application)
.html
文件与之相对的,就是服务端渲染(SSR Server Side Rendering)
于是,同构SSR应运而生,我们称之为BFF(Backend for Frontend 服务于前端的后端)
浏览器请求.html
文件 => 服务端运行Vue / React代码并生成.html
=> 发送.html
文件给浏览器 => 浏览器显示网页内容
=> 浏览器加载JS文件 => 绑定DOM事件 客户端渲染接管界面 => 再次跳转路由就是客户端渲染 无需请求后台
.html
文件,页面切换不需要重新加载,所以比传统Web应用程序更快h1
,一个页面只应当由一个 h1
标签,副标题用 h2 - h6
h
标签,多次使用不会增加SEOp
标签 列表用 ul
标签,且 li
只放在 ul
中<a href="https://www.example.com" />
<a href="/relative/path/file" />
<b>
和<strong>
加粗文本的标签,爬虫会关注到该内容img
标签添加alt
属性,图片加载失败时供爬虫读取alt
内容服务端渲染 SSR (Server Side Rendering)
app = createSSRApp(App)
renderToString(app) => App String Html
client_bundle.js
客户端通过脚本激活应用程序 让应用程序可以进行交互,这个过程叫水合( Hydration)静态网页生成 SSG(Static Site Generate)
.html
页面的内容.html
文件给客户端,相当于一个静态资源html
文件,有利于SEO在SPA中,整个生命周期只有一个App对象实例/一个Router对象实例/一个Store对象实例
然而在SSR的环境下,App模块通常只在
服务器启动时
初始化一次,同一个应用模块会在多个服务器请求之间被复用
为了避免这种跨请求状态污染,SSR的解决方案是:
h3
实现部署可移植性(h3
是一个极小的高性能http框架) 使用命令行工具 Nuxi
初始化Nuxt:
npx nuxi init project-name
pnpm dlx nuxi init project-name
npm install -g nuxi && nuxi init project-name
解读脚手架创建的初始化项目的package.json
中的脚本:
{
"private": true,
"scripts": {
"build": "nuxt build",
"dev": "nuxt dev",
"generate": "nuxt generate",
"preview": "nuxt preview",
"postinstall": "nuxt prepare"
},
"devDependencies": {
"nuxt": "^3.2.0"
}
}
build
构建正式版本,将被输出到.output
文件夹dev
开发环境generate
打包正式版本项目,但是会预渲染每个路由(nuxt build --prerender
)preview
对打包项目启动本地预览服务器postinstall
该脚本为NPM的生命周期函数,将在npm install
后执行针对postinstall
中执行的nuxi prepare
脚本,官方文档有如下解释:
The
prepare
command creates a.nuxt
directory in your application and generates types. This can be useful in a CI environment or as apostinstall
command in yourpackage.json
.
执行该脚本后,将在项目根目录创建.nuxt
文件夹
.d.ts
结尾,是Nuxt的TS类型声明