VUESSR理解污染问题

234 阅读1分钟

1. SSR

VUEJS可以将一个组件渲染为服务器端的 HTML 字符串,将它们直接发送到浏览器,最后将这些静态标记"激活"为客户端上完全可交互的应用程序。... 参考官方文档: 官网

2. vue-ssr一直在强调数据污染问题 数据污染

理解

// 第 1 步:创建一个 Vue 实例
const Vue = require('vue')
const server = require('express')()
// 第 2 步:创建一个 renderer
const renderer = require('vue-server-renderer').createRenderer()

const app = new Vue({
  template: `<div>Hello World我是{{myName}}年龄{{myage}} 测试d {{d}} 测试e {{e}}</div>`,
  data: {
    myName: 'wzq',
    myage: 18,
    d: 0,
    e: 1
  }
})

server.get('*', (req, res) => {
  console.log(req.url);

  if (req.url === '/111') {
    app.d = 123
  }
  if (req.url === '/222') {
    app.e = 456
  }

  // 第 3 步:将 Vue 实例渲染为 HTML
  renderer.renderToString(app, (err, html) => {
    if (err) throw err
    res.writeHead(200, {
      "Content-Type": 'text/html;charset=utf-8'
    })
    // console.log(html)
    // => <div data-server-rendered="true">Hello World</div>
    res.end(`
      <!DOCTYPE html>
      <html lang="en">
        <head><title>Hello</title></head>
        <body>${html}</body>
      </html>
    `)
  })
})

server.listen(8080)

github代码地址访问

当我们在访问
http://localhost:8080/111
http://localhost:8080/222
http://localhost:8080/

最终会发现在不停的刷新之后得到一样的结果 这显然不是我们想要的结果 产生的原因是因为每次请求都用的相同的Vue实例 返回的也是相同的vue实例 所以最终结果相同

因此在每次请求 我们都new Vue实例 才会不造成数据污染问题