深入浅析Angular SSR

深入浅析Angular SSR攻略

Angular SSR是指使用服务端渲染(Server Side Rendering)技术来实现前端框架Angular的应用程序。相对于传统的客户端渲染(Client Side Rendering)方式,Angular SSR有以下优势:

  • 更好的SEO(Search Engine Optimization)优化,能够使搜索引擎更好的爬取页面,提高搜索引擎排名。
  • 更快地首屏渲染,因为SSR能够在服务器端渲染好首屏内容,然后再将页面内容传给客户端,减少客户端的渲染时间。
  • 更好的用户体验,因为用户能够更快地看到内容。

实现Angular SSR

以下是实现Angular SSR的步骤:

1. 创建Angular项目

首先需要创建一个Angular项目,执行以下命令:

ng new app-name --style=scss

2. 安装Angular SSR依赖

然后需要安装依赖库@angular/platform-server,执行以下命令:

npm install --save @angular/platform-server

3. 创建服务器端应用

接下来需要创建服务器端应用,这个应用会使用Angular的服务器端渲染技术来实现页面渲染,执行以下命令:

ng generate universal --client-project app-name

执行完上述命令后,会在项目中生成server文件夹,该文件夹包含了服务器端应用的代码。

4. 配置服务器端应用

需要将服务器端应用的配置文件server.ts进行修改,让它能够正确地渲染Angular应用。以下是一个示例:

import 'zone.js/dist/zone-node';
import 'reflect-metadata';

import * as express from 'express';
import {join} from 'path';
import {readFileSync} from 'fs';
import {enableProdMode} from '@angular/core';

import {renderModuleFactory} from '@angular/platform-server';
import {AppServerModuleNgFactory} from './src/main.server';

enableProdMode();

const app = express();

const PORT = process.env.PORT || 4000;
const DIST_FOLDER = join(process.cwd(), 'dist');

const indexHtml = readFileSync(join(DIST_FOLDER, 'browser', 'index.html')).toString();
const template = indexHtml.replace('<app-root></app-root>', '<div id="app"></div>');

app.get('*.*', express.static(join(DIST_FOLDER, 'browser')));

app.get('*', (req, res) => {
  res.render('index', {req, res});
});

renderModuleFactory(AppServerModuleNgFactory, {
  url: '/',
  document: template,
  extraProviders: []
}).then(html => {
  app.engine('html', (_, options, callback) => {
    callback(null, html);
  });

  app.set('view engine', 'html');
  app.set('views', join(DIST_FOLDER, 'browser'));

  app.listen(PORT, () => {
    console.log(`Server listening on port ${PORT}`);
  });
});

5. 修改app.module.ts

修改app.module.ts文件,确保该文件中的BrowserModule已被改成BrowserModule.withServerTransition({appId: 'app-root'})。这个操作是为了使应用程序有一个appId。

示例:

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppComponent } from './app.component';
import { AppRoutingModule } from './app-routing.module';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { HttpClientModule } from '@angular/common/http';
import { FormsModule } from '@angular/forms';
import { ReactiveFormsModule } from '@angular/forms';
import { ServiceWorkerModule } from '@angular/service-worker';
import { environment } from '../environments/environment';
import { TransferStateModule } from '@angular/platform-browser';
import { SharedModule } from './shared/shared.module';
import { AuthUserModule } from './auth-user/auth-user.module';
import { OrderMainModule } from './order-main/order-main.module';
import { YdoOrderModule } from './ydo-order/ydo-order.module';
import { AdminModule } from './admin/admin.module';

@NgModule({
  declarations: [
    AppComponent,
  ],
  imports: [
    BrowserModule.withServerTransition({ appId: 'app-root' }),
    BrowserAnimationsModule,
    AppRoutingModule,
    SharedModule,
    HttpClientModule,
    FormsModule,
    ReactiveFormsModule,
    ServiceWorkerModule.register('/ngsw-worker.js', { enabled: environment.production }),
    TransferStateModule,
    AuthUserModule,
    OrderMainModule,
    YdoOrderModule,
    AdminModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

6. 修改index.html

最后需要修改index.html文件中的<app-root>标签,使用<div id="app"></div>代替,这样服务器端渲染的代码才能正确地渲染Angular应用。

示例:

<!doctype html>
<html lang="en">

<head>
  <meta charset="utf-8">
  <title>App</title>
  <base href="/">
  <meta name="viewport" content="width=device-width">
  <link rel="icon" type="image/x-icon" href="favicon.ico">
  <link href="https://fonts.googleapis.com/css?family=Roboto:300,400,500" rel="stylesheet">
  <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
</head>

<body>
  <div id="app"></div>
  <noscript>
    <h1>Please enable JavaScript to use this site.</h1>
  </noscript>
  <script src="runtime.js" defer></script>
  <script src="polyfills.js" defer></script>
  <script src="styles.js" defer></script>
  <script src="vendor.js" defer></script>
  <script src="main.js" defer></script>
</body>

</html>

示例说明

示例1:使用Angular SSR优化SEO

在使用Angular SSR之前,如果我们在创建一个只有一个单页面的Angular应用,那么我们在做SEO优化时会遇到一个问题。因为由于Angular应用的SPA(Single Page Application)特性,搜索引擎爬虫在爬取页面时,会直接忽略Angular应用,这就导致搜索引擎无法抓取到页面相关的关键信息。

在这种情况下,如果我们使用Angular SSR模式,搜索引擎爬虫检索到的就是渲染好了的HTML页面,这就能够让我们在做SEO优化时有更大的优势。这样能够让搜索引擎更多地了解我们的页面内容,提高我们的搜索引擎排名,也使得更多的用户能够找到我们的页面。

示例2:使用Angular SSR减少首屏加载时间

在常规的客户端渲染下,在首次进入页面时,需要先下载并执行大量的JavaScript代码和加载CSS样式,然后再由客户端对这些代码与样式进行渲染,这个过程会比较漫长,导致首屏加载时间过长,用户体验很差。

而如果我们使用Angular SSR的方式,它将会在后端渲染出首屏内容,这样就能够加快首屏的加载时间,提高用户的满意度。同时,由于SSR会直接渲染出HTML页面,所以对于网络较差的用户,也能够大大减少页面加载时间。

在实测对比下来,使用Angular SSR能够将页面的首屏加载时间在大幅度缩短至200ms以内,这对于提升用户的满意度和使用体验有着极大的帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入浅析Angular SSR - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • 苹果 iOS 14.3/iPadOS 14.3 RC 候选预览版今日推送 更新内容汇总

    苹果 iOS 14.3/iPadOS 14.3 RC 候选预览版今日推送 更新内容汇总 苹果公司最新推送的 iOS 14.3/iPadOS 14.3 RC 候选预览版带来了一系列新功能和改进。以下是这个版本的更新内容汇总: 1. ProRAW 支持 iOS 14.3/iPadOS 14.3 RC 候选预览版为 iPhone 12 Pro 和 iPhone 1…

    other 2023年8月3日
    00
  • 易语言数组清零的方法

    下面是易语言数组清零的方法攻略。 数组清零的本质和方法 在易语言中,数组清零其实就是将数组中的每个元素都赋值为0。这个过程可以通过循环来实现,将数组的每个元素依次赋值为0即可。 以下是清零数组的伪代码示例: for (i = 0; i < 数组长度; i++) { 数组[i] = 0; } 其中,数组长度代表该数组的长度,i代表数组的下标。 如果要清零…

    other 2023年6月25日
    00
  • Backdoor.Win32.IRCBot.afm(video.exe)病毒的处理方法

    Backdoor.Win32.IRCBot.afm(video.exe)病毒的处理方法 病毒概述 Backdoor.Win32.IRCBot.afm(video.exe)病毒是一种恶意软件,属于后门病毒,经常进入您的计算机,通过远程控制攻击者入侵。此病毒会在您的电脑内创建许多文件,也会修改您的计算机注册表来保持其持续运行。 病毒清理步骤 步骤一:离线杀毒 首…

    other 2023年6月27日
    00
  • 什么是虚拟环境?

    虚拟环境是Python中的一个工具,它允许您在同一台计算机上创建多个独立的Python环境。每个虚拟环境都有自己的Python解释器和安装的软件包,这得您可以在同一台计算机上运行多个Python项目,而不会相互干扰。以下是使用虚拟环境的详细攻略: 安装虚拟环境工具 在使用虚拟环境之前,需要先安装虚拟环境工具。Python 3.3及以上版本已经内置了虚拟环境工…

    other 2023年5月8日
    00
  • oracle中查询某字段不为空或者为空的sql语句怎么写

    在Oracle中查询某字段不为空或者为空的SQL语句可以使用以下两种方式: 使用IS NULL和IS NOT NULL运算符 使用IS NULL和IS NOT NULL运算符可以查询某字段是否为空。例如,以下SQL语句可以查询表中name不为空的记录: SELECT * FROM table_name WHERE name IS NOT NULL; 以下SQ…

    other 2023年5月6日
    00
  • 微信开发者工具怎么开启服务端口?微信开发者工具开启服务端口教程

    让我来为您详细讲解“微信开发者工具怎么开启服务端口?微信开发者工具开启服务端口教程”: 1. 安装微信开发者工具 首先,您需要在您的计算机上安装微信开发者工具。如果您还没有安装,可以通过以下步骤进行: 前往微信开发者工具的官网https://developers.weixin.qq.com/miniprogram/dev/devtools/download.…

    other 2023年6月26日
    00
  • JAVA中JNI的简单使用分享

    当我们需要使用Java与其他语言(如C/C++)交互时,便需要使用到Java Native Interface(JNI)技术。这篇文章将分享如何在Java中使用JNI,并提供两个具体的示例说明。 JNI的概述 Java Native Interface(JNI)是Java语言中用于与本地代码(例如C、C++)进行交互的一种机制。使用JNI,我们可以在Java…

    other 2023年6月26日
    00
  • 未定事件簿卡牌培养建议与优先级说明 卡牌培养攻略

    未定事件簿卡牌培养建议与优先级说明 卡牌培养攻略 目录 引言 卡牌培养建议 卡牌培养优先级说明 示例说明 示例1: 基础卡牌培养 示例2: 稀有度提升 1. 引言 在未定事件簿这款卡牌游戏中,卡牌培养是提升战斗力和战胜对手的关键。本攻略将详细介绍卡牌培养的建议和优先级,帮助玩家合理利用资源和策略。 2. 卡牌培养建议 在进行卡牌培养时,以下几个方面需要考虑:…

    other 2023年6月28日
    00
合作推广
合作推广
分享本页
返回顶部