项目源码地址 : https://github.com/qifutian/learngit/tree/main/vue-ssr
搭建自己的SSR
- mkdir vue-ssr
- cd vue-ssr
- npm init -y
- npm i vue vue-server-renderer
- 创建server.js
- 使用node运行
- 服务端会将vue渲染成字符串
server.js
const Vue = require('vue')
const renderer = require('vue-server-renderer')
const app = new({
template:`
<div id="app"><h1>{
{message}}</h1></div>
`,
data:{
message: "ssr text"
}
})
renderer.renderToString(app,(err,heml)=>{
if(err) throw err
console.log(html)
})
结合到Web服务中
目的:是将渲染结果发送给客户端浏览器
- 安装web服务端,之前代码
- npm i express
- 修改文件,通过nodemon运行
- nodemon server.js
const Vue = require('vue')
const renderer = require('vue-server-renderer').createRenderer()
const express = require('express')
const server = express()
server.get('/',(req,res)=>{
const app = new Vue({
template:`
<div id="app"><h1>{
{message}}</h1></div>
`,
data:{
message: "ssr text"
}
})
renderer.renderToString(app,(err,html)=>{
if(err){
return res.status(500).end("Server ERROR")}
res.setHeader('Content-Type','text/html;charset=utf8')
// res.end(html)
res.end(
`
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
${
html}
</body>
</html>
`
)
})
})
server.listen(3000,()=>{
console.log('server running at port 3000');
})
使用html模板
页面的模板可以存放到一个单独的文件中,对他进行管理和维护
创建index.template.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<!--vue-ssr-outlet-->
</body>
</html>
修改server.js
const Vue = require('vue')
const fs = require('fs')
const renderer = require('vue-server-renderer').createRenderer({
template: fs.readFileSync('./index.template.html','utf-8')
})
const express = require('express')
const server = express()
server.get('/',(req,res)=>{
const app = new Vue({
template:`
<div id="app"><h1>{
{message}}</h1></div>
`,
data:{
message: "ssr text"
}
})
renderer.renderToString(app,(err, html)=>{
if(err){
return res.status(500).end("Server ERROR")}
res.setHeader('Content-Type','text/html;charset=utf8')
res.end(html)
})
})
server.listen(3000,()=>{