自定义vue SSR

项目源码地址 : https://github.com/qifutian/learngit/tree/main/vue-ssr

搭建自己的SSR

  1. mkdir vue-ssr
  2. cd vue-ssr
  3. npm init -y
  4. npm i vue vue-server-renderer
  5. 创建server.js
  6. 使用node运行
  7. 服务端会将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服务中

目的:是将渲染结果发送给客户端浏览器

  1. 安装web服务端,之前代码
  2. npm i express
  3. 修改文件,通过nodemon运行
  4. 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,()=>{
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值