vue服务端渲染操作简单入门实例分析


Posted in Javascript onAugust 28, 2019

本文实例讲述了vue服务端渲染操作。分享给大家供大家参考,具体如下:

想到要学习vue-ssr的同学,自不必多说,一定是熟悉了vue,并且多多少少做过几个项目。然后学习vue服务端渲染无非解决首屏渲染的白屏问题以及SEO友好。

话不多说,笔者也是研究多日才搞明白这个服务端渲染到底是杂么回事!!!

一,首先实现下官网的基本案例

随便建一个目录,然后执行npm init初始化项目,生成工程文件package.json;创建server.js;然后按照vue-ssr官方链接:https://ssr.vuejs.org/zh/basic.html教程里面介绍的server.js,复制教程里面代码,如下

const Vue = require('vue')
const server = require('express')()
const renderer = require('vue-server-renderer').createRenderer()
server.get('*', (req, res) => {
 const app = new Vue({
  data: {
   url: req.url
  },
  template: `<div>访问的 URL 是: {{ url }}</div>`
 })
 renderer.renderToString(app, (err, html) => {
  if (err) {
   res.status(500).end('Internal Server Error')
   return
  }
  res.end(`
   <!DOCTYPE html>
   <html lang="en">
    <head><title>Hello</title></head>
    <body>${html}</body>
   </html>
  `)
 })
})
server.listen(8080)

显然需要按照上面引入的依赖vue,express和vue-server-renderer,安装完毕,在终端执行,node server.js,打开浏览器,http://localhost:8080/,不出意外会是乱码,因为官网的返回的html字符串里面没有 <meta charset="utf-8">,而加上这个 就好了。

当然还可以引入一个模板文件,同样是官网的案例,此时的server.js为

const Vue = require('vue')
const server = require('express')()
const renderer = require('vue-server-renderer').createRenderer({
 template: require('fs').readFileSync('./index.template.html', 'utf-8')
})
server.get('*', (req, res) => {
 const app = new Vue({
  data: {
   url: req.url
  },
  template: `<div>访问的 URL 是: {{ url }}</div>`
 })
 renderer.renderToString(app, (err, html) => {
  if (err) {
   res.status(500).end('Internal Server Error')
   return
  }
  res.end(html)
 })
})
server.listen(8080)

模板文件index.template.html

<!DOCTYPE html>
<html lang="en">
 <head><title>Hello</title></head>
 <body>
   <!-- 下面这个注释必须有 -->
  <!--vue-ssr-outlet-->
 </body>
</html>

上面注释根据官网教程,是vue注入的位置标记。然后同样执行,node server.js就可以了。

是不是很简单,还可以创建一个对象来改变模板的标题和meta,这个时候的server.js和模板文件代码分别是

const Vue = require('vue')
const server = require('express')()
const renderer = require('vue-server-renderer').createRenderer({
 template: require('fs').readFileSync('./index.template.html', 'utf-8')
})
server.get('*', (req, res) => {
  const context = {
  title: 'hello',
  meta: `
  <meta ...>
  <meta ...>
 `,url:req.url
 }
 const app = new Vue({
  data: {
   url: req.url
  },
  template: `<div>访问的 URL 是: {{ url }}</div>`
 })
 renderer.renderToString(app, context,(err, html) => {
  if (err) {
   res.status(500).end('Internal Server Error')
   return
  }
  res.end(html)
 })
})
server.listen(8080)
<!DOCTYPE html>
<html lang="en">
 <head>
   <title>{{title}}</title>
   {{{meta}}}
 </head>
 <body>
   <!-- 下面这个注释必须有 -->
  <!--vue-ssr-outlet-->
 </body>
</html>

这里说下我的理解,vue服务端渲染实际是一套代码的两次应用,所谓的一套代码就是拿出server.js外面去的vm实例,上面之所以简单是因为我们在server内部创建的vm实例,一旦将vm拿出去,在server.js外部引入,那么涉及的就麻烦了。

这里分两条线说,一个是在server.js外面创建一个app.js;结果是无法引入到server中;而这个也不是关注的重点;

另一条线是使用vue-loader创建一个vm实例,然后引入到server中,整个vue渲染就在解决这个问题,解决引入的问题,解决引入之后与前端混合的问题。下面贴上简单案例的实现代码。

因为不能直接应用.vue文件以及外部的js文件,所以需要借助webpack,借助webpack将vue实例,转译为node可用代码,以及对前端代码进行转译。

二,以vue init webpack-simple vuessr0 为基础的vue-ssr案例

1)用vue-cli也就是vue脚手架建了一个简单模板,命令:vue init webpack-simple vuessr0,相信对此都比较熟悉,建好后的结构如下

vue服务端渲染操作简单入门实例分析

之后改造一下,创建几个文件app.js,entry-client.js,entry-server.js,创建build目录,删除自动生成的webpack.config.js文件,改之后的目录结构为

各个文件的作用,entry-server.js将vm实例,转译为node可用代码;

entry-client.js和传统前端处理一致。

vue服务端渲染操作简单入门实例分析

好吧,github链接地址为:https://github.com/mstzhen/vue-ssr;我实在有点懒了。

需要说明的是,webpack将一份文件打包为两份,前端入口文件的作用是挂载到id上面,后端入口文件以及后端文件负责注入。

首先安装依赖:npm install

然后依次

npm run build:client

npm run build:server

npm run dev

8080端口访问即可。

最后,本文只是对vue服务端官网最简单那个实例的实现。没有使用vue-router,没有vuex,更没有服务端数据请求。希望对正在学习vue服务端学习的小伙伴有所帮助。

错误之处,请指出。

Javascript 相关文章推荐
Javascript实现仿WebQQ界面的“浮云”兼容 IE7以上版本及FF
Apr 27 Javascript
基于jquery的$.ajax async使用
Oct 19 Javascript
jquery实现鼠标拖拽滑动效果来选择数字的方法
May 04 Javascript
jQuery焦点图切换特效代码分享
Sep 15 Javascript
JavaScript使用DeviceOne开发实战(二) 生成调试安装包
Dec 01 Javascript
javascript运动框架用法实例分析(实现放大与缩小效果)
Jan 08 Javascript
jQuery.Validate表单验证插件的使用示例详解
Jan 04 Javascript
vue2.0 中使用transition实现动画效果使用心得
Aug 13 Javascript
Vue移动端实现图片上传及超过1M压缩上传
Dec 23 Javascript
一起深入理解js中的事件对象
Feb 06 Javascript
原生Js 实现的简单无缝滚动轮播图的示例代码
May 10 Javascript
js判断两个数组相等的5种方法
May 06 Javascript
浅谈对于“不用setInterval,用setTimeout”的理解
Aug 28 #Javascript
Vue的编码技巧与规范使用详解
Aug 28 #Javascript
JS开发自己的类库实例分析
Aug 28 #Javascript
详解Vue 换肤方案验证
Aug 28 #Javascript
Vue项目实现换肤功能的一种方案分析
Aug 28 #Javascript
js遍历详解(forEach, map, for, for...in, for...of)
Aug 28 #Javascript
Angular6使用forRoot() 注册单一实例服务问题
Aug 27 #Javascript
You might like
用PHP和ACCESS写聊天室(四)
2006/10/09 PHP
ThinkPHP3.1新特性之动态设置自动完成及自动验证示例代码
2014/06/23 PHP
Linux(CentOS)下PHP扩展PDO编译安装的方法
2016/04/07 PHP
PHP实现统计所有字符在字符串中出现次数的方法
2017/10/17 PHP
PHP回调函数概念与用法实例分析
2017/11/03 PHP
一个简单的动态加载js和css的jquery代码
2014/09/01 Javascript
JS取得绝对路径的实现代码
2015/01/16 Javascript
jQuery实现表单步骤流程导航代码分享
2015/08/28 Javascript
AngularJS 依赖注入详解及示例代码
2016/08/17 Javascript
Vue.js父与子组件之间传参示例
2017/02/28 Javascript
浅谈Vue中render中的h箭头函数
2019/11/07 Javascript
JavaScript async/await原理及实例解析
2020/12/02 Javascript
[56:56]VG vs LGD 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.22
2019/09/05 DOTA
wxPython实现窗口用图片做背景
2018/04/25 Python
python实现公司年会抽奖程序
2019/01/22 Python
Django框架中间件(Middleware)用法实例分析
2019/05/24 Python
python opencv调用笔记本摄像头
2019/08/28 Python
基于python求两个列表的并集.交集.差集
2020/02/10 Python
tensorflow 实现数据类型转换
2020/02/17 Python
基于Python绘制个人足迹地图
2020/06/01 Python
Python操作PostgreSql数据库的方法(基本的增删改查)
2020/12/29 Python
对pytorch中x = x.view(x.size(0), -1) 的理解说明
2021/03/03 Python
支持IE8的纯css3开发的响应式设计动画菜单教程
2014/11/05 HTML / CSS
html5 冒号分隔符对齐的实现
2019/07/31 HTML / CSS
惠普墨西哥官方商店:HP墨西哥
2016/12/01 全球购物
Nip + Fab官网:英国美容品牌
2019/08/26 全球购物
成都思必达公司C#程序员招聘面试题
2013/06/26 面试题
二手房购房意向书范本
2014/04/01 职场文书
小学“向国旗敬礼”网上签名寄语活动总结
2014/09/27 职场文书
郭明义观后感
2015/06/08 职场文书
执行力心得体会范文
2016/01/11 职场文书
关于战胜挫折的名言警句大全!
2019/07/05 职场文书
创业计划书之网吧
2019/10/10 职场文书
windows下快速安装nginx并配置开机自启动的方法
2021/05/11 Servers
MySQL 1130异常,无法远程登录解决方案详解
2021/08/23 MySQL
分享python函数常见关键字
2022/04/26 Python