深入浅析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日

相关文章

  • list的foreach方法获取下标

    以下是使用List的foreach方法获取下标的攻略: 步骤1:了解List的foreach方法 List的foreach方法是一种遍历List集合的方法,可以用于对List中的每个元素进行操作。foreach方法接受一个函数作为参数,该函数在遍历List时被调用。在该函数中,可以使用Java 8中的Lambda表达式来获取List中的元素和下标。 步骤2:…

    other 2023年5月6日
    00
  • 电脑应用程序图标和用户名怎么改?

    要改变电脑应用程序图标和用户名,需要在操作系统中进行设置。下面是完整攻略: 改变应用程序图标 找到想要改变图标的应用程序,右键点击图标,选择“属性”(或“信息”)选项; 在弹出的属性窗口中,点击“快捷方式”选项卡; 点击“更改图标”按钮; 在弹出的“更改图标”窗口中,选择想要使用的图标或浏览到其他图标文件,并点击“确定”; 如果要还原原来的图标,可以重复步骤…

    other 2023年6月25日
    00
  • Vscode如何设置三行布局?Vscode设置三行布局的方法

    Vscode如何设置三行布局? 在Vscode中,你可以通过以下步骤设置三行布局: 打开Vscode并进入扩展商店。 搜索并安装“Custom CSS and JS Loader”扩展。 安装完成后,点击Vscode左侧的扩展图标,找到“Custom CSS and JS Loader”扩展并点击“设置”按钮。 在设置页面中,找到“Custom CSS”选项…

    other 2023年9月5日
    00
  • 详解如何在vue+element-ui的项目中封装dialog组件

    下面是我对如何在 Vue + Element-UI 的项目中封装 Dialog 组件的详细攻略。 一、组件封装思路 首先,我们需要了解如何在 Vue 中封装一个组件。封装组件的基本思路是定义好组件的模板、样式和行为,并将其统一封装起来,以便在需要的地方使用。下面是我们封装 Dialog 组件的基本思路: 定义好 Dialog 组件的模板,包括标题、内容、底部…

    other 2023年6月25日
    00
  • recyclerview分割线——万能分割线

    Recyclerview分割线——万能分割线 当我们使用Recyclerview来展示列表的时候,通常需要使用分割线来给列表项之间增加一些空隙,使得用户可以更好地区分每个项。那么在这里,我们介绍一种万能分割线,使你在使用Recyclerview时减少一些烦恼。 传统方式 在传统的方式中,我们通常需要自己写分割线的布局文件。但是,这种方式会增加代码量,并且会有…

    其他 2023年3月28日
    00
  • 详解uniapp的全局变量实现方式

    详解uniapp的全局变量实现方式 在uniapp中,我们可以通过以下几种方式来实现全局变量的使用: 1. 使用Vue的原型链 Vue.js是uniapp的基础框架,它提供了一种简单的方式来实现全局变量。我们可以将需要全局访问的变量挂载到Vue的原型链上,这样在任何组件中都可以通过this关键字来访问这些变量。 示例代码如下: // main.js impo…

    other 2023年7月28日
    00
  • 使用PHP数组实现无限分类,不使用数据库,不使用递归.

    下面是使用PHP数组实现无限分类,不使用数据库,不使用递归的完整攻略: 一、实现原理 首先,我们需要理解无限分类的实现原理。无限分类的本质就是一个多层嵌套的树形结构,每个节点都可以有无限个子节点。为了实现无限分类,我们需要使用PHP数组来模拟这个树形结构。具体来说,我们可以使用一个二维数组,其中每个元素都是一个包含以下键值的关联数组: id:节点的唯一标识符…

    other 2023年6月27日
    00
  • Win8怎么改后缀 Wwin8改文件后缀具体使用方法

    Win8怎么改后缀 Wwin8改文件后缀具体使用方法 在Windows 8操作系统中,你可以通过以下步骤来改变文件的后缀名: 首先,找到你想要改变后缀名的文件。可以通过文件资源管理器或者桌面上的快捷方式来访问文件。 右键点击该文件,然后从弹出菜单中选择“重命名”。 文件名将被选中,并且光标会出现在文件名的末尾。现在,你可以开始编辑文件名。 删除文件名的当前后…

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