浅谈Vue SSR中的Bundle的具有使用

Vue SSR中的Bundle是指打包包含服务端和客户端代码的文件,在服务器端生成HTML时将其注入页面中并携带客户端代码。这样做的好处在于针对不同的用户使用不同的请求路径,服务端就可以通过Bundle调用不同的组件,从而生成相应的HTML页面,提升页面的渲染速度和用户体验。

具体步骤如下:

1. 安装依赖

npm install --save vue vue-server-renderer express axios

其中,vuevue-server-renderer是Vue SSR所必需的依赖。

2. 创建组件

假设我们创建了一个名为App.vue的根组件。该组件中需要包含一些服务端渲染所需的特殊属性,如data方法、asyncData方法和template属性等。这里不再赘述,可以查看Vue SSR官方文档。

3. 创建入口文件

在入口文件中,会将服务端bundle和客户端bundle合并生成一个文件。服务端 bundle 将在服务器端执行,客户端 bundle 将在浏览器中执行。例如,以下是一个 entry-server.js 文件:

import createApp from './app.js'

export default context => {
  return new Promise(async (resolve, reject) => {
    const { app, router, store } = createApp(context)

    router.push(context.url)

    router.onReady(() => {
      const matchedComopnents = router.getMatchedComponents()

      if (!matchedComopnents.length) {
        return reject({ code: 404 })
      }

      Promise.all(matchedComopnents.map(Component => {
        if (Component.asyncData) {
          return Component.asyncData({
            store,
            route: router.currentRoute
          })
        }
      })).then(() => {
        context.state = store.state

        resolve(app)
      }).catch(reject)
    }, reject)
  })
}

4. 创建客户端入口文件

在客户端入口文件中,需要调用 createApp 方法来初始化 Vue 实例,并使用 hydrate 方法来将服务端生成的 HTML 进行激活,将 Vue 实例挂载到 DOM 中。以下是一个示例:

import Vue from 'vue'
import createApp from './app'

Vue.config.productionTip = false

const { app, router, store } = createApp()

if (window.__INITIAL_STATE__) {
  store.replaceState(window.__INITIAL_STATE__)
}

router.onReady(() => {
  app.$mount('#app')
})

5. 创建服务端模板

在生成服务端HTML时,我们需要使用一个模板文件。该文件需要包含预先定义好的根元素,该元素将作为 Vue 实例挂载的目标。文件内容如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>{{title}}</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  {{{ meta }}}
</head>
<body>
  {{ APP }}
  {{{ state }}}
  {{{ style }}}
  {{{script }}}
</body>
</html>

在模板文件中,我们使用双花括号和3个大括号来插入数据。其中,{{ }}表示对应的变量需要进行HTML转码;而{{{ }}}则表示对应的变量不需要进行HTML转码。

6. 服务器端设置

我们需要在服务器端设置路由响应,并根据路由响应生成HTML。以下是一个使用Express的示例:

import express from 'express'
import Vue from 'vue'
import serverRenderer from 'vue-server-renderer'
import fs from 'fs'
import path from 'path'

const app = express()

const serverBundlePath = '../dist/server.bundle.js'
const clientManifestPath = '../dist/client-manifest.json'

const serverBundle = require(serverBundlePath)
const clientManifest = require(clientManifestPath)

const template = fs.readFileSync(path.resolve(__dirname, '../dist/index.html'), 'utf-8')

const renderer = serverRenderer.createBundleRenderer(serverBundle, {
  clientManifest,
  template,
  inject: false
})

server.get('*', (req, res) => {
  const context = {
    title: 'Vue SSR demo',
    url: req.url
  }

  renderer.renderToString(context, (err, html) => {
    if (err) {
      res.statusCode = 500
      res.end('Internal Server Error')
    } else {
      res.send(html)
    }
  })
})

server.listen(8080, () => {
  console.log(`server stared at http://localhost:8080`)
})

这里,我们读取生成的服务端 bundle,客户端清单,模板以及一些其他配置,然后使用服务端渲染器来生成HTML响应。

以上是一个基于Express的Vue SSR的完整攻略。以下是两个示例分别介绍了客户端加载异步数据和使用Vuetify组件库:

示例1:加载异步数据

在组件中定义一个异步函数,通过使用服务端渲染器的 renderToString 自动调用该方法,获取异步数据,并将其赋值到服务端渲染上下文中。

asyncData ({ store, route }) {
  return axios.get('http://some-api.example.com/data').then((res) => {
    store.commit('setAsyncData', res.data)
  })
}

其中,setAsyncData为在store中定义的 mutation 函数。

示例2:使用Vuetify组件库

在Vue SSR中使用第三方组件库并不需要有什么特别的代码,只需要将组件库的代码适配到Vue SSR环境下即可。以下是基于Vuetify组件库的示例:

// main.js

import Vue from 'vue'
import createApp from './app'
import Vuetify from 'vuetify'
import 'vuetify/dist/vuetify.min.css'

Vue.use(Vuetify)
const vuetify = new Vuetify()

const { app, router, store } = createApp()

router.onReady(() => {
  app.$mount('#app')
})

具体的Vuetify组件使用方式可以查看Vuetify官方文档。

以上是Vue SSR中Bundle的使用攻略以及两个示例。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈Vue SSR中的Bundle的具有使用 - Python技术站

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

相关文章

  • 详解Vuex的属性和作用

    以下是“详解Vuex的属性和作用”的完整攻略。 什么是Vuex Vuex是一个专门为Vue.js设计的状态管理库。Vuex集中式存储管理了整个应用的状态,并以相应的规则保证状态以一种可预测的方式发生变化。 Vuex的核心概念 Vuex中包括了5个核心概念: state 它表示保存整个应用状态的对象。初始状态可以在这里定义,并且它可以包含很多的属性。 gett…

    Vue 2023年5月28日
    00
  • 简单了解vue 插值表达式Mustache

    下面是“简单了解vue 插值表达式Mustache”的完整攻略。 插值表达式Mustache 在Vue.js中,使用Mustache语法(双大括号,即{{}})可以用于实现对数据的简单渲染,这种方式被称为插值表达式Mustache。在Vue实例中使用Mustache语法可以对绑定到数据的值进行渲染,即实现数据与视图的绑定。 基本使用 使用插值表达式Musta…

    Vue 2023年5月27日
    00
  • Vue.set()和this.$set()使用和区别

    Vue.js是一款流行的JavaScript框架,提供了许多便利的方法来管理及操作我们的应用程序。其中Vue.set()和this.$set()方法是非常重要的,可以在Vue.js中非常方便地实现响应式数据的创建和更新。 Vue.set()与this.$set()的使用 Vue.set() Vue.set()是Vue.js中的全局函数,可以通过在组件实例中使…

    Vue 2023年5月28日
    00
  • Vue2.0实现购物车功能

    Vue2.0实现购物车功能的攻略可以分为以下几个步骤: 第一步:创建一个Vue实例 首先,我们需要在页面上引入Vue.js的库文件,并创建一个Vue实例。 <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <div id=…

    Vue 2023年5月27日
    00
  • vue实现双向数据绑定

    实现双向数据绑定是Vue.js的重要特性之一,也是Vue.js能够快速开发Web应用程序的重要原因。下面是基于Vue.js实现双向数据绑定的完整攻略。 Vue.js实现双向数据绑定的原理 Vue.js中的双向数据绑定,是通过使用数据劫持(Data Observer)和发布-订阅模式(Pub/Sub Pattern)的组合来实现的。 具体来说,Vue.js会对…

    Vue 2023年5月28日
    00
  • vue配置启动项目自动打开浏览器方式

    下面我将详细讲解如何在Vue项目中配置启动后自动打开浏览器的方法。 步骤 1:安装依赖包 首先要在项目中安装一个依赖包 opn,这个包可以在 Node.js 中打开网址或者文件。我们可以在控制台中使用以下命令: npm install opn –save-dev 步骤 2:在 package.json 中配置启动脚本 我们需要在 package.json …

    Vue 2023年5月28日
    00
  • mpvue 项目初始化及实现授权登录的实现方法

    mpvue 项目初始化及实现授权登录的实现方法 简介 mpvue 是基于 Vue.js 的小程序开发框架,使我们可以使用 Vue.js 的语法来开发小程序,同时支持快速构建项目以及各种插件。授权登录是小程序中必不可少的一部分,本文将讲解如何使用 mpvue 实现授权登录。 前置条件 了解 Vue.js 和小程序,了解基本的前端开发知识 安装并配置好小程序开发…

    Vue 2023年5月27日
    00
  • Vue3 中的插件和配置推荐大全

    Vue3 中的插件和配置推荐大全 一、插件 1. Vue Router Vue Router 是 Vue.js 官方的路由管理器。它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌。 在 Vue3 中,Vue Router 也进行了更新,现在使用 createRouter 方法来替代之前的 new VueRouter 方法。 示例代码: imp…

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