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

yizhihongxing

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日

相关文章

  • Vue设置select下拉框的默认选项详解(select空白bug解决)

    下面我将为你详细讲解如何设置 Vue 的 select 下拉框的默认选项,以及如何解决 select 空白 bug 的问题。 问题描述 在 Vue 中,我们经常使用 select 下拉框作为表单元素,但有时会发现设置默认选项时出现了问题,即选项无法正确显示或者显示为空白。原因是因为 Vue 对 select 组件的渲染机制和 HTML 不同,需要我们手动设置…

    Vue 2023年5月28日
    00
  • vue3-HTTP请求方式

    下面是关于Vue3中HTTP请求方式的详细讲解: 1. 介绍 在Vue3中,可以使用多种方式来进行HTTP请求。其中,Vue3推荐使用axios库来进行HTTP请求。 2. 安装axios 在使用axios之前,需要先安装axios库。可以使用以下命令进行安装: npm install axios 3. 发送HTTP请求 3.1 GET请求 在Vue3中,可…

    Vue 2023年5月28日
    00
  • ES6知识点整理之Proxy的应用实例详解

    ES6知识点整理之Proxy的应用实例详解 什么是Proxy Proxy是ES6中新增的一个用于拦截外部对对象的访问和改变操作的API,可以对目标对象进行劫持、代理和拦截。在Proxy对象被使用时,会对基础的API进行拦截,以达到监控、控制和修改其行为的目的。 Proxy的基本用法 当我们使用Proxy的时候,可以使用以下语法构造一个Proxy对象: let…

    Vue 2023年5月28日
    00
  • vue3.2自定义弹窗组件结合函数式调用示例详解

    下面我来详细讲解“vue3.2自定义弹窗组件结合函数式调用示例详解”的完整攻略。 1. 简介 在Vue3.2中,我们可以通过自定义弹窗组件来方便地实现页面弹窗的功能,并且通过函数式调用的方式来减少对全局状态的依赖。 2. 自定义弹窗组件 首先,我们需要创建一个自定义的弹窗组件。可以使用Vue3的defineComponent函数来定义组件,代码如下: imp…

    Vue 2023年5月28日
    00
  • 15分钟学会vue项目改造成SSR(小白教程)

    下面是关于“15分钟学会vue项目改造成SSR(小白教程)”的完整攻略。 什么是SSR? SSR(Server Side Rendering)即服务端渲染,根据服务端返回的数据,在服务端生成HTML字符串,然后将其发送给客户端进行展示。与传统的SPA(Single Page Application)相比,SSR能够优化页面的SEO和首屏加载速度。 如何将Vu…

    Vue 2023年5月27日
    00
  • vue.js开发环境安装教程

    Vue.js开发环境安装教程 Vue.js是一个用于构建用户界面的渐进式的JavaScript框架。在开始开发Vue.js应用程序之前,必须安装Vue.js开发环境。本文将介绍如何安装Vue.js,以便能够使用该框架构建Web应用程序。 步骤1:安装Node.js Node.js是JavaScript运行时环境。Vue.js需要Node.js才能运行。因此,…

    Vue 2023年5月28日
    00
  • Vue加载组件、动态加载组件的几种方式

    当使用Vue框架进行开发时,可能会遇到需要动态加载组件的情况。Vue框架提供了一些方式来满足这种需求。 加载组件的几种方式 1. 直接注册组件 Vue框架提供了全局注册和局部注册两种方式。 1.1 全局注册方式 在全局注册中,通过 Vue.component() 方法注册组件。这种方式适用于组件会在项目的不同位置多次使用。 // 定义组件: todo-lis…

    Vue 2023年5月29日
    00
  • 基于vue,vue-router, vuex及addRoutes进行权限控制问题

    接下来我将为你详细讲解基于vue、vue-router、vuex及addRoutes进行权限控制的完整攻略。 理论基础 在进行权限控制前,需要先建立一些理论基础。在Web应用中,常见的权限控制方式有三种: 基于角色的访问控制(Role-Based Access Control, RBAC):将角色赋予用户或用户组,并将角色与资源进行关联,从而控制用户对资源的…

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