Vue2.0服务端渲染

Vue2.0同时支持服务端,服务端渲染支持流式渲染。

因为HTTP请求也是流式,Vue 的服务端渲染结果可以直接 pipe 到返回的请求里面。这样一来,就可以更早地在浏览器中呈现给用户内容,通过合理的缓存策略,可以有效地提升服务端渲染的性能。

一个服务端渲染的例子:

static/app.js

(function () { 'use strict'  
var createApp = function () {  
   return new Vue({   
    template: '<div id="app"> \
      {{msg}} \
      <button @click="click">click</button>\
     </div>',  
    data: {  
     msg: 0  
    },   
    methods : {   
     click : function() { 
      alert(this.msg);   
     }   
    }  
   })
  }    
  // 判断当前环境是服务端环境还是浏览器环境 
  if (typeof module !== 'undefined' && module.exports) {  
   // 服务端环境,返回实例的构造函数 
   module.exports = createApp
  } else {  
   // 浏览器环境,直接进行实例化 
   this.app = createApp() 
  }
}).call(this)

index.html

<!DOCTYPE html>
<html>
<head>
  <title>SSR</title>
  <script src="http://cdn.bootcss.com/vue/2.0.3/vue.min.js"></script>
</head>
<body>
  <div id="app"></div> 
  <script src="/static/app.js"></script> 
  <script>app.$mount('#app')</script>
</body>
</html>

服务端代码 server.js

'use strict'
var fs = require('fs')
var path = require('path')
global.Vue = require('vue')
// 获取index.html布局
var layout = fs.readFileSync('./index.html', 'utf8')
var renderer = require('vue-server-renderer').createRenderer()
// 创建一个Express服务器
var express = require('express')
var server = express()
// 设置"static"文件夹为静态资源路径
server.use('/static', express.static( 
 path.resolve(__dirname, 'static')
))
// 处理所有的Get请求
server.get('*', function (request, response) { 
  renderer.renderToString(  
   // 获取app.js的Vue实例   
    require('./static/app')(), 
   function (error, html) {  
    if (error) {    
     console.error(error)   
     return response
      .status(500)   
      .send('Server Error')  
    }   
    // 将渲染好的HTML插入替换index.html中,返回给浏览器  
    response.send(layout.replace('<div id="app"></div>', html)) 
   } 
  )
})
// 监听3000端口,通过http://localhost:3000/访问应用
server.listen(3000, function (error) { 
  if (error) throw error
  console.log('Server is running at localhost:5000')
})

results matching ""

    No results matching ""