Angular SPA 中的页面预渲染

前言:页面预渲染(SSR)技术是目前前端界的一项热门技术,它不仅可以提高网站的性能,而且可以增强网站在SEO上的表现。在利用Angular SPA开发网站时如何进行页面预渲染成了一个必须得到解决的问题。在此,我们将向大家详细介绍如何通过Angular框架来实现SPA中的页面预渲染。

一、什么是Angular SPA

Angular 是一个基于 TypeScript 的开源前端 Web 应用程序框架,由 Google 维护和开发。Angular 是一个面向单页面应用(Single Page Application(SPA))的 Web 应用程序框架。在单页面应用中,应用程序将所有必要的 HTML、JavaScript 和 CSS 都作为一个单独的页面加载并交互。而在用户导航时,Angular 负责动态地重新呈现页面,而不是从服务器获取新页面。

单页面应用的好处是带来很好的用户体验,但缺点是跟SEO有点功过。由于单页面应用不是每次请求都去服务器取得页面,而是之后如果需要的话才更新数据,所以,搜索引擎不能够获得应用程序的完整内容。这就大大降低了SEO的效率,此时,就需要我们了解一下 Angular SPA 的预渲染技术。

二、页面预渲染的原理

在 Angular SPA 中,开发者可以使用 Angular Universal 来实现页面预渲染。Angular Universal 可以把服务器端生成的 HTML 文档发送给浏览器,使搜索引擎可以找到你的内容。而对于普通用户,就好像是单页面应用一样的用户体验。

Angular Universal 的主要功能是使应用程序在服务器上预渲染成 HTML,在浏览器中使用 JavaScript 运行该应用程序。为了预渲染应用程序,我们需要将其应用程序改造成在服务器端和客户端都可以运行的形式。

这里说一下Angular的预渲染是如何发挥SEO的作用的。在SPA中,当用户进行某些特定的操作时候,比如搜索关键字、浏览列表之类会请求并显示新数据的事件时候,对于搜索引擎来说,它是看不到这些数据的,只能看到刚刚加载页面的内容。这时,预渲染技术就要派上用场了。当搜索引擎用户访问站点时,我们可以通过在服务器端预渲染这些特定于数据的时间,在这个过程中生成包含所有数据的静态HTML页面,从而让搜索引擎能看见所有内容,从而建立更好的SEO。

三、Angular Universal 的工作原理

一个简单的 Angular Universal 页面如下所示:

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

在首次加载该页面时,请求会到达 web 服务器上的 Express 应用程序,该应用程序会使用 Angular Universal 服务来预渲染该页面。Angular Universal 服务创建一个隔离的应用程序环境,使用 Angular 渲染器来呈现该应用程序。调用 renderModuleFactory 命令将 AppComponent 渲染成 HTML 页面并返回浏览器。

Angular Universal 的使用

下面我们具体介绍如何使用 Angular Universal 来进行页面预渲染。

第一步:安装Angular Universal

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

安装结束后你会发现package.json文件中多了这几个packages, 说明已经正确安装。

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

第二步:重构项目文件

由于我们需要使用 Angular Universal 在服务器端渲染应用程序,我们需要在项目中引入一些新的文件,以及对现有代码进行一些修改。

我们来看看基本的 Angular 应用程序文件结构:

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

我们添加的两个新文件如下所示:

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

修改一下 package.json 文件文件 scripts 命令:

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

第三步:编写服务端渲染文件

我们创建一个名为 server.ts 的新文件,并添加以下代码:

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

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

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

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

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

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

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

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

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

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

该文件会启动你的 Web 服务器,让你的 Angular 应用程序在服务器端自动预渲染。

第四步:配置 webpack.server.config.ts

我们创建一个名为webpack.server.config.ts的新文件,并添加以下代码,在webpack里面配置的proxy是为了避免服务器端渲染路由出现问题

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

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

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

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

第五步:切换你的 Angular 应用程序

当新的 Web 服务器和 Webpack 配置完毕,那么就可以保存和重新打包 Angular 应用程序了。在打包之前,要先做准备工作,如下:

src / app / app.server.module.ts 创建一个新 moduleMapProvider 方法:

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

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

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

这里建立了一个新的模块,名为AppServerModule,其中的providers子活儿做了很多的工作,这里我们只需要知道,它会确保你的应用程序在正常情况下起作用并允许我们对每个URL进行服务器-side预渲染.

对于我们的 AppModule,需要导出一个新的 AppModule 类:

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

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

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

它是Angular的标准应用模块,bootstrap元素的定义告诉Angular要渲染AppComponent组件。这里,我们几乎做到了所有的新东西。现在可以使用Angular CLI的build命令来打包应用程序。

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

运行此命令后,会生成一个新目录dist,在该目录中,我们可以找到:server.js。执行 npm run build:server 命令来打包我们的应用程序。

运行 npm run webpack:server命令生成Webpack要使用的新配置。

然后,我们只需在终端中使用命令行启动服务器:

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

这样,我们就实现了Server端的预渲染。

第六步:验证预渲染

打开localhost:3000,我们可以在页面源代码中看到预渲染的内容。这里展示了一个简单的基于Angular的动态应用。

四、总结

对于那些构建对SEO很关键的应用程序的工程师来说,Angular Universal 提供了一种简单的方法,通过服务器端预渲染,给搜索引擎提供丰富的内容。虽然有了Angular Universal,我们就不用为这种技术耗费许多时间和精力,预渲染技术也变得相对简单了许多。

五、参考

  1. https://angular.io/guide/universal
  2. https://www.freecodecamp.org/news/angular-universal-server-side-rendering-platform/
  3. https://blog.angular.io/announcing-angular-universal-a4c9aba9429

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


猜你喜欢

  • 如何在 LESS 中使用属性嵌套优化 CSS

    引言 CSS 是构建 Web 页面的重要技术之一,但是在实际开发过程中,CSS 的代码量通常都是较大的,而且难以维护。属性嵌套是一种优化 CSS 代码、提高可维护性的手段,而 LESS 是一种 CSS...

    1 年前
  • ESLint 和 Prettier 的集成使用教程

    随着前端技术的不断发展,代码质量和规范变得越来越重要。ESLint 和 Prettier 是两个非常重要的前端工具,可以帮助开发者提高代码的质量和可读性。本文将介绍 ESLint 和 Prettier...

    1 年前
  • ES12 的新特性:解决因引用类型副本容易出现的问题

    在前端开发中,我们经常遇到需要对复杂数据类型进行复制的情况,例如对象和数组。然而,由于 JavaScript 中的对象和数组都是引用类型,所以直接进行复制实际上只是复制了一个指向原始数据的引用,这就容...

    1 年前
  • ECMAScript 2015: Set 和 Map 的用法详解

    ECMAScript 2015(也称为 ECMAScript 6)是 JavaScript 的官方标准之一,其中引入了一些新的数据结构,包括 Set 和 Map。 Set 和 Map 是 JavaSc...

    1 年前
  • Flexbox 布局下的项间分隔线技巧

    Flexbox 是一种 CSS 布局模型,提供了一种强大的方式来管理盒子之间的关系,使得布局变得更加灵活,易于实现。但有时候,在项之间添加分隔线可以更好地区分它们之间的关系,以便更好地传达布局的含义。

    1 年前
  • Cypress 运行测试用例时如何控制 Chrome 浏览器的权限

    介绍 Cypress 是一个现代 Web 应用测试框架,它可以帮助我们轻松地编写、运行和调试前端测试用例。在运行测试用例时,Cypress 默认使用 Chrome 浏览器作为测试环境。

    1 年前
  • 无障碍网页开发中应对 IE 浏览器的兼容性方案

    背景 无障碍网页是指能够让所有人无论是否存在身体、智力、感官方面的障碍都能够访问和使用的网页,而其中最重要的一个因素就是兼容性。IE 浏览器虽然已经逐渐退出市场,但在某些领域,如政府机构和企业内部系统...

    1 年前
  • 基于 Enzyme 实现 React 组件的自动化测试流程

    React 是一个流行的前端框架,同时也是一个组件化的开发模式。组件是 React 应用程序中的基本单位,因此组件的测试是开发中不可或缺的一部分。Enzyme 是一个流行的 React 组件测试库,它...

    1 年前
  • MongoDB 在 Linux 平台下的备份与恢复

    简介 MongoDB 是一种 NoSQL 数据库,因其具有可扩展性、数据灵活性和卓越的性能而备受欢迎。在 Linux 平台下使用 MongoDB 时,数据库备份和恢复非常重要。

    1 年前
  • RxJS 中的操作符:map 和 flatMap 的区别

    在 RxJS 中,map 和 flatMap 都是常用的操作符。它们可以帮助我们对 Observable 发出的数据流进行转换操作。虽然它们都能实现对流中的数据进行转换,但在实际应用中却有着不同的作用...

    1 年前
  • Tailwind 中常见的响应式设计问题及解决方法

    Tailwind 提供了方便易用的响应式设计功能,可以根据设备尺寸自动应用样式。尽管 Tailwind 已经为我们提供了相应的解决方案,但在实际应用中,还是会遇到一些问题。

    1 年前
  • React Router 实现 SPA 应用时,如何避免路由跳转后页面不刷新的情况?

    什么是 SPA 应用? 单页面应用(SPA)是一种以 Web 应用方式呈现和交互的网页应用程序,其页面不需要重新加载或跳转。SPA 应用只在用户进入应用时加载必要的 HTML、CSS 和 JavaSc...

    1 年前
  • Web Components 性能优化及最佳实践

    随着 Web 技术的发展,前端开发已经发生了翻天覆地的变化。而在这个变革的过程中,Web Components 作为一种新型的前端技术,已经成为了前端开发中不可或缺的一部分。

    1 年前
  • 使用 DataLoader 解决 GraphQL 中的重复查询问题

    GraphQL 中的重复查询问题 在 GraphQL 查询中,经常会出现多次查询同一个数据的情况,这会极大地降低应用性能。例如,在一个社交应用中,一个用户可能会查询自己的好友列表并查看每个好友的基本信...

    1 年前
  • 利用 Server-sent Events 实现餐厅排号预约功能

    前言 餐厅排号预约功能在现代生活中已经非常常见,这种功能可以让用户无需到店现场等待,只需要提前在手机或电脑上预约,等到时间到了再到店用餐。本文将介绍如何利用 Server-sent Events 技术...

    1 年前
  • RESTful API 中的集成式和分离式部署方式选择

    前言 RESTful API 是现代 Web 应用的重要组成部分。它通过 HTTP 协议提供一个统一的接口,让客户端(如 Web 应用、移动应用、桌面应用等)与服务器端(如数据库、文件系统等)进行数据...

    1 年前
  • Node.js 请求参数为什么要进行编解码

    作为前端开发者,我们经常会用到 Node.js 来搭建后台服务,同时处理各种请求。而请求中的数据参数则是非常重要的一部分。然而,在处理这些参数时,可能遇到各种参数编码问题,比如乱码或者中文被转义等问题...

    1 年前
  • 使用 Chai.js 测试 Angular2 组件

    在 Angular2 开发中,组件作为页面构成的最基本单位,是整个前端开发的核心。为了保证组件的质量和稳定性,我们需要使用测试工具来对组件进行测试。 在本文中,我们将介绍如何使用 Chai.js 来测...

    1 年前
  • 如何在 ES7 中实现 ES6 的箭头函数

    在 ES6 中,箭头函数被引入作为一种新的函数类型,它有许多优点,如简化了函数的书写、可读性强等,所以成为了众多前端工程师喜爱的特性之一。然而,在 ES7 中,我们也可以通过一些方法来实现箭头函数的效...

    1 年前
  • TypeScript 中如何声明和使用可选参数

    在 TypeScript 中,我们经常需要声明函数的参数,并且有时这些参数是可选的,因为并不是每次调用函数时都需要传递完整的参数列表。本文将会介绍如何在 TypeScript 中声明和使用可选参数。

    1 年前

相关推荐

    暂无文章