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 相关文章推荐
JSQL 批量图片切换的实现代码
May 05 Javascript
Jquery uploadify图片上传插件无法上传的解决方法
Dec 16 Javascript
IE下Ajax缓存问题的快速解决方法(get方式)
Jan 09 Javascript
判断复选框是否被选中的两种方法
Jun 04 Javascript
分享一个自己写的简单的javascript分页组件
Feb 15 Javascript
jquery实现顶部向右伸缩的导航区域代码
Sep 02 Javascript
win7下安装配置node.js+express开发环境
Dec 06 Javascript
基于JavaScript实现本地图片预览
Feb 08 Javascript
AngularJS表格添加序号的方法
Mar 03 Javascript
webpack实现热更新(实施同步刷新)
Jul 28 Javascript
微信小程序实现topBar底部选择栏效果
Jul 20 Javascript
微信小程序点击滚动到指定位置的实现
May 22 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
phpmyadmin 常用选项设置详解版
2010/03/07 PHP
细谈php中SQL注入攻击与XSS攻击
2012/06/10 PHP
ThinkPHP2.x防范XSS跨站攻击的方法
2015/09/25 PHP
使用PHP similar text计算两个字符串相似度
2015/11/06 PHP
TP5多入口设置实例讲解
2020/12/15 PHP
javascript之通用简单的table选项卡实现(二)
2010/05/09 Javascript
JS中eval函数的使用示例
2013/07/21 Javascript
node+express+ejs制作简单页面上手指南
2014/11/26 Javascript
JavaScript结合AJAX_stream实现流式显示
2015/01/08 Javascript
EasyUI中combobox默认值注意事项
2015/03/01 Javascript
jquery实现标签支持图文排列带上下箭头按钮的选项卡
2015/03/14 Javascript
JS实现控制表格行内容垂直对齐的方法
2015/03/30 Javascript
JavaScript简单遍历DOM对象所有属性的实现方法
2015/10/21 Javascript
分享两款带遮罩的jQuery弹出框
2015/12/30 Javascript
js基础之DOM中document对象的常用属性方法详解
2016/10/28 Javascript
jQuery实现验证表单密码一致性及正则表达式验证邮箱、手机号的方法
2017/12/05 jQuery
解决vue同一slot在组件中渲染多次的问题
2018/09/06 Javascript
微信小程序实现导航栏和内容上下联动功能代码
2020/06/29 Javascript
ES6中的Javascript解构的实现
2020/10/30 Javascript
Python实现删除列表中满足一定条件的元素示例
2017/06/12 Python
Python使用matplotlib填充图形指定区域代码示例
2018/01/16 Python
详解如何利用Cython为Python代码加速
2018/01/27 Python
python数字图像处理之骨架提取与分水岭算法
2018/04/27 Python
python 实现求解字符串集的最长公共前缀方法
2018/07/20 Python
python 实现创建文件夹和创建日志文件的方法
2019/07/07 Python
CSS3 3D立方体效果示例-transform也不过如此
2016/12/05 HTML / CSS
美国面料纺织品商城:Fabric.com
2017/06/28 全球购物
德国宠物用品、宠物食品及水族馆网上商店:ZooRoyal
2017/07/09 全球购物
澳大利亚手表品牌:Time IV Change
2018/10/06 全球购物
求高于平均分的学生学号及成绩
2016/09/01 面试题
办理退休介绍信
2014/01/09 职场文书
开工庆典邀请函范文
2014/01/16 职场文书
技校毕业生自荐信范文
2014/03/07 职场文书
奥巴马的演讲稿
2014/05/15 职场文书
赵乐秦在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
素质教育学习心得体会
2016/01/19 职场文书