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

 更新时间:2019年08月28日 09:40:24   作者:zhensg  
这篇文章主要介绍了vue服务端渲染操作,结合简单实例形式分析了vue.js服务端渲染操作的原理、实现方法及相关操作注意事项,需要的朋友可以参考下
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

本文实例讲述了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>
   {{{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,相信对此都比较熟悉,建好后的结构如下

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

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

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

好吧,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服务端学习的小伙伴有所帮助。

错误之处,请指出。

相关文章

  • 从vue源码解析Vue.set()和this.$set()

    从vue源码解析Vue.set()和this.$set()

    这篇文章主要介绍了从vue源码看Vue.set()和this.$set()的相关知识,我们先来从Vue提供的Vue.set()和this.$set()这两个api看看它内部是怎么实现的。感兴趣的朋友跟随小编一起看看吧
    2018-08-08
  • 在vue中使用SockJS实现webSocket通信的过程

    在vue中使用SockJS实现webSocket通信的过程

    最近接到一个业务需求,需要做一个聊天信息的实时展示的界面,下面小编把实现过程记录下来,对vue中使用SockJS实现webSocket通信的相关知识感兴趣的朋友一起看看吧
    2018-08-08
  • vue3+vite2实现动态绑定图片的优雅解决方案

    vue3+vite2实现动态绑定图片的优雅解决方案

    这篇文章主要为大家详细介绍了vue3+vite2实现动态绑定图片的优雅解决方案,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-08-08
  • Vue无后端配合实现导出功能的示例代码

    Vue无后端配合实现导出功能的示例代码

    这篇文章主要为大家详细介绍了Vue如何在无后端配合的情况下实现导出功能,文中的示例代码简洁易懂,有需要的小伙伴可以跟随小编一起了解一下
    2024-01-01
  • vue axios数据请求及vue中使用axios的方法

    vue axios数据请求及vue中使用axios的方法

    axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端,在vue中数据请求需要先安装axios。这篇文章主要介绍了vue axios数据请求及vue中使用axios的方法,需要的朋友可以参考下
    2018-09-09
  • Element框架el-tab点击标签页时再渲染问题的解决

    Element框架el-tab点击标签页时再渲染问题的解决

    本文主要介绍了Element框架el-tab点击标签页时再渲染问题的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • vue实现将自己网站(h5链接)分享到微信中形成小卡片的超详细教程

    vue实现将自己网站(h5链接)分享到微信中形成小卡片的超详细教程

    在微信小程序中,可以很简单的分享一个页面,比微信H5简单多了,下面这篇文章主要给大家介绍了关于vue实现将自己网站(h5链接)分享到微信中形成小卡片的超详细教程,需要的朋友可以参考下
    2023-02-02
  • vue使用highcharts自定义仪表盘图表

    vue使用highcharts自定义仪表盘图表

    这篇文章主要为大家详细介绍了vue使用highcharts自定义仪表盘图表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Vue 实现手动刷新组件的方法

    Vue 实现手动刷新组件的方法

    这篇文章主要介绍了Vue 实现手动刷新组件的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02
  • vue项目中使用AES实现密码加密解密(ECB和CBC两种模式)

    vue项目中使用AES实现密码加密解密(ECB和CBC两种模式)

    这篇文章主要介绍了vue项目中使用AES实现密码加密解密的方法,主要是通过ecb和cbc两种模式,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08

最新评论

?


http://www.vxiaotou.com