从0到1构建vueSSR项目之node以及vue-cli3的配置

yizhihongxing

我来详细讲解一下“从0到1构建Vue SSR项目之Node以及Vue CLI3的配置”这个话题。

总体流程

从0到1构建Vue SSR项目,其总体流程如下:

  1. 初始化项目
  2. 安装必要的依赖
  3. 配置webpack
  4. 配置Vue SSR
  5. 编写Vue SSR相关代码
  6. 启动项目

接下来,我将逐步详细讲解这个过程。

初始化项目

首先,我们需要使用Vue CLI 3进行项目初始化,这个过程非常简单,只需要执行以下命令:

vue create my-vue-ssr-project

其中,my-vue-ssr-project为项目名称,可以根据实际情况进行修改。在初始化项目的过程中,我们需要选择一些配置,这里推荐选择Manually select features,然后按照需要来选择所需的功能。

安装必要的依赖

在项目初始化完成之后,我们需要安装一些必要的依赖,具体依赖如下:

  • vue-server-renderer
  • express
  • webpack-node-externals
  • lodash

其中,vue-server-renderer是用于Vue SSR的核心依赖;express是一个常用的Node.js web框架;webpack-node-externals是用于排除Node.js中不需要webpack处理的模块;lodash是一个JavaScript实用库,提供了很多常用的函数和工具。

在安装这些依赖之前,需要先切换到项目的根目录下:

cd my-vue-ssr-project

然后执行以下命令来安装这些依赖:

npm install vue-server-renderer express webpack-node-externals lodash

配置webpack

接下来,我们需要对webpack进行一些配置,以使其能够正确地打包Vue SSR应用程序。这里,我们需要创建一个专门用于SSR的webpack配置文件,命名为webpack.server.js

下面是一个示例webpack配置文件,用于打包Vue SSR应用程序:

const path = require('path')
const webpackNodeExternals = require('webpack-node-externals')

module.exports = {
  target: 'node',
  entry: './src/entry-server.js',
  output: {
    filename: 'server-bundle.js',
    path: path.resolve(__dirname, 'dist'),
    libraryTarget: 'commonjs2'
  },
  module: {
    rules: [
      {
        test: /\.vue$/,
        loader: 'vue-loader'
      },
      {
        test: /\.jsx?$/,
        loader: 'babel-loader'
      }
    ]
  },
  externals: webpackNodeExternals({
    whitelist: [/\.css$/]
  })
}

在这个示例webpack配置中,主要包含以下几个部分:

  • target:指定编译目标为node,以使webpack能够正确地编译Node.js代码。
  • entry:指定入口文件为./src/entry-server.js,这个文件将处理所有SSR相关逻辑。
  • output:指定输出配置,包括打包后文件名、输出目录以及库类型。
  • module:配置webpack加载器,以支持Vue文件和JSX语法。
  • externals:排除Node.js中不需要webpack处理的模块。

配置Vue SSR

在webpack配置完成之后,我们需要对Vue SSR进行一些配置,以便在Node.js环境中正确地运行。

首先,我们需要创建一个专门处理SSR的文件,命名为entry-server.js。这个文件的主要作用是对Vue应用程序进行服务端渲染,并输出HTML字符串。

接下来是一个示例文件,用于处理Vue SSR相关逻辑:

import { createApp } from './app'

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

    router.push(context.url)

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

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

      Promise.all(matchedComponents.map(component => {
        if (component.asyncData) {
          return component.asyncData({
            store,
            route: router.currentRoute
          })
        }
      })).then(() => {
        context.state = store.state
        resolve(app)
      }).catch(reject)
    }, reject)
  })
}

在这个示例代码中,我们主要执行以下几个关键步骤:

  • 创建Vue应用程序实例
  • 根据请求的URL,设置Vue路由实例的当前路由
  • 等待所有异步数据获取完毕,确保状态已经渲染到应用程序中
  • 最后返回Vue应用程序实例

编写Vue SSR相关代码

在对Vue SSR进行配置之后,我们需要编写Vue SSR代码,以便在Node.js环境中正确地运行起来。

首先,我们需要修改Vue应用程序入口文件src/main.js,以便它能够正确地在浏览器和Node.js环境中运行。具体的修改如下:

import Vue from 'vue'
import App from './App.vue'
import { createRouter } from './router'

// 导出一个工厂函数,用于创建新的应用程序、路由和存储实例
export function createApp () {
  const router = createRouter()

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

  return { app, router }
}

在这个修改之后,我们的Vue应用程序就已经能够支持SSR了。

接下来,我们需要创建一个专门用于处理SSR请求的文件,命名为server.js

const express = require('express')
const fs = require('fs')
const path = require('path')
const bodyParser = require('body-parser')
const { createBundleRenderer } = require('vue-server-renderer')
const serverBundle = require('./dist/server-bundle.json')
const template = fs.readFileSync('./public/index.html', 'utf-8')
const port = process.env.PORT || 3000

const app = express()
const renderer = createBundleRenderer(serverBundle, {
  runInNewContext: false,
  template: template,
  clientManifest: null
})

app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())

app.use(express.static(path.join(__dirname, 'dist')))

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

  renderer.renderToString(context, (err, html) => {
    if (err) {
      console.error(err)
      res.status(500).send('Internal Server Error')
    } else {
      const outputHtml = template
        .replace(`<div id="app"></div>`, `<div id="app">${html}</div>`)
        .replace(`Vue SSR Boilerplate`, context.title)
      res.setHeader('Content-Type', 'text/html')
      res.send(outputHtml)
    }
  })
})

app.listen(port, () => {
  console.log(`server started at localhost:${port}`)
})

在这个文件中,我们主要执行以下几个关键步骤:

  • 首先,我们导入必要的依赖,包括expressfspath等。
  • 然后,我们使用vue-server-renderercreateBundleRenderer函数创建一个渲染器,加载上一步中打包生成的server-bundle.js文件。
  • 为了支持动态路由,我们需要创建一个路由捆绑的上下文(context object)。
  • 最后,使用express作为服务器,处理所有的SSR请求,并将SSR渲染后的结果输出发给客户端。

启动项目

最后,在所有配置完成之后,我们可以通过以下命令来启动我们的Vue SSR应用程序:

node server.js

在启动成功之后,我们就可以在浏览器中访问http://localhost:3000,看到我们的Vue SSR应用程序已经成功运行了。

示例

这是一个简单的基于Vue SSR的示例应用程序,提供了三个页面:

  1. 首页:显示一些静态内容。
  2. 用户列表页:使用axios从后台API获取数据,显示用户列表。
  3. 用户详情页:根据路由参数,使用axios从后台API获取数据,显示用户详情信息。

这是一个完整的Vue SSR应用程序,你可以在GitHub上找到它的源代码:https://github.com/zhinyang/vue-ssr-demo。

另外,Vue官方也提供了一个完整的Vue SSR示例项目,你可以在这里找到它的源代码:https://github.com/vuejs/vue-hackernews-2.0。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:从0到1构建vueSSR项目之node以及vue-cli3的配置 - Python技术站

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

相关文章

  • Android面向切面基于AOP实现登录拦截的场景示例

    下面我来为您详细讲解“Android面向切面基于AOP实现登录拦截的场景示例”的完整攻略。 什么是AOP AOP(Aspect Oriented Programming),面向切面编程,是一种编程范式,它旨在解决开发中的横切关注点问题。横切关注点是指在整个应用中有多个不同的模块都需要共同解决的问题,比如日志、事务、缓存等。AOP可以帮助我们把这些横切关注点从…

    Vue 2023年5月28日
    00
  • 在Vue中实现添加全局store

    下面给您详细讲解在Vue中实现添加全局store的完整攻略: 步骤一:在Vue中创建store实例 在Vue中,我们可以使用Vuex来实现全局store功能,因此首先需要在Vue项目中安装并引用Vuex库: npm install vuex –save 在Vue项目中引用Vuex库: import Vuex from ‘vuex’ Vue.use(Vuex…

    Vue 2023年5月27日
    00
  • 详解前后端分离之VueJS前端

    前后端分离是现代web开发中非常流行的一种技术架构,该架构将前端与后端分离开来,前端负责展示数据,后端只负责提供数据接口。VueJS是一种流行的前端JS框架,本文将从如何搭建VueJS前端的角度来详解前后端分离架构的实现。 步骤一:安装VueJS及相关依赖 在搭建VueJS前端之前,需要先安装好VueJS及相关依赖。在命令行中输入以下命令: npm inst…

    Vue 2023年5月27日
    00
  • Vue 通过公共字段,拼接两个对象数组的实例

    要完成“Vue 通过公共字段,拼接两个对象数组”的操作,可以使用Vue中的计算属性来实现。 在Vue实例的data中定义两个对象数组: data: { arr1: [ { id: 1, name: ‘A’, age: 20 }, { id: 2, name: ‘B’, age: 22 }, { id: 3, name: ‘C’, age: 18 }, ], …

    Vue 2023年5月27日
    00
  • Vue中的事件处理详情

    接下来我将为你讲解Vue中的事件处理详情的完整攻略。 一、Vue中的事件处理 在Vue中,事件处理是一个非常重要的概念,这里我们主要讲解如何使用Vue来绑定事件和监听事件。 1. 绑定事件 在Vue中,我们可以使用v-on:或@来绑定事件,其方式如下所示: <!–以下代码为html模板–> <button v-on:click=&quo…

    Vue 2023年5月27日
    00
  • 简单理解vue中el、template、replace元素

    当我们使用Vue构建单页面应用,就会使用到Vue中的三个元素:el、template和replace。这三个元素常常因为其作用而被混淆,下面我将详细讲解它们的具体作用,同时会给出相应的代码示例。 el元素 el元素是Vue实例挂载的一个元素,也相当于Vue实例所控制的一个DOM元素。el元素可以是一个CSS选择器,也可以是一个实际的DOM元素。通过el元素,…

    Vue 2023年5月28日
    00
  • Vue使用$set和$delete操作对象属性

    在Vue中,使用$set和$delete方法可以操作对象属性。有时候,我们需要动态地添加一个属性到一个已经存在的对象上或删除对象中的某一个属性。默认情况下,Vue无法检测到对象属性的变化,因为Vue只能检测到对象已经存在的属性的变化。但如果使用$set和$delete方法来改变对象属性,Vue就可以监听到属性的变化并动态更新视图。 1. $set操作对象属性…

    Vue 2023年5月28日
    00
  • vue源码学习之Object.defineProperty 对数组监听

    下面我来为您介绍一下“Vue源码学习之Object.defineProperty对数组监听”的攻略。 1. Object.defineProperty的基本用法 首先,我们来了解一下Object.defineProperty的基本用法及其作用。 Object.defineProperty是ES5新增的一个API,它可以用来精确添加或修改对象的属性。该方法将直…

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