详解Angular5 服务端渲染实战

yizhihongxing

为了详细讲解“详解Angular5 服务端渲染实战”的完整攻略,我们需要分为以下几个部分:

  1. 什么是服务端渲染(SSR)?
  2. Angular 在 SSR 中的应用原理
  3. 如何使用 Angular Universal 进行 SSR ?
  4. 两条示例说明

1. 什么是服务端渲染(SSR)?

服务端渲染 (SSR) 是指将服务器端的数据和业务逻辑结合生成 HTML 页面返回给浏览器进行渲染的过程。常听到的 SSR 框架有 Next.js、Nuxt.js 等。

相对于客户端渲染(CSR),SSR 的优点在于:

  • 提高页面的可读性和 SEO 性能
  • 加快页面的首次渲染时间,提升用户体验

2. Angular 在 SSR 中的应用原理

Angular 的应用需要通过 Webpack 将 Typescript 编译成 JavaScript 并打包成一组文件,然后浏览器需要加载这些文件才能正常运行应用。

服务端渲染时,我们需要将 Angular 应用的代码在服务端直接生成一组 HTML 页面返回给浏览器,而不是等待浏览器加载完应用后再进行渲染。因此我们需要解决以下几个问题:

  • 如何在服务端直接生成 Angular 应用的 HTML 页面?
  • 如何将服务端生成的 HTML 页面与客户端的 Angular 应用进行同步,确保应用的正常运行?

3. 如何使用 Angular Universal 进行 SSR ?

答案是使用 Angular Universal。

Angular Universal 是 Angular 官方出品的服务端渲染解决方案。使用 Angular Universal 的步骤如下:

  1. 安装 Angular Universal
ng add @nguniversal/express-engine
  1. 生成 Universal 应用
ng generate universal {{your_project_name}}

此时会在应用根目录下生成 server 目录和 server.ts 文件。

  1. 修改 server.ts 文件

server.ts 文件中,我们需要做以下几个操作:

  • 导入 Angular Universal 相关的模块
  • 使用 renderModuleFactory 生成 Angular 应用的 HTML 页面
  • 将 HTML 页面返回给浏览器进行渲染
import 'zone.js/dist/zone-node';
import { enableProdMode } from '@angular/core';
import * as express from 'express';
import { join } from 'path';
import { readFileSync } from 'fs';
import { renderModuleFactory } from '@angular/platform-server';
import { AppServerModuleNgFactory } from './src/main-server';

// Enable production mode
enableProdMode();

// Create express server
const app = express();
const port = process.env.PORT || 4000;
const DIST_FOLDER = join(process.cwd(), 'dist');

const template = readFileSync(join(DIST_FOLDER, 'browser', 'index.html')).toString();
const { AppServerModuleNgFactory } = require('./dist/server/main');

app.engine('html', (_, options, callback) => {
  const opts = { document: template, url: options.req.url };
  renderModuleFactory(AppServerModuleNgFactory, opts)
    .then(html => callback(null, html));
});

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

// Serve static files from /browser
app.use('/', express.static(join(DIST_FOLDER, 'browser'), { index: false }));

// Start express server
app.listen(port, () => {
  console.log(`Listening on http://localhost:${port}`);
});
  1. 运行 Universal 应用

使用以下命令运行 Universal 应用:

npm run build:ssr && npm run serve:ssr

4. 两条示例说明

示例一:路由预渲染

对于一些不怎么会变化的页面,可以通过路由预渲染来优化性能。示例代码如下:

import { Route } from '@angular/router';
import { PreRenderedComponent } from './pre-rendered.component';

export const routes: Route[] = [
  {
    path: '',
    pathMatch: 'full',
    redirectTo: 'home'
  },
  {
    path: 'home',
    component: HomeComponent
  },
  {
    path: 'pre-rendered',
    component: PreRenderedComponent,
    data: {
      title: 'Pre-rendered Page'
    },
    // 使用路由预渲染
    // 会先生成 HTML 页面返回给浏览器进行渲染
    // 再使用客户端的 Angular 应用进行渲染
    // 避免用户看到白屏
    // 对于不经常变化的页面性能提升明显
    // 对于经常变化的页面反而会降低性能
    // 所以需要权衡
    // 如果不需要预渲染,可以移除此行
    runGuardsAndResolvers: 'always'
  },
  {
    path: '**',
    redirectTo: 'home'
  }
];

示例二:SEO

服务端渲染可以提高页面的 SEO 性能,以下是示例页面的完整代码:

import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { Meta, Title } from '@angular/platform-browser';

@Component({
  selector: 'app-seo',
  template: `
    <h1>{{ title }}</h1>
    <p>{{ description }}</p>
    <p>{{ keywords }}</p>
  `
})
export class SeoComponent implements OnInit {

  title: string;
  description: string;
  keywords: string;

  constructor(
    private route: ActivatedRoute,
    private meta: Meta,
    private titleService: Title
  ) { }

  ngOnInit(): void {
    this.route.data.subscribe(data => {
      this.title = data.title;
      this.description = data.description;
      this.keywords = data.keywords;
      this.titleService.setTitle(data.title);
      this.meta.addTag({ name: 'description', content: data.description });
      this.meta.addTag({ name: 'keywords', content: data.keywords });
    });
  }

}

在添加路由时,需要设置 data 属性来指定页面的 title、description 和 keywords 等 SEO 相关属性:

import { Route } from '@angular/router';
import { SeoComponent } from './seo.component';

export const routes: Route[] = [
  {
    path: 'seo',
    component: SeoComponent,
    data: {
      title: 'SEO Page',
      description: 'This is an SEO page',
      keywords: 'SEO,Page,Keywords'
    }
  }
];

以上就是“详解Angular5 服务端渲染实战”的完整攻略,希望能对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Angular5 服务端渲染实战 - Python技术站

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

相关文章

  • android触摸事件motionevent详解

    Android触摸事件MotionEvent详解 在Android应用程序中,触摸事件是非常重要的。MotionEvent类提供了有关触摸事件的详信息,包括触摸位置、触摸动作和触摸时间等。以下是有关Android触事件MotionEvent的详细信息。 MotionEvent类 MotionEvent类提供了有关摸事件的详细信息以下是MotionEvent类…

    other 2023年5月6日
    00
  • Linux外围文件系统的定制方法

    下面我将为你详细讲解“Linux外围文件系统的定制方法”的完整攻略,包含以下几部分内容: 确定外围文件系统的定制的目的; 选择适合的文件系统类型; 可定制区域确定; 开始进行定制; 两个示例说明。 1.确定外围文件系统的定制目的 在进行外围文件系统的定制之前,我们需要明确外围文件系统的定制目的。确定目的后,我们可以针对需求进行相应的定制。 2.选择适合的文件…

    other 2023年6月27日
    00
  • 如何查看apache是最新版

    以下是关于如何查看Apache是否是最新版的完整攻略,包括基本介绍、实现步骤、示例说明等内容。 1. 基本介绍 Apache是一种常用的Web服务器软件,我们需要经常检查是否是最新版,以便保证安全性和稳定性。在Linux系统中,我们可以使用命令行工具来检查Apache是否是最新版。 2. 实现步骤 以下是使用命令行工具检查Apache是否是最新版的详细步骤:…

    other 2023年5月10日
    00
  • 苹果新编程语言Swift由克里斯·拉特纳耗时4年基本人开发完成

    苹果新编程语言Swift是一门比Objective-C更为现代的编程语言,由苹果公司推出并用于开发iOS、macOS和watchOS等操作系统应用程序。Swift于2014年首次发布,被誉为iOS开发的未来。它克服了Objective-C语言的一些限制,使代码更易读、更安全、更易于维护。Swift的特点包括类型安全、自动内存管理、语言交互性、高效性以及相比于…

    other 2023年6月26日
    00
  • C语言的变量与常量 字符字符串与转义字符详解

    C语言的变量与常量 变量 在 C 语言中,变量是用于存储值的存储区域。这个存储区域在编译时就被确定了,因此其大小也是固定的。然而,在程序运行时,内存中并不是所有的存储区域都必须被存储的值所占用。变量在使用之前必须先声明,声明变量的基本语法格式如下: type variable_name; 其中,type 是变量的数据类型,variable_name 是变量的…

    other 2023年6月20日
    00
  • Java在制作jar包时引用第三方jar包的方法

    Java在制作JAR包时引用第三方JAR包的方法 在Java项目中,当我们制作JAR包时,有时需要引用第三方的JAR包。下面是引用第三方JAR包的两种常见方法。 方法一:将第三方JAR包打包到自己的JAR包中 将第三方JAR包复制到项目的某个目录下,例如libs目录。 在项目的构建脚本(如build.gradle)中,配置将第三方JAR包打包到自己的JAR包…

    other 2023年10月13日
    00
  • 举例详解Python中循环语句的嵌套使用

    举例详解Python中循环语句的嵌套使用攻略 循环语句的嵌套使用是在一个循环语句的内部再嵌套另一个循环语句,这种嵌套结构可以帮助我们处理更加复杂的问题。在Python中,常见的循环语句有for循环和while循环。下面将通过两个示例来详细讲解循环语句的嵌套使用。 示例一:九九乘法表 九九乘法表是一个经典的示例,它展示了如何使用嵌套循环来生成一个九九乘法表。下…

    other 2023年7月27日
    00
  • apache性能测试工具ab使用详解

    Apache性能测试工具ab使用详解攻略 Apache Bench(ab)是一个常用的Apache性能测试工具,用于模拟并发请求并评估服务器的性能。以下是使用ab进行性能测试的详细攻略: 1. 安装ab工具 首先,确保您的系统已经安装了Apache服务器。ab工具通常随Apache服务器一起安装。您可以通过以下命令检查ab工具是否已安装: ab -V 如果显…

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