关于VueSSR的一些理解和详细配置

关于VueSSR的一些理解和详细配置

VueSSR简介

Vue Server-Side Rendering(Vue SSR)是为了解决客户端渲染(CSR)中的SEO(Search Engine Optimization)问题而出现的。Vue SSR使用Node.js的服务器渲染Vue组件,在服务器端将Vue组件渲染成HTML并将其发送给客户端。在客户端接收到HTML后,由Vue.js接管html,并成为一个SPA(Single-page application)。

Vue SSR利用Node.js的流程控制实现异步渲染,比起React SSR的renderToString同步渲染,Vue SSR利用Node.js的事件循环更不易阻塞。

VueSSR的实现步骤

Vue SSR的具体实现可以分为四个步骤:

  1. 对Vue组件进行服务器端渲染(SSR)
  2. 在服务器端产出静态资源,包括JS、CSS、图片等
  3. 配置服务器,渲染页面
  4. 配置客户端,将静态资源添加到客户端

VueSSR的详细配置

步骤一:对Vue组件进行服务器端渲染(SSR)

对于Vue组件进行服务器端渲染(SSR)的方式是使用Vue.js提供的一个服务器端渲染的中间件:vue-server-renderer。

// 获取Vue应用
const app = express();
// 创建一个renderer
const renderer = require('vue-server-renderer').createRenderer({
  template: require('fs').readFileSync('./index.html', 'utf-8')
})
// 创建Vue实例进行渲染
const vm = new Vue({
  data: {
    title: 'Vue SSR Demo'
  },
  template: '<div>{{ title }}</div>'
})
// 获取到Vue实例渲染后的html文件
const html = renderer.renderToString(vm)

步骤二:在服务器端产出静态资源,包括JS、CSS、图片等

Vue SSR在服务器端进行了组件解析和渲染,需要将组件解析后的HTML、JS、CSS以及图片等静态资源都打包到HTML中。

// 创建一个服务端渲染器
const renderer = createRenderer({
  template: fs.readFileSync(
    path.resolve(__dirname, '../index.template.html'),
    'utf-8'
  )
})
// 设置正确的文件路径来获取正确地址的静态资源
server.use('/dist', express.static(path.join(__dirname, '../dist')))
// 获取HTML模板
const template = fs.readFileSync(
  path.resolve(__dirname, '../index.template.html'),
  'utf-8'
)
// 生成一个renderer
const renderer = createRenderer({ template })
// 获取到路由
const router = createRouter()
// 服务端渲染函数
function renderToString (context) {
  return new Promise((resolve, reject) => {
    renderer.renderToString(context, (err, html) => {
      err ? reject(err) : resolve(html)
    })
  })
}

步骤三:配置服务器,渲染页面

Serverside.js文件,启动服务器,将Vue组件渲染成HTML,添加到路由中进行展示。

// renderToString
import { createApp } from './app'
import { renderToString } from '@vue/server-renderer'
const express = require('express')
const fs = require('fs')
const path = require('path')
const server = express()
// 定义HTML模板
const indexHTML = ({ app, html, state }) => `
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Vite App</title>
</head>
<body>
  <div id="app">${html}</div>
  <script>window.__INITIAL_STATE__ = ${JSON.stringify(state)}</script>
  <script type="module" src="/src/main.server.js"></script>
</body>
</html>`
server.use('/assets', express.static(path.join(__dirname, 'assets')))
server.get('*', async (req, res) => {
  const { app, store } = createApp()
  const url = req.url
  const routerMatch = router.getMatchedComponents(url)
  try {
    const html = await renderToString(app)
    const state = store.getState()
    if (!routerMatch.length) {
      res.status(404).end('Page not found')
      return
    }
    res.status(200).end(indexHTML({
      app: html,
      state,
      url
    }))
  } catch (err) {
    console.error(err)
    res.status(500).end('Internal Server Error')
  }
})
server.listen(3000, () => {
  console.log(`Server listening at http://localhost:3000`)
})

步骤四:配置客户端,将静态资源添加到客户端

客户端存在一个Vue初始化的过程,在此过程中需要从之前服务器端渲染传入的state中恢复上一次的数据,并将服务器端渲染的HTML挂载到客户端的DOM上面并进行事件注册。

// entry-client.js中初始化Vue,并在初始化时使用之前服务器端渲染传入的state数据
import { createApp } from './app'
const { app, store } = createApp(window.__INITIAL_STATE__)
app.mount('#app')

示例

以下为VueSSR的一个简单示例:

实例1:(https://github.com/vuejs/vue-hackernews-2.0)

实例2:(https://github.com/fionichia/notes-on-ssr)

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:关于VueSSR的一些理解和详细配置 - Python技术站

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

相关文章

  • vue项目中的支付功能实现(微信支付和支付宝支付)

    下面是关于Vue项目中实现微信支付和支付宝支付的完整攻略。 简介 在Vue项目中需要实现支付功能,常见的方式有微信支付和支付宝支付。微信支付目前还需要申请微信支付商户号,而支付宝支付可以使用支付宝开放平台提供的接口实现。 在项目中可以将支付功能实现为一个组件,以便在需要支付的地方引入使用。 微信支付 微信支付需要完成以下步骤: 申请微信支付商户号; 在项目中…

    Vue 2023年5月27日
    00
  • 基于vue+uniapp直播项目实现uni-app仿抖音/陌陌直播室功能

    下面是关于“基于vue+uniapp直播项目实现uni-app仿抖音/陌陌直播室功能”的完整攻略: 准备工作 在开始开发之前,需要完成以下准备工作: 安装node.js环境 安装Vue CLI命令行工具 安装uni-app框架 创建项目 使用Vue CLI命令行工具创建uni-app项目: vue create -p dcloudio/uni-preset-…

    Vue 2023年5月27日
    00
  • 实例讲解vue源码架构

    实例讲解Vue源码架构 本文将全面讲解Vue源码架构,包括Vue的整体架构、编译器、响应式系统和虚拟DOM。我们将会借助示例代码来详细讲解。本文假设你已经掌握了Vue的基础使用方法和概念。 Vue的整体架构 Vue的整体架构分为五个模块: 编译器:将模板转化为渲染函数,也包括AST树的生成和优化。 响应式系统:为data数据属性提供get/set方法,并且有…

    Vue 2023年5月28日
    00
  • uni-app微信小程序使用echarts的详细图文教程

    针对“uni-app微信小程序使用echarts的详细图文教程”,我给出下面的攻略: uni-app微信小程序使用echarts的详细图文教程 前言 uni-app是一个跨平台开发框架,可使用一套代码快速开发出各种应用,包括微信小程序。而echarts则是一款强大的可视化图表库,支持多种图表类型,且功能丰富。将它们结合使用,可以快速的实现数据可视化,提高用户…

    Vue 2023年5月27日
    00
  • VUE渲染后端返回含有script标签的html字符串示例

    讲解 “VUE渲染后端返回含有script标签的html字符串示例” 的完整攻略如下: 问题描述 当在Vue应用程序中通过Ajax请求后端并返回一个包含 script 标签的 HTML 字符串时,Vue在解析这段字符串并渲染在 DOM 中时,由于这段 HTML 字符串中的代码被当作文本节点处理,导致 script 标签内的 JavaScript 代码不会被执…

    Vue 2023年5月27日
    00
  • jenkins+docker+nginx+nodejs持续集成部署vue前端项目

    Jenkins+Docker+nginx+nodejs持续集成部署Vue前端项目 概述 这篇攻略主要讲解如何使用Jenkins、Docker、nginx和nodejs实现持续集成和部署Vue前端项目。下文将对Jenkins、Docker、nginx以及nodejs的相关概念、安装和使用作详细的介绍,并通过两个示例说明如何实现持续集成和部署。 Jenkins简…

    Vue 2023年5月29日
    00
  • Vue.js实战之组件之间的数据传递

    Vue.js是一个流行的JavaScript框架,其中组件是Vue.js中最重要的概念之一。在组件化开发中,组件是可重用的代码块,它们通常具有自己的状态和行为,并且可以相互交互。在本文中,我们将探讨Vue.js中组件之间的数据传递。 父组件向子组件传递数据 在Vue.js中,父组件可以通过props向子组件传递数据。props是子组件接收的属性,可以像下面这…

    Vue 2023年5月28日
    00
  • Vue filter 过滤当前时间 实现实时更新效果

    Vue中可以通过过滤器(Filter)来对模板中的数据进行格式化处理。本文将介绍如何使用Vue filter来过滤当前时间,并实现实时更新效果的方法。 添加全局过滤器 首先我们需要在Vue实例中添加全局过滤器。在Vue中,可以通过 Vue.filter() 方法来添加全局过滤器。下面是一个简单的例子,这个过滤器会将传入的字符串全部转换为大写: Vue.fil…

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