离 Vue 2.0
发布快有两周了,最近两天终于有空做了服务端渲染和同构的一些尝试,并实现了一个对 Vue Server Renderer
的封装,可以用更精简的代码来实现在目前的 Node.js
应用中引入 Vue 服务端渲染。
Vue 的服务端渲染支持流式输出,可以做组件级的缓存,这使得它的渲染速度也是非常快速。通过搭配新版的 vue-router
和 vuex
( Vue 全家桶 大雾 ),可以实现一个既可以满足 SEO 需求 ,也如 SPA 一样交互体验流畅的前后端同构应用。
vue-hackernews-2.0 是 Vue 2.0 的同构示例项目,使用 firebase 作为数据层,实现了完全实时的 hackernews 信息流,同时还能被搜索引擎当做静态内容抓取。
Use Vue 2.0 server-side rendering with Express 项目地址: vue-ssr
还没有做优化,只是基础使用了 lru 做了组件的缓存,服务器平均渲染时间在 40ms 左右。 http://ssr.bood.in/
npm i vue-ssr --save
const express = require('express')
const router = express.Router()
const vueRender = require('vue-ssr')
// webpack server-side bundle config
const serverConfig = require('path to webpack.server.js')
// create a project renderer
const indexRenderer = vueRender({
projectName: 'index',
rendererOptions: {
cache: require('lru-cache')({
max: 1000,
maxAge: 1000 * 60 * 15
})
},
webpackServer: serverConfig
})
// handler
// 这里的静态模板只做演示,可以查看文末的实例实例代码
function indexView (req, res) => {
indexRenderer(req, res, `
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Cov-X</title>
{{ STYLE }}
</head>
<body>
{{ APP }}
<script src="/dist/client-bundle.js"></script>
</body>
</html>
`)
}
router.get('/', indexView)
router.get('/home', indexView)
router.get('/article', indexView)
router.get('/tag', indexView)
project name of webpack entries that you want to server side rendering
// webpack config
...
entry: {
index: ['../path to app client entry'],
dashboard: ['../path to dashboard project client entry']
},
...
const indexRenderer = vueRender({
projectName: 'index',
webpackServer: serverConfig
})
const dashRenderer = vueRender({
projectName: 'dashboard',
webpackServer: serverConfig
})
rendererOptions 即 Vue server renderer 的配置项
声明一些自定义指令的服务端实现:
const indexRenderer = vueRender('index', {
directives: {
example (vnode, directiveMeta) {
// transform vnode based on directive binding metadata
}
}
}, serverConfig)
const indexRenderer = vueRender('index', {
cache: require('lru-cache')({
max: 1000,
maxAge: 1000 * 60 * 15
})
}, serverConfig)
更多信息可以参考:Why Use bundleRenderer?
将 webpack 服务端打包配置引入到 webpackServer 就完成了。
const serverConfig = require('path to webpack.server.js')
const indexRenderer = vueRender({
projectName: 'index',
webpackServer: serverConfig
})
vue-ssr-hmr-template是一个使用了 vue-ssr 的项目脚手架,既可以使用前后端同构,也可以使用普通的 spa 模式( node 渲染静态页)。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.