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

我来详细讲解一下“从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日

相关文章

  • vue中使用file-saver导出文件的全过程记录

    下面我将为您详细讲解在Vue中使用file-saver导出文件的全过程记录。 1. 安装file-saver 首先需要安装file-saver依赖库,可以使用npm进行安装: npm install file-saver –save-dev 2. 创建可导出的文件 创建一个用于导出的文件,例如 exportFile.js。在该文件中使用file-saver…

    Vue 2023年5月27日
    00
  • vue一步到位的实现动态路由

    实现动态路由的过程中,我们需要完成以下几个步骤: 定义路由表 动态注册路由 处理404页面 下面我们就来具体分析一下这三个步骤。 步骤一:定义路由表 我们首先需要定义一个路由表,其中包含了所有的页面路径以及对应的组件,它可以在一个独立的模块中定义。以一个示例项目为例,我们可以定义一个 routes 文件,如下: export default [ { path…

    Vue 2023年5月27日
    00
  • 值得收藏的vuejs安装教程

    接下来我将为您详细讲解“值得收藏的Vue.js安装教程”的完整攻略。 标题 一、下载Node.js 在安装Vue.js前,需要下载Node.js。你可以在Node.js官网下载最新版本的Node.js。 二、安装Vue.js 打开命令行(cmd),输入以下命令安装Vue.js: npm install vue 安装成功后,在命令行窗口中输入以下命令确认是否安…

    Vue 2023年5月28日
    00
  • 微信小程序实战基于vue2实现瀑布流的代码实例

    为了更好地讲解微信小程序实战基于vue2实现瀑布流的代码实例,我们可以按照以下步骤展开: 1. 准备工作 首先需要在本地安装 Vue-cli 和 Weex-toolkit,打开命令行窗口,输入以下命令进行安装。 npm install -g vue-cli npm install -g weex-toolkit 2. 创建项目 接着,在命令行窗口中输入以下命…

    Vue 2023年5月27日
    00
  • vue组件生命周期钩子使用示例详解

    Vue组件生命周期钩子使用示例详解 在Vue组件的生命周期中,每个实例会从创建、挂载、更新、销毁四个不同的阶段。在这些不同的阶段中,我们可以通过使用生命周期钩子函数来控制组件的行为。本文将详细讲解Vue组件生命周期钩子函数的使用方法,并通过示例代码介绍其具体应用。 Vue组件生命周期钩子函数 Vue组件生命周期可以分为8个阶段,每个阶段都有对应的生命周期钩子…

    Vue 2023年5月27日
    00
  • vue跨域问题:Access to XMLHttpRequest at‘httplocalhost解决

    跨域问题指的是在同源策略下,浏览器禁止向不同源地址发送请求,这是为了保证客户端数据的安全性。而Vue.js作为常用的前端框架,在与后台服务进行交互时,就需要面对跨域问题。 下面,我们就来详细讲解一下“Vue跨域问题:Access to XMLHttpRequest at ‘http://localhost’解决”的完整攻略。 什么是跨域问题 跨域问题是浏览器…

    Vue 2023年5月27日
    00
  • Vue3从0搭建Vite打包组件库使用详解

    下面我将详细讲解“Vue3从0搭建Vite打包组件库使用详解”的完整攻略。 如何搭建 步骤一:安装Vue CLI 首先安装 Vue CLI。打开终端并运行以下命令: npm install -g @vue/cli 步骤二:创建Vue项目 生成一个新的Vue项目,安装 Vue Router 和 Vuex。进入项目路径,执行以下命令: vue create my…

    Vue 2023年5月29日
    00
  • Vue实现插槽下渲染dom字符串的使用

    当我们在使用Vue时,我们经常会用到插槽,它可以让我们在组件中定义一些可重用的模板代码。然而,有时候我们需要在插槽中插入一些动态生成的DOM字符串,Vue并没有提供直接的方式来完成这个操作,此时我们可以使用v-html指令和render函数来实现。 使用v-html指令 使用v-html指令可以将一个字符串作为HTML代码进行渲染,这个过程和在模板中使用双括…

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