vue ssr 实现方式(学习笔记)

这里是详细讲解“vue ssr 实现方式(学习笔记)”的完整攻略。

背景

前端框架的出现,让前端的工程师能够愉快的写代码,但是一个问题却在诞生:SEO。如果你的网站有 SEO 的要求,即搜索引擎优化,单纯的用前端框架写代码是无法满足这个需求的。那么怎么解决这个问题呢?这里我们就提到了 ssr。

什么是 SSR

SSR,即“服务端渲染”,是指将数据通过服务端获取后,经过模板引擎渲染后一并返回给客户端的技术。SSR 能够解决以前纯前端 SPA 所遇到的 SEO(搜索引擎优化)、首屏加载时间、前后端代码共用等问题。

Vue SSR 的实现方式

Vue SSR 的实现方式主要分为以下几个步骤:

  1. 服务端入口
  2. 构建客户端应用程序
  3. 渲染器生成
  4. 渲染

下面我们就来一一详细的讲解每个步骤。

服务端入口

第一步,我们需要创建服务器入口文件 server-entry.js。该文件会被用来创建服务器实例。

客户端激活

服务端渲染出来的 HTML 是不具有交互性的,这是和前端渲染的一个差异。如果只进行服务端渲染,那么用户的体验是非常糟糕的。所以我们需要将服务端渲染出来的 HTML 和客户端的 JavaScript 进行激活。

客户端激活有两种方式,一种是采用官方推荐的方式,即使用client-entry.js文件;而另一种方式是将客户端 JavaScript 直接插入渲染出来的 HTML 中。

下面结合实例进行详细说明。

客户端激活方式一:client-entry.js

  1. 创建客户端 app 入口文件 client-entry.js
import createApp from './app'
const {app} = createApp()
app.$mount('#app')
  1. 在服务器渲染函数中异步获取客户端激活文件后,返回的html中插入如下内容
<script src="/dist/client-entry.js"></script>

注意:render渲染函数中返回html的时候一定要将script嵌套在div内,否则会造成一定的阻塞。

客户端激活方案二:将客户端 JavaScript 直接插入 HTML 中

当然,我们还可以使用 vue-router 中提供的 history 模式,以导航的方式切换路由,不会造成页面的刷新,就不会有白屏的瞬间出现。

构建客户端应用程序

在服务端入口中,我们使用了Vue的工厂方法 createApp,这个方法将返回两个对象,分别为:应用实例 app 和 router。app 表示带有所有渲染结果的 vue 实例,而 router 是 vue-router 的实例。

// app.js
Vue.use(VueRouter)
export default function createApp () {
  const router = new VueRouter({
    mode: 'history',
    routes
  })

  const app = new Vue({
    router,
    render: h => h(App)
  })

  return { app, router }
}

而为了生成客户端应用程序,我们还需要一个工厂方法来生成客户端 app。

// entry-client.js
import createApp from './app'

const { app } = createApp()

// 此时就可以挂载到页面上了。
// $mount() 如果没有参数,将会挂载到 body 下,相当于 app.$mount('body')
app.$mount('#app')

渲染器生成

在第三步进行服务端渲染时,我们需要生成一个渲染器。而 Vue 提供了两种方式生成渲染器。

webpack 打包成 bundle 的方式

在 webpack 打包过程中,Vue 提供了一个官方插件 vue-server-renderer/server-plugin,通过这个插件,我们会将 server-entry.js 和 entry-client.js 一同打包成一个 bundle,然后打包生成的 bundle 和 index.html 在服务端启动时一起被服务端加载。

// webpack.config.js (server)
const VueSSRServerPlugin = require('vue-server-renderer/server-plugin')
module.exports = {
  target: 'node',
  devtool: 'source-map',
  entry: './app.js',
  output: {
    filename: 'server-bundle.js',
    libraryTarget: 'commonjs2'
  },
  plugins: [
    new VueSSRServerPlugin()
  ]
}

接口路由方式

这种方式的实现就和普通的 API 接口一样,直接返回渲染好的 HTML 字符串。服务器接收到 URL 后,定义一个路由规则,从而可以向请求端返回正确的 HTML 渲染结果。

渲染

在第四步中,我们需要通过生成的渲染器将代码渲染出来。

服务端渲染

在服务端渲染时,我们需要使用到 vue-server-renderer 模块提供的 createRenderer 函数来创建一个 renderer 实例。该函数接收一个 Object 类型的配置作为参数。以下是一个基本的渲染函数的结构:

const renderer = require('vue-server-renderer').createRenderer({
  template: require('fs').readFileSync('./index.template.html', 'utf-8')
})

const context = {
  title: 'vue ssr',
  meta: `
    <meta name="keyword" content="vue,ssr">
    <meta name="author" content="胡志明">
  `
}

server.get('*', (req, res) => {
  const app = new Vue({
    data: {
      message: 'Vue SSR'
    },
    template: '<div>{{message}}</div>'
  })

  renderer.renderToString(app, context, function(err, html) {
    if (err) {
      console.error(err)
      res.status(500).end('Internal Server Error')
      return
    }
    res.end(html)
  })
})

客户端渲染

在客户端渲染时,我们通常只需要使用 new Vue() 这个工厂方法即可,和普通的客户端渲染一样,不需要使用到 vue-server-renderer 模块。通常情况下,我们在 <body> 标签上手动加上 id “app”,这也是 Vue SSR 官方提供的标准写法。

<body>
  <div id="app"></div>
  <script type="text/javascript" src="./client-bundle.js"></script>
</body>
import Vue from 'vue'
import App from './App.vue'

new Vue({
  el: '#app',
  render: h => h(App)
})

这就是Vue SSR的基本实现方式及过程,当然在具体实践时还有很多细节问题需要注意,如何在服务端获取异步数据、如何处理路由等等。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue ssr 实现方式(学习笔记) - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • 基于Vant UI框架实现时间段选择器

    下面我来详细讲解如何基于Vant UI框架实现时间段选择器的攻略。 1. 确定需求和使用Vant UI框架 首先需要确定需求,即实现一个时间段的选择器,并且选择器需要基于Vant UI框架实现。Vant UI 是一个轻量、可靠的移动端 Vue 组件库。我们可以使用npm来安装Vant UI,命令如下: npm i vant -S 2. 导入Vant UI组件…

    Vue 2023年5月29日
    00
  • vue-resourc发起异步请求的方法

    下面是vue-resource发起异步请求的方法的完整攻略。 安装vue-resource 首先需要在项目中安装vue-resource: npm install vue-resource –save 然后在项目中使用vue-resource: import Vue from ‘vue’ import VueResource from ‘vue-resou…

    Vue 2023年5月28日
    00
  • vue3.0 上手体验

    Vue3.0 上手体验 简介 Vue 3.0 是通过对比 Vue 2.0 进行改进的,主要包括响应式系统、组合 API 和性能等方面。Vue 3.0 API 的简洁性、效率和可维护性得到了提高。 安装 Vue 3.0 Vue 3.0 目前尚未发布正式版,但是您可以在开发环境中安装最新版进行尝试。你需要通过 npm 来安装,并且需要 Node.js 的支持。 …

    Vue 2023年5月28日
    00
  • Vue项目总结之webpack常规打包优化方案

    那我们就来详细讲解一下“Vue项目总结之webpack常规打包优化方案”的完整攻略,包括以下内容: 一、Webpack基础知识 Webpack 是一个现代 JavaScript 应用程序的静态模块打包器。它会递归地构建一个依赖关系图,在这个过程中将每个模块视为一个节点,并将模块之间的依赖关系转换为图中的边。 我相信作为一个Vue开发者,你一定已经熟练掌握了W…

    Vue 2023年5月28日
    00
  • springboot+vue+对接支付宝接口+二维码扫描支付功能(沙箱环境)

    下面是“springboot+vue+对接支付宝接口+二维码扫描支付功能(沙箱环境)”的详细攻略: 步骤一:搭建Spring Boot项目 首先,需要用Spring Initializr创建一个Spring Boot项目。在选择依赖时,我们需要选择Web和Thymeleaf等依赖,具体的依赖如下: <dependency> <groupId…

    Vue 2023年5月28日
    00
  • Vue 实现从文件中获取文本信息的方法详解

    Vue 实现从文件中获取文本信息的方法详解 在Vue开发过程中,我们有时需要从文件中读取文本信息,并在Vue组件中展示或者做其他操作。本文将为您介绍一些Vue实现从文件中获取文本信息的方法,以供您参考和使用。 方法一:使用Ajax请求 可以使用jQuery或者Vue自带的axios库执行Ajax请求来从文件中获取文本信息。以下是一个使用Vue的axios库进…

    Vue 2023年5月28日
    00
  • 解决Vue+Electron下Vuex的Dispatch没有效果问题

    解决 Vue+Electron 下 Vuex 的 Dispatch 没有效果问题 问题描述: 在使用 Vue+Electron 构建桌面应用程序时,可能会遇到 Vuex 的 Dispatch 方法无法正常触发 Action 的问题。例如下面的代码: // 在 Vue 组件中的方法里调用 Action,但没有效果 this.$store.dispatch(‘g…

    Vue 2023年5月28日
    00
  • mpvue中使用flyjs全局拦截的实现代码

    mpvue是一个能够基于Vue.js快速开发小程序的框架。与Vue.js类似,mpvue的语法和API几乎与之相同,开发者可以在短时间内熟练掌握其使用。而flyjs是一个优秀的基于Promise的HTTP请求库,能够支持拦截器等高级功能。本文将详细讲解在mpvue中使用flyjs全局拦截的实现代码,以及两个示例说明。 安装和使用flyjs 首先,在mpvue…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部