什么是SSR
ssr是指将组件通过服务端直接渲染成为HTML字符串,然后作为服务端响应返回给浏览器,最后浏览器将静态的HTML激活(hydrate)为能够交互的客户端应用。
SSR的优点
- 更快的首屏加载:就是能够让你的首页更快的加载出来。
- 统一的心智模型:你可以使用相同的语言和相同的声明式,面向组件的心智模型来开发整个应用,而不需要在后端模版系统和前端框架之间来回切换。
- SEO的搜索:搜索引擎爬虫可以直接看到完全的渲染页面。
SSR的缺点
- 开发限制:浏览器端特定代码只能在某些生命周期钩子中使用,一些外部库可能需要特殊处理才能在服务端渲染的应用中运行。
- 更多的与构建配置和部署的相关要求:服务端渲染需要一个让
node.js服务运行的环境,不像完全静态的SPA那样可以部署在任意静态文件服务器上 - 更高的服务端负载:在Node服务渲染一个完整的应用要比仅仅托管静态文件更加占用
CPU资源,如果你预期有高流量,请做好相应服务器的负载准备,并采用合理的缓存策略。
那现在我们先写一个简单的列子:
- 首先先用
npm init -y创建一个项目 - 在
package.json中添加type: "module" - 然后使用
npm i vue命令下载vue - 执行
npm install express下载express
这样你就能够获取一个初始的项目了,我们可以开始写相关代码了
- 我们先创建一个通用文件
app.js文件
import {createSSRApp} from "vue"
export function createApp() {
return createSSRApp({
data: () => ({count: 1}),
template: `<button @click="count++">{{count}}</button>`
})
}
- 创建客户端的文件
client.js
import {createApp} from "./app.js"
createApp().mount("#app")
- 创建一个服务端文件
server.js
import express from 'express'
import {renderToString} from 'vue/server-renderer'
import { createApp } from './app.js'
const server = express()
server.use(express.static("."))
server.get("/", (req, res) => {
const app = createApp()
renderToString(app).then((html) => {
res.send(`
<!DOCTYPE html>
<html>
<head>
<title>Vue SSR Example</title>
<script type="importmap">
{
"imports": {
"vue": "https://unpkg.com/vue@3/dist/vue.esm-browser.js"
}
}
</script>
<script type="module" src="/client.js"></script>
</head>
<body>
<div id="app">${html}</div>
</body>
</html>
`)
})
})
server.listen(3000, () => {
console.log('ready')
})
这些做完后,打开终端运行 node server.js 命令,打开 http://localhost:3000 地址,你就能看见一个ssr的页面了。