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

yizhihongxing

这里是详细讲解“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日

相关文章

  • vue源码解析computed多次访问会有死循环原理

    下面是关于“vue源码解析computed多次访问会有死循环原理”的完整攻略。 1. computed的原理 先来简单介绍一下computed的原理。在Vue组件中,computed是指计算属性,是一个基于响应式依赖进行缓存的数据属性,它的值在使用时会自动收集依赖,发现依赖变化时会重新计算,并且将结果缓存起来,直到依赖变化才重新计算。这样就避免了重复计算,提…

    Vue 2023年5月28日
    00
  • axios post提交formdata的实例

    下面是详细的攻略。 1. axios post提交formdata的基本语法 在使用axios提交formdata时,需要使用FormData类来创建一个表单对象。具体语法如下: const formData = new FormData() formData.append(‘name1’, ‘value1’) formData.append(‘name2’…

    Vue 2023年5月28日
    00
  • 在项目中封装axios的实战过程

    在项目中封装axios能够使代码更加简洁易读,并且可以统一管理请求接口、请求头等信息,提高代码的可维护性和可拓展性。下面是封装axios的完整攻略: 步骤一:安装axios并创建实例 首先需要在项目中安装axios依赖包,通过npm仓库下载、或者使用CDN链接在html文件中引入。 安装命令:npm install axios 接着,我们需要在项目中创建一个…

    Vue 2023年5月28日
    00
  • Vue编译器解析compile源码解析

    Vue编译器是一个非常重要的组成部分,它的作用是将Vue组件中的template模板转化为渲染函数,以实现组件的动态渲染。本篇攻略将详细介绍Vue编译器解析compile源码的过程。 什么是compile源码? compile源码是Vue编译器的一部分,它是Vue的编译过程的核心部分。该部分主要负责将Vue组件的模板转化为渲染函数。 compile源码执行过…

    Vue 2023年5月27日
    00
  • 构建Vue3桌面应用程序的方法

    构建Vue3桌面应用程序的方法可以分为以下几个步骤: 1. 安装 Vue CLI Vue CLI 是一个官方提供的脚手架工具,可以帮助我们快速创建 Vue.js 项目。可以通过以下命令进行安装: npm install -g @vue/cli # OR yarn global add @vue/cli 2. 创建 Vue 项目 在命令行中执行以下命令来创建一…

    Vue 2023年5月27日
    00
  • vue 实现拖拽动态生成组件的需求

    实现拖拽动态生成组件的需求,可以分为以下几个步骤: 安装vue-draggable插件 注册组件 在页面中使用vue-draggable实现拖拽效果动态生成组件 添加组件属性、方法 下面将分步骤详细讲解。 1. 安装vue-draggable插件 vue-draggable是一个拖拽组件库,它提供了常用的拖拽功能,并且支持Vue单文件组件,可以轻松地将功能模…

    Vue 2023年5月28日
    00
  • vue日历/日程提醒/html5本地缓存功能

    Vue日历/日程提醒攻略 简介 在Vue中实现日历/日程提醒功能,可以帮助用户更好地规划时间并且提醒用户该做什么。这里介绍一种通过使用Vue.js及相关的插件来实现 Vue日历/日程提醒的方法 开发环境 Vue.js(2.0+) vue-calendar-component(一个简单好用的Vue日历组件) vue-notification(Vue提醒/通知组…

    Vue 2023年5月29日
    00
  • VUE异步更新DOM – 用$nextTick解决DOM视图的问题

    VUE是一个流行的JavaScript框架,具有数据驱动和组件化的特点。然而,当我们在处理DOM视图时,有时候可能会出现异步更新的问题。这会导致我们的DOM视图没有及时更新,从而导致一些错误。在这种情况下,我们可以使用Vue提供的$nextTick方法来解决DOM视图异步更新的问题。 什么是异步更新DOM 在Vue中,组件的DOM操作是异步执行的。这意味着当…

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