Vue

vue 服务端渲染(一):初探

2020-09-30  本文已影响0人  梦想成真213

概念

客户端渲染,服务端渲染对比

SSR 运行过程:

整个打包过程

安装包

npm install vue vue-server-renderer koa @koa/router -D

开发中

本地新建一个文件夹 vue-ssr-demo,初始化项目npm init -f,生成一个package.json,npm install安装需要用到的包,新建一个server.js来启动服务:

// server.js
  const Vue = require('vue')
const VueServerRenderer = require('vue-server-renderer')

const vm = new Vue({
  data() {
    return {
      name: '小可爱',
      age: 3
    }
  },
  template: `<div>我是:{{name}},{{age}}岁</div>`
})

const Koa = require('koa')
const Router = require('@koa/router')
// 创建一个渲染器
const render = VueServerRenderer.createRenderer()// 创建一个渲染器

let app = new Koa() // app实例
let router = new Router() // 路由实例

router.get('/', async (ctx) => {
  ctx.body = await render.renderToString(vm) // render.renderToString 返回的是一个promise
})
app.use(router.routes())
app.listen(3500)

启动命令:nodemon server.js,VueServerRenderer.createRenderer()创建一个渲染器,调用渲染器 renderToString 方法 传入vm实例,访问http://localhost:3500/ 可以看到页面展示:


页面上显示了data-server-rendered="true"表示服务端渲染。

通常我们都是有一个 html 模板,然后将打包的内容放进去,新建一个 html 文件,写下vue server 的标记

<!--vue-ssr-outlet-->
// index.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>vue ssr template</title>
</head>
<body>
  <!--vue-ssr-outlet-->
</body>
</html>

server.js 中读取本地的index.html文件,文件内容作为渲染器模板即可:

const Vue = require('vue')
const VueServerRenderer = require('vue-server-renderer')

const vm = new Vue({
  data() {
    return {
      name: '小可爱',
      age: 3
    }
  },
  template: `<div>我是:{{name}},{{age}}岁</div>`
})

const Koa = require('koa')
const Router = require('@koa/router')
const fs = require('fs')
const path = require('path')

const htmlStr = fs.readFileSync(path.resolve(__dirname, 'index.html'), 'utf8') // 同步读取文件

// 创建一个渲染器
const render = VueServerRenderer.createRenderer({
  // 可以从本地读取html文件当作模板
  template: htmlStr, // 采用哪个模版去渲染,在html中加入这个<!--vue-ssr-outlet-->标签表示渲染到这个位置上
}) // 创建一个渲染器

let app = new Koa() // app实例
let router = new Router() // 路由实例

router.get('/', async (ctx) => {
  // ctx.body = 'hello world'
  ctx.body = await render.renderToString(vm) // render.renderToString 返回的是一个promise
  // // <div data-server-rendered="true">我是:hcj,20岁</div>
})

app.use(router.routes())
app.listen(3500)

监听文件改动,自动重启服务

npm install nodemon -g

目前实现了一个最简单的 ssr,后续文章加入客户端配置,服务端配置,vue-router, vuex 来实现完整的 ssr。

github:https://github.com/mxcz213/vue-ssr-demo/tree/part-one

上一篇下一篇

猜你喜欢

热点阅读