使用 Vue-SSR 解决单页应用 SEO 问题

在单页应用(SPA)中,网站或应用的所有内容都由一款 JavaScript 应用程序处理,用户输入的 URL 不会直接引发页面刷新,仅仅是切换视图。这种技术带来的好处是极快的用户体验和流畅的页面转场,但也带来了一个严重的问题:SEO。

由于搜索引擎抓取页面的方式是通过 URL 请求 HTML,而 SPA 的 HTML 是通过 JavaScipt 在客户端生成的,因此,搜索引擎无法抓取到 SPA 的完整内容,导致 SPA 的所有页面都不容易被搜索引擎索引。

为了解决这个问题,我们可以使用 Vue Server-Side Rendering(SSR),这是一种适合使用 Vue.js 构建的应用程序的解决方案,它允许我们在服务器端生成 HTML,然后将其发送到客户端,这样搜索引擎就可以直接抓取到完整的 HTML 了。

使用 Vue-SSR 的优势

  1. 对 SEO 更加友好。由于页面是服务器端渲染的 HTML,搜索引擎可以直接抓取到完整的 HTML。
  2. 在首次加载时和 SEO 蜘蛛爬取时显示 dom 就绪的 HTML(即 网页中有 DOM 结构), 减少白屏时间。

使用 SSR 的原则

虽然 SSR 可以让你的 SPA 改善 SEO,但也会增加开发、文件大小、服务器配置等成本。所以,在使用 Vue-SSR 时,请考虑以下原则:

  1. 页面的内容需要被搜索引擎收录。
  2. 页面对加载速度的要求不是非常苛刻或需要被缓存。
  3. 部分的视图功能需要在服务端渲染。 如全站路由导航、底部公共元素(如底部导航) 等。

如果你的页面并未达到这些原则的要求,那么不需要使用 SSR。

创建 Vue-SSR 工程

我们可以在 Node 环境中使用 vue-cli 3.x 快速创建一个基于 Vue-SSR 的工程:

- ---- -------
--- ------- -- --------

- ----
--- ------ ----------

- -- --- --
-- ----------
--- --- ---

安装时,选择“Manually select features”,并选择以下插件:

  • Babel
  • Router
  • Vuex
  • CSS Pre-processors
  • Linter / Formatter
  • SSR

插件安装完成后,项目结构如下:

文件/文件夹 说明
public 存放静态资源
src 存放源代码
├─app.js 客户端入口文件
├─entry.js 服务端入口文件
├─router.js 路由配置文件
├─store.js Vuex 配置文件
├─App.vue Vue 入口文件,包含页面架构和全局样式
├─index.html HTML 模板文件
├─server.js 服务端执行文件
├─client.js 客户端执行文件
├─template.html 服务端模板文件
├─layouts 页面布局文件夹
└─views 页面文件夹

编写服务端代码

接下来,我们来编写一些服务端代码,用于 SSR。

准备工作

打开 entry.js,如下修改:

------ --------- ---- -------

------ ------- ------- -- -
  ----- - ---- ------- ----- - - -----------

  -- ------ ------ ---
  ------------------------

  -- -- ------ ----------------
  ------ --- ----------------- ------- -- -
    ----------------- -- -
      ----- ----------------- - -----------------------------
      -- --------------------------- -
        -------- ----- --- --
      -

      -- ------------ -----------
      ------------------------------------------- -- -
        -- --------------------- -
          ------ ---------------------
            ------
            ------ -------------------
          --
        -
      ----------- -- -
        ------------- - -----------
        ------------
      ----------------
    -- -------
  --
-

我们在 entry.js 中使用 createApp 返回 app、router、store。

然后,在 server.js 中,我们能够拿到键 __context__,并且在主体部分调用 renderToStringWithContext 传递一个将被渲染的 Vue套件,一个对象表示被渲染的组件的初始状态,以及一个与上下文相关的对象。在这个对象中,我们可以传递一些信息,例如 URL,它可以被 entry.js 用来通过路由进行预载。

如果需要,您还可以将 renderToStringWithContext 包装在 Promise 中并使其异步,例如在查询中使用MongoDB获取数据。在这种情况下,您可以使用服务器端本身的状态(例如response.locals)。此状态是每次启用页面时始终保持的,无论使用之前的缓存还是创建新的服务器实例,都会这样。

-- ---------
----- ------- - ------------------
----- --------- - -------------------------------------------

----- --- - ---------

-- ----
---------------- -------------------------

------------ ----- ---- -- -
  ----- ------- - -
    ---- -------
  -
  --------------------------- -- -
    ----- ---- - -
      --------- -----
      ------
        ------
          ---------- -----------
        -------
        ------
          ---- --------------------------
          -------------------------------- - -----------------------------------------
          ------- ----------------------------------------
        -------
      -------
    -
    --------------
  --
--

----- ---- - ----
---------------- -- -- -
  ---------------- ------ -- ------- -- --------------------------
--

在代码中,我们首先将服务器的入口文件加载为一个默认值(基于 entry-client.js),此文件提供了一个“工厂”函数,它会创建一个新的 Vue 实例作为应用程序的上下文,并在 router 和 vuex 设置后返回组件、实例和路由(如果存在)。

然后,将返回的实例传递给 renderer.renderToString() 方法,并将其作为第一个参数:该应用程序实例将渲染为 HTML,它也接受一个 context 参数,该参数对象可以传递给 Renderer 以生成正确的 HTML(例如通过检查路由参数等)。

-- ---------------
------ --- ---- -----
------ - --------- - ---- -------

----- - ---- ------- ----- - - -----------

-- -----------
-- -------------------------- -
  --------------------------------------------
-

----------------- -- -
  -- -----------------------------------
  ------------------
--

在经过处理的完整 HTML 形式,将由 renderer 的 renderToString 方法返回,传递给服务器的客户端代码将包含在 HTML 中,并在功能完整的网页脱颖而出。

编译并启动应用

使用以下命令对您的应用程序进行构建:

--- --- -----

在构建过程中,将使用 Webpack 打包所有 JavaScript 代码。它还将创建两组捆绑:一组用于在客户端上运行,另一组用于运行在 Node.js 环境中的服务器上。

启动您新的 SSR Vue 应用程序:

--- --- -----

它将启动一个 Node.js 服务器,该服务器将从您的 /dist 文件夹中提供静态文件,然后在页面渲染请求上呈现出 SSR 页面。

可以在浏览器中访问 http://localhost:8000/ 查看您的应用。

总结

SSR 可以极大地改善 SPA 的 SEO,提升用户体验。

使用 Vue-SSR 时,请首先考虑页面内容是否需要被搜索引擎抓取,是否需要展现更好的页面性能。

在编写Vue-SSR时,使用Vue CLI快速生成基础代码,并在服务端代码中使用关键的原则以及 Vue-SSR 的方法。

使用 NodeJS 将分离的前端代码和生态系统连接在一起,这完全有助于您将其作为服务进行扩展。

示例代码

该文章中,所有的示例代码均上传到了github仓库, 都可以运行, 学习调试.

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/6465c13e968c7c53b066a323


猜你喜欢

  • 响应式设计中如何设置图片大小

    响应式设计是一种优化网站显示效果的方法,使得网站在不同的设备上都能够提供良好的用户体验。在响应式设计中,图片的大小设置是一个重要的问题。本文将介绍在响应式设计中如何设置图片的大小,并提供详细的代码示例...

    1 年前
  • 「ES12」中新增的 Export 语法糖

    在 ES12 中,新增了一种更简单易用的 Export 语法糖,它能够帮助开发者更加轻松地定义和导出模块,从而提高前端代码的可维护性。 在本文中,我们将深入探讨 ES12 中新增的 Export 语法...

    1 年前
  • CSS Reset 对表格样式的影响及其解决

    在前端开发中,CSS Reset(CSS 样式重置)是一个常见的技术,它可以帮助我们解决不同浏览器之间的 CSS 样式不一致的问题。但是在使用 CSS Reset 的过程中,可能会对表格样式产生影响,...

    1 年前
  • Fastify 中如何集成 SwaggerUI

    Fastify 中如何集成 SwaggerUI Fastify 是一个高效的 Node.js Web 框架,它提供了一个快速的路由器和中间件处理程序,用于构建高性能和可扩展的 Web 应用程序。

    1 年前
  • Tailwind CSS 中的常见 Margin 和 Padding 问题及解决方法

    前言 Tailwind CSS 是现在比较流行的前端 UI 库之一,它使用简单的类名来定义样式,使得快速开发变得更加容易。在 Tailwind CSS 中,margin 和 padding 是两个经常...

    1 年前
  • Serverless 应用如何处理跨站点请求伪造?

    跨站点请求伪造 (CSRF) 是一种网络攻击,通过伪造用户请求来达到不良目的。在 Serverless 应用中,这种攻击仍然是一个存在的威胁。本文将介绍什么是 CSRF 攻击、如何预防 CSRF 攻击...

    1 年前
  • RESTful API 中如何实现限流机制?

    随着移动互联网的发展和云计算技术的普及,RESTful API 已经成为现代分布式系统中不可或缺的一部分。然而,一些繁重的请求可能会损害系统的稳定性和可用性,因此限制每个用户在一定时间内最多可以请求多...

    1 年前
  • RxJS 中的实例操作符详解

    RxJS 是一款流行的响应式编程库,它提供了丰富的操作符来处理事件流。在 RxJS 中,实例操作符是一类针对 Observable 实例的操作符,它们可以用于组合、转换、筛选、限制等操作。

    1 年前
  • Socket.io 实现文件上传及下载的方案

    Socket.io 是一个实现了实时、双向、基于事件的通信的 JavaScript 库,它能在浏览器和服务器之间建立持久连接,允许双方实时地进行数据交换。在前端开发中,Socket.io 被广泛应用于...

    1 年前
  • 在 AngularJS 项目中使用 Chai.js 进行组件测试

    在 AngularJS 项目中使用 Chai.js 进行组件测试 在现代的 Web 开发中,前端工程化已经成为必不可少的一部分。而在前端编写软件的过程中,组件化是非常常见的一种设计模式。

    1 年前
  • ES7 中新增 Number.MAX_SAFE_INTEGER 和 Number.MIN_SAFE_INTEGER

    在 ES6 中,JavaScript 已经实现了 Number 数据类型中的最大值和最小值,分别是 Number.MAX_VALUE(-1.7976931348623157e+308) 和 Numbe...

    1 年前
  • Sequelize 如何进行外键设置

    外键是数据库中一种非常重要的关系型存储方式,能够帮助我们更好地组织数据并维持数据库的完整性。在 Sequelize 中设置外键也是非常重要的,本文将会给大家讲解如何使用 Sequelize 进行外键设...

    1 年前
  • 如何使用 ES9 函数式方法优化您的代码

    如何使用 ES9 函数式方法优化您的代码 随着现代前端程序的变得越来越复杂,代码的可维护性和可读性变得尤为重要。ES9 中新增的函数式方法提供了一种简洁、优雅和高效的编码方式,可以优化您的代码的性能和...

    1 年前
  • SASS 优化 CSS 的幺儿 XML 动画

    SASS 优化 CSS 的幺儿 XML 动画 在前端开发中,CSS 动画是非常常见且常用的技术手段。在实现 CSS 动画时,我们通常采用 CSS3 的动画技术。不过,如果我们需要实现一些复杂的幺儿 X...

    1 年前
  • 使用 Express.js 和 MongoDB 构建一个 RESTful API

    RESTful API 是一个广泛使用的用于实现前后端通信的接口,它基本上是围绕 HTTP 协议进行的,使得开发人员可以使用简单的 HTTP 请求来访问和处理数据。

    1 年前
  • Node.js 中的 Edge.js 使用教程

    简介 Edge.js 是一个在 .NET 和 Node.js 之间进行交互的工具。通过 Edge.js,我们能够在 Node.js 中直接调用 .NET 代码并返回结果。

    1 年前
  • 解决 Headless CMS 中图片文件上传错误问题

    在 Headless CMS 中,处理图片文件的上传是非常常见的需求。然而,有时候上传图片时会遇到错误,让人烦恼不已。本文将介绍一些可能会导致错误的原因,并提供一些解决方案,帮助读者在上传图片时避免出...

    1 年前
  • Webpack 在实际开发中的应用

    Webpack是一个非常流行的前端打包工具,主要用于将各种资源文件打包成一个或多个浏览器可用的静态资源。在实际开发中,Webpack已经成为了前端工程化中不可或缺的部分。

    1 年前
  • 使用 LESS mixin 实现折叠效果

    使用 LESS Mixin 实现折叠效果 在前端开发中,我们常常会遇到需要实现折叠效果的需求,比如实现一个可以收起/展开面板的功能。那么,如何实现这个功能呢?今天我要介绍的是使用 LESS Mixin...

    1 年前
  • 使用并行编程技术加速应用程序

    引言 在现代计算机中,CPU 发展迅速,单核 CPU 在性能上已经无法满足对计算性能的需求,而多核 CPU 则成为了当前主流的发展方向。然而,在传统计算模型下,多 CPU 并不能充分发挥其性能优势,因...

    1 年前

相关推荐

    暂无文章