vue ssr 指南详读

Vue SSR指南详读攻略

什么是Vue SSR?

Vue SSR是指Vue.js在服务端渲染(Server Side Rendering)时所使用的技术。服务端渲染是一种将Vue实例渲染成HTML字符串最后将其发到客户端的技术,这意味着在客户端浏览器解析JavaScript之前,网页的主要内容已经准备好了并呈现出来。通过服务端渲染,可以提升网页的首屏加载速度和SEO友好性。

Vue SSR的优势

  1. 提升首屏加载速度,提升用户体验
  2. 更好的SEO优化效果
  3. 从服务端数据获取渲染,而不是依赖客户端渲染
  4. 更好的利用服务器资源,减轻客户端压力

Vue SSR的流程

  1. 服务端接收请求,根据请求路由确定渲染组件
  2. 渲染组件获取服务端数据,并将其传递给组件
  3. 组件使用数据渲染,生成HTML字符串
  4. HTML字符串返回给客户端

Vue SSR的局限性

  1. 需要额外的服务器资源去渲染HTML
  2. 在某些情况下不易实现(例如高交互的单页面应用)

Vue SSR的实现

Vue SSR除了需要前端框架Vue.js的基础知识之外,还需要具备Node.js、Webpack、Express等技术栈的相关知识。具体实现流程如下:

  1. 使用vue-server-renderer插件将组件转换成HTML字符串
  2. 使用Node.js搭建服务器,将HTML字符串返回给客户端
  3. 配置Webpack对服务端组件进行打包
  4. 配置服务器路由,确定哪个请求对应哪个组件

示例一:服务器渲染组件

以下示例使用Vue.js和Express实现服务器渲染。

  1. 创建Vue组件,并命名为“App”:
<template>
  <div>
    <h1>{{ title }}</h1>
    <p>{{ description }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      title: 'Vue SSR',
      description: 'Vue Server Side Rendering'
    }
  }
}
</script>
  1. 构建服务器端渲染代码
const express = require('express')
const Vue = require('vue')
const server = express()
const renderer = require('vue-server-renderer').createRenderer()

server.get('/', (req, res) => {
  const app = new Vue({
    template: '<div>My App</div>'
  })

  renderer.renderToString(app, (err, html) => {
    if (err) {
      res.status(500).end('Internal Server Error')
      return
    }
    res.end(`
      <!DOCTYPE html>
      <html>
        <head><title>Hello World!</title></head>
        <body>${html}</body>
      </html>
    `)
  })
})

server.listen(8000)
  1. 运行服务器端代码,在浏览器中访问localhost:8000可以看到输出结果。

示例二:在Vue.js应用中使用SSR

以下示例使用Vue.js和Webpack实现在Vue.js应用中使用SSR。

  1. 安装相关依赖:
npm install vue vue-server-renderer express webpack webpack-dev-middleware webpack-hot-middleware
  1. 创建Vue组件,并命名为“App”:
<template>
  <div>
    <h1>{{ title }}</h1>
    <p>{{ description }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      title: 'Vue SSR',
      description: 'Vue Server Side Rendering'
    }
  }
}
</script>
  1. 创建Webpack配置文件(webpack.config.js):
const VueLoaderPlugin = require('vue-loader/lib/plugin')
const VueSSRServerPlugin = require('vue-server-renderer/server-plugin')
const path = require('path')

const webpackConfig = {
  mode: process.env.NODE_ENV === 'production' ? 'production' : 'development',
  entry: './src/entry-server.js',
  target: 'node',
  output: {
    path: path.resolve(__dirname, './dist'),
    filename: 'server-bundle.js',
    libraryTarget: 'commonjs2'
  },
  module: {
    rules: [
      {
        test: /\.vue$/,
        loader: 'vue-loader'
      },
      {
        test: /\.js$/,
        loader: 'babel-loader'
      }
    ]
  },
  plugins: [
    new VueLoaderPlugin(),
    new VueSSRServerPlugin()
  ]
}

module.exports = webpackConfig
  1. 创建Webpack客户端配置文件(webpack.config.client.js):
const path = require('path')
const webpack = require('webpack')
const HtmlWebpackPlugin = require('html-webpack-plugin')

const webpackConfig = {
  mode: process.env.NODE_ENV === 'production' ? 'production' : 'development',
  entry: {
    app: './src/entry-client.js'
  },
  devServer: {
    hot: true,
    inline: true,
    progress: true,
    contentBase: path.resolve(__dirname, './dist')
  },
  output: {
    path: path.resolve(__dirname, './dist'),
    filename: '[name].js'
  },
  module: {
    rules: [
      {
        test: /\.vue$/,
        loader: 'vue-loader'
      },
      {
        test: /\.js$/,
        loader: 'babel-loader'
      }
    ]
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: 'index.html'
    }),
    new webpack.HotModuleReplacementPlugin()
  ]
}

module.exports = webpackConfig
  1. 创建服务器代码(server.js):
const express = require('express')
const server = express()
const path = require('path')

const Vue = require('vue')
const renderer = require('vue-server-renderer').createRenderer({
  template: require('fs').readFileSync(path.resolve(__dirname, './index.html'), 'utf-8')
})

const createApp = require('./src/create-app')

server.use('/dist', express.static(path.resolve(__dirname, './dist')))

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

  createApp(context).then(app => {
    renderer.renderToString(app, (err, html) => {
      if (err) {
        res.status(500).end('Internal Server Error')
        return
      }
      res.end(html)
    })
  }).catch(err => {
    console.log(err)
    res.status(500).end('Internal Server Error')
  })
})

server.listen(8000)
  1. 创建客户端入口代码(entry-client.js):
import Vue from 'vue'
import App from './App.vue'

Vue.config.productionTip = false

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

app.$mount('#app')
  1. 创建服务端入口代码(entry-server.js):
import Vue from 'vue'
import App from './App.vue'

export default context => {
  const app = new Vue({
    render: h => h(App)
  })

  return new Promise((resolve, reject) => {
    resolve(app)
  })
}
  1. 创建HTML模板文件(index.html):
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>Vue SSR</title>
  </head>
  <body>
    <div id="app"></div>
    <script src="/dist/app.js"></script>
  </body>
</html>
  1. 运行服务端代码,命令为:
npm run dev

以上命令会执行Webpack打包,然后在8000端口启动服务端应用。在浏览器中访问localhost:8000可以看到应用渲染完成的结果。

结束语

以上就是Vue SSR指南详读攻略的分享,希望能够帮助读者了解Vue SSR的相关知识和应用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue ssr 指南详读 - Python技术站

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

相关文章

  • Vue中provide、inject详解以及使用教程

    Vue中provide、inject详解以及使用教程 在Vue的组件嵌套过程中,往往需要在祖先组件中定义一些属性或变量,然后在子组件中使用。虽然可以通过props传递数据来解决问题,但是当组件嵌套层级变多时,props的传递会很繁琐。在这种情况下,Vue中的provide、inject就可以派上用场了。 provide、inject是什么? provide和…

    Vue 2023年5月27日
    00
  • 基于vue如何发布一个npm包的方法步骤

    发布一个基于 vue 的 npm 包的步骤,可以分为以下几个步骤: 1. 初始化 npm 包 npm init 按照提示依次输入各个信息,最后生成 package.json 文件。 2. 创建 vue 组件 这里以一个 Button 组件为例: <template> <button :class="classObject&quot…

    Vue 2023年5月28日
    00
  • Ant Design Vue日期组件的时间限制方式

    Ant Design Vue 是 Ant Design 在 Vue 中的实现,是一套基于 Vue 实现的高质量 UI 组件库,拥有丰富的组件和良好的设计风格,深受前端工程师的喜爱。 Ant Design Vue 提供了日期组件,我们可以通过设置时间限制方式来限定用户选择日期的范围,例如限制用户只能选择今天及今天之后的日期,或者只能选择本月份的日期等等。 下面…

    Vue 2023年5月29日
    00
  • vue webpack打包原理解析(全网最新最全)

    Vue Webpack打包原理解析 Webpack是一款优秀的模块化打包工具,它能够实现多种资源打包,并且能够和其他工具如babel等协作使用。Vue项目中也经常使用Webpack进行打包工作,下面我们来详细讲解Vue Webpack打包原理。 Webpack流程解析 Webpack的工作流程可以简单概括为:读取模块 -> 分析依赖 -> 编译打…

    Vue 2023年5月28日
    00
  • 使用vue3实现一个人喵交流小程序

    下面是使用Vue3实现一个人喵交流小程序的完整攻略。 准备工作 在开始实现之前,我们需要完成以下准备工作: 安装 Node.js(版本需>=14)以及 npm(或者使用 yarn); 在命令行中安装 Vue CLI 3:npm install -g @vue/cli。 创建项目 使用 Vue CLI 3 创建一个新的项目: vue create cat…

    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
  • JS实现的点击表头排序功能示例

    下面是详细的攻略: 什么是点击表头排序功能? 点击表头排序是一种JavaScript编写的功能,在表格中点击表头时,可以按照表头所指向的列数据的大小为依据,对表格的行进行排序的功能。 代码实现 以下是一份实现点击表头排序功能的代码示例,其中使用jQuery库和ES6箭头函数: // 获取表格 var table = $(‘table.sortable’); …

    Vue 2023年5月28日
    00
  • Vue3 Vant组件库使用过程中的避坑点

    下面是详细讲解Vue3 Vant组件库使用过程中的避坑点的完整攻略: 1. 导入组件时注意组件名称 在使用Vant组件库时,要注意组件名称的大小写问题。在Vue3中,组件名称必须采用小写字母加横线的形式。而在Vant组件库中,组件名称采用的是带有大写字母的驼峰式命名。这就需要我们在使用Vant组件时进行一些转换。 例如,在使用Tab栏组件时,如果我们想使用命…

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