亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
使用SSR 的好處
對SEO 更友善
提高行動端的效能
更快地展示首頁
為專案增加 SSR
取代瀏覽器 API
使用 URL 絕對地址
Prerender 預(yù)渲染靜態(tài) HTML
預(yù)渲染路徑配置
SEO 優(yōu)化
總結(jié)
首頁 web前端 js教程 一文探究Angular中的服務(wù)端渲染(SSR)

一文探究Angular中的服務(wù)端渲染(SSR)

Dec 27, 2022 pm 07:24 PM
angular ssr

一文探究Angular中的服務(wù)端渲染(SSR)

一般來說,普通的 Angular 應(yīng)用程式是在 瀏覽器 中運行,在 DOM 中對頁面進(jìn)行渲染,並與使用者互動。而Angular Universal 是在服務(wù)端 進(jìn)行渲染(Server-Side Rendering,SSR),產(chǎn)生靜態(tài)的應(yīng)用程式網(wǎng)頁,然後在客戶端展示,好處是可以更快地進(jìn)行渲染,在提供完整的互動之前就可以提供使用者內(nèi)容展示。 【相關(guān)教學(xué)推薦:《angular教學(xué)》】

本文是在Angular 14 環(huán)境中完成,有些內(nèi)容對於新的Angular 版本可能並不適用,請參考Angular 官方文件.

使用SSR 的好處

對SEO 更友善

雖然現(xiàn)在包括Google 在內(nèi)的某些搜尋引擎和社群媒體聲稱已經(jīng)能支援對由JavaScript(JS)驅(qū)動的SPA(Single-Page Application)應(yīng)用程式進(jìn)行爬取,但是結(jié)果似乎差強(qiáng)人意。靜態(tài) HTML 網(wǎng)站的 SEO 表現(xiàn)還是比動態(tài)網(wǎng)站,這也是 Angular 官網(wǎng)所持有的觀點(Angular 可是 Google 的!)。

Universal 可以產(chǎn)生無 JS 的靜態(tài)版本的應(yīng)用程序,對搜尋、外鏈、導(dǎo)航的支援更好。

提高行動端的效能

某些行動裝置可能不支援 JS 或?qū)?JS 的支援非常有限,導(dǎo)致網(wǎng)站的存取體驗非常差。在這種情況下,我們需要提供無 JS 版本的應(yīng)用,以便為使用者提供更好的體驗。

更快地展示首頁

對於使用者的使用體驗來說,首頁展示速度的快慢至關(guān)重要。根據(jù) eBay 的數(shù)據(jù),搜尋結(jié)果的展示速度每提高 100 毫秒,「加入購物車」的使用率就提高 0.5%。

使用了 Universal 之後,應(yīng)用程式的首頁會以完整的形態(tài)展示給用戶,這是純的 HTML 網(wǎng)頁,即使不支援 JS,也可以展示。此時,網(wǎng)頁雖然無法處理瀏覽器的事件,但支援透過 routerLink 進(jìn)行跳轉(zhuǎn)。

這麼做的好處是,我們可以先用靜態(tài)網(wǎng)頁抓住使用者的注意力,在使用者瀏覽網(wǎng)頁的時候,同時載入整個 Angular 應(yīng)用程式。這給了用戶一個非常好的極速加載的體驗。

為專案增加 SSR

Angular CLI 可以幫助我們非常方便的將一個普通的 Angular 專案轉(zhuǎn)變?yōu)橐粋€帶有 SSR 的專案。建立服務(wù)端應(yīng)用程式只需要一個指令:

ng?add?@nguniversal/express-engine

建議在執(zhí)行該指令之前先提交所有的變更。

這個指令會對專案做如下修改:

  • 新增服務(wù)端檔案:

    • main.server .ts - 服務(wù)端主程式檔案
    • app/app.server.module.ts - 服務(wù)端應(yīng)用程式主模組
    • tsconfig. server.json - TypeScript 服務(wù)端設(shè)定檔
    • server.ts - Express web server 的執(zhí)行檔
  • #已修改的檔案:

    • package.json - 新增SSR 所需的依賴與執(zhí)行腳本
    • angular.json - 新增開發(fā)、建置SSR 應(yīng)用程式所需的設(shè)定

package.json 中,會自動加入一些npm 腳本: dev:ssr 用於在開發(fā)環(huán)境中執(zhí)行SSR 版本;serve:ssr 用於直接執(zhí)行build 或prerender 後的網(wǎng)頁;build:ssr 建置SSR 版本的網(wǎng)頁; prerender 建立預(yù)渲染後的網(wǎng)頁,與build 不同,這裡會根據(jù)提供的routes 產(chǎn)生這些頁面的HTML 檔案。

取代瀏覽器 API

由於 Universal 應(yīng)用程式不是在瀏覽器中執(zhí)行,因此某些瀏覽器的 API 或功能將不可用。例如,服務(wù)端應(yīng)用程式是無法使用瀏覽器中的全域物件 window、documentnavigator,location。

Angular 提供了兩個可注入對象,用於在服務(wù)端替換對等的對象:LocationDOCUMENT。

例如,在瀏覽器中,我們透過window.location.href 取得目前瀏覽器的位址,而改成SSR 之後,程式碼如下:

import { Location } from '@angular/common';
 
export class AbmNavbarComponent implements OnInit{
  // ctor 中注入 Location
  constructor(private _location:Location){
    //...
  }
 
  ngOnInit() {
    // 打印當(dāng)前地址
    console.log(this._location.path(true));
  }
}

同樣,對於在瀏覽器使用document.getElementById() 取得DOM 元素,在改成SSR 之後,程式碼如下:

import { DOCUMENT } from '@angular/common';
 
export class AbmFoxComponent implements OnInit{
  // ctor 中注入 DOCUMENT
  constructor(@Inject(DOCUMENT) private _document: Document) { }
 
  ngOnInit() {
    // 獲取 id 為 fox-container 的 DOM
    const container = this._document.getElementById('fox-container');
  }
}

使用 URL 絕對地址

在 Angular SSR 應(yīng)用中,HTTP 請求的 URL 地址必須為 絕對地址(即,以 http/https 開頭的地址,不能是相對地址,如 /api/heros)。Angular 官方推薦將請求的 URL 全路徑設(shè)置到 renderModule()renderModuleFactory()options 參數(shù)中。但是在 v14 自動生成的代碼中,并沒有顯式調(diào)用這兩個方法的代碼。而通過讀 Http 請求的攔截,也可以達(dá)到同樣的效果。

下面我們先準(zhǔn)備一個攔截器,假設(shè)文件位于項目的 shared/universal-relative.interceptor.ts 路徑:

import { HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';
import { Inject, Injectable, Optional } from '@angular/core';
import { REQUEST } from '@nguniversal/express-engine/tokens';
import { Request } from 'express';
 
// 忽略大小寫檢查
const startsWithAny = (arr: string[] = []) => (value = '') => {
    return arr.some(test => value.toLowerCase().startsWith(test.toLowerCase()));
};
 
// http, https, 相對協(xié)議地址
const isAbsoluteURL = startsWithAny(['http', '//']);
 
@Injectable()
export class UniversalRelativeInterceptor implements HttpInterceptor {
    constructor(@Optional() @Inject(REQUEST) protected request: Request) { }
 
    intercept(req: HttpRequest<any>, next: HttpHandler) {
        // 不是絕對地址的 URL
        if (!isAbsoluteURL(req.url)) {
            let protocolHost: string;
            if (this.request) {
                // 如果注入的 REQUEST 不為空,則從注入的 SSR REQUEST 中獲取協(xié)議和地址
                protocolHost = `${this.request.protocol}://${this.request.get(
                    &#39;host&#39;
                )}`;
            } else {
                // 如果注入的 REQUEST 為空,比如在進(jìn)行 prerender build:
                // 這里需要添加自定義的地址前綴,比如我們的請求都是從 abmcode.com 來。
                protocolHost = &#39;https://www.abmcode.com&#39;;
            }
            const pathSeparator = !req.url.startsWith(&#39;/&#39;) ? &#39;/&#39; : &#39;&#39;;
            const url = protocolHost + pathSeparator + req.url;
            const serverRequest = req.clone({ url });
            return next.handle(serverRequest);
 
        } else {
            return next.handle(req);
        }
    }
}

然后在 app.server.module.ts 文件中 provide 出來:

import { UniversalRelativeInterceptor } from &#39;./shared/universal-relative.interceptor&#39;;
// ... 其他 imports

@NgModule({
  imports: [
    AppModule,
    ServerModule,
    // 如果你用了 @angular/flext-layout,這里也需要引入服務(wù)端模塊
    FlexLayoutServerModule, 
  ],
  providers: [
    {
      provide: HTTP_INTERCEPTORS,
      useClass: UniversalRelativeInterceptor,
      multi: true
    }
  ],
  bootstrap: [AppComponent],
})
export class AppServerModule { }

這樣任何對于相對地址的請求都會自動轉(zhuǎn)換為絕對地址請求,在 SSR 的場景下不會再出問題。

Prerender 預(yù)渲染靜態(tài) HTML

經(jīng)過上面的步驟后,如果我們通過 npm run build:ssr 構(gòu)建項目,你會發(fā)現(xiàn)在 dist/<your project>/browser 下面只有 index.html 文件,打開文件查看,發(fā)現(xiàn)其中還有 <app-root></app-root> 這樣的元素,也就是說你的網(wǎng)頁內(nèi)容并沒有在 html 中生成。這是因為 Angular 使用了動態(tài)路由,比如 /product/:id 這種路由,而頁面的渲染結(jié)果要經(jīng)過 JS 的執(zhí)行才能知道,因此,Angular 使用了 Express 作為 Web 服務(wù)器,能在服務(wù)端運行時根據(jù)用戶請求(爬蟲請求)使用模板引擎生成靜態(tài) HTML 界面。

prerendernpm run prerender)會在構(gòu)建時生成靜態(tài) HTML 文件。比如我們做企業(yè)官網(wǎng),只有幾個頁面,那么我們可以使用預(yù)渲染技術(shù)生成這幾個頁面的靜態(tài) HTML 文件,避免在運行時動態(tài)生成,從而進(jìn)一步提升網(wǎng)頁的訪問速度和用戶體驗。

預(yù)渲染路徑配置

需要進(jìn)行預(yù)渲染(預(yù)編譯 HTML)的網(wǎng)頁路徑,可以有幾種方式進(jìn)行提供:

  • 通過命令行的附加參數(shù):

    ng run <app-name>:prerender --routes /product/1 /product/2
  • 如果路徑比較多,比如針對 product/:id 這種動態(tài)路徑,則可以使用一個路徑文件:

    routes.txt

    /products/1
    /products/23
    /products/145
    /products/555

    然后在命令行參數(shù)指定該文件:

    ng run <app-name>:prerender --routes-file routes.txt
  • 在項目的 angular.json 文件配置需要的路徑:

     "prerender": {
       "builder": "@nguniversal/builders:prerender",
       "options": {
         "routes": [ // 這里配置
           "/",
           "/main/home",
           "/main/service",
           "/main/team",
           "/main/contact"
         ]
       },

配置完成后,重新執(zhí)行預(yù)渲染命令(npm run prerender 或者使用命令行參數(shù)則按照上面<1><2>中的命令執(zhí)行),編譯完成后,再打開 dist/<your project>/browser 下的 index.html 會發(fā)現(xiàn)里面沒有 <app-root></app-root> 了,取而代之的是主頁的實際內(nèi)容。同時也生成了相應(yīng)的路徑目錄以及各個目錄下的 index.html 子頁面文件。

SEO 優(yōu)化

SEO 的關(guān)鍵在于對網(wǎng)頁 titlekeywordsdescription 的收錄,因此對于我們想要讓搜索引擎收錄的網(wǎng)頁,可以修改代碼提供這些內(nèi)容。

在 Angular 14 中,如果路由界面通過 Routes 配置,可以將網(wǎng)頁的靜態(tài) title 直接寫在路由的配置中:

{ path: &#39;home&#39;, component: AbmHomeComponent, title: &#39;<你想顯示在瀏覽器 tab 上的標(biāo)題>&#39; },

另外,Angular 也提供了可注入的 TitleMeta 用于修改網(wǎng)頁的標(biāo)題和 meta 信息:

import { Meta, Title } from &#39;@angular/platform-browser&#39;;
 
export class AbmHomeComponent implements OnInit {
 
  constructor(
    private _title: Title,
    private _meta: Meta,
  ) { }
 
  ngOnInit() {
    this._title.setTitle(&#39;<此頁的標(biāo)題>&#39;);
    this._meta.addTags([
      { name: &#39;keywords&#39;, content: &#39;<此頁的 keywords,以英文逗號隔開>&#39; },
      { name: &#39;description&#39;, content: &#39;<此頁的描述>&#39; }
    ]);
  }
}

總結(jié)

Angular 作為 SPA 企業(yè)級開發(fā)框架,在模塊化、團(tuán)隊合作開發(fā)方面有自己獨到的優(yōu)勢。在進(jìn)化到 v14 這個版本中提供了不依賴 NgModule 的獨立 Component 功能,進(jìn)一步簡化了模塊化的架構(gòu)。

Angular Universal 主要關(guān)注將 Angular App 如何進(jìn)行服務(wù)端渲染和生成靜態(tài) HTML,對于用戶交互復(fù)雜的 SPA 并不推薦使用 SSR。針對頁面數(shù)量較少、又有 SEO 需求的網(wǎng)站或系統(tǒng),則可以考慮使用 Universal 和 SSR 技術(shù)。

更多編程相關(guān)知識,請訪問:編程教學(xué)??!

以上是一文探究Angular中的服務(wù)端渲染(SSR)的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
如何在Ubuntu 24.04上安裝Angular 如何在Ubuntu 24.04上安裝Angular Mar 23, 2024 pm 12:20 PM

Angular.js是一種可自由存取的JavaScript平臺,用於建立動態(tài)應(yīng)用程式。它允許您透過擴(kuò)展HTML的語法作為模板語言,以快速、清晰地表示應(yīng)用程式的各個方面。 Angular.js提供了一系列工具,可協(xié)助您編寫、更新和測試程式碼。此外,它還提供了許多功能,如路由和表單管理。本指南將討論在Ubuntu24上安裝Angular的方法。首先,您需要安裝Node.js。 Node.js是一個基於ChromeV8引擎的JavaScript運行環(huán)境,可讓您在伺服器端執(zhí)行JavaScript程式碼。要在Ub

淺析angular中怎麼使用monaco-editor 淺析angular中怎麼使用monaco-editor Oct 17, 2022 pm 08:04 PM

angular中怎麼使用monaco-editor?以下這篇文章記錄下最近的一次業(yè)務(wù)中用到的 m??onaco-editor 在 angular 中的使用,希望對大家有幫助!

如何使用PHP和Angular進(jìn)行前端開發(fā) 如何使用PHP和Angular進(jìn)行前端開發(fā) May 11, 2023 pm 04:04 PM

隨著網(wǎng)路的快速發(fā)展,前端開發(fā)技術(shù)也不斷改進(jìn)與迭代。 PHP和Angular是兩種廣泛應(yīng)用於前端開發(fā)的技術(shù)。 PHP是一種伺服器端腳本語言,可以處理表單、產(chǎn)生動態(tài)頁面和管理存取權(quán)限等任務(wù)。而Angular是一種JavaScript的框架,可以用來開發(fā)單一頁面應(yīng)用程式和建構(gòu)元件化的網(wǎng)頁應(yīng)用程式。本篇文章將介紹如何使用PHP和Angular進(jìn)行前端開發(fā),以及如何將它們

angular學(xué)習(xí)之詳解狀態(tài)管理器NgRx angular學(xué)習(xí)之詳解狀態(tài)管理器NgRx May 25, 2022 am 11:01 AM

這篇文章帶大家深入了解angular的狀態(tài)管理器NgRx,介紹一下NgRx的使用方法,希望對大家有幫助!

一文探究Angular中的服務(wù)端渲染(SSR) 一文探究Angular中的服務(wù)端渲染(SSR) Dec 27, 2022 pm 07:24 PM

你知道 Angular Universal 嗎?可以幫助網(wǎng)站提供更好的 SEO 支援哦!

使用Angular和Node進(jìn)行基於令牌的身份驗證 使用Angular和Node進(jìn)行基於令牌的身份驗證 Sep 01, 2023 pm 02:01 PM

身份驗證是任何網(wǎng)路應(yīng)用程式中最重要的部分之一。本教程討論基於令牌的身份驗證系統(tǒng)以及它們與傳統(tǒng)登入系統(tǒng)的差異。在本教程結(jié)束時,您將看到一個用Angular和Node.js編寫的完整工作演示。傳統(tǒng)身份驗證系統(tǒng)在繼續(xù)基於令牌的身份驗證系統(tǒng)之前,讓我們先來看看傳統(tǒng)的身份驗證系統(tǒng)。使用者在登入表單中提供使用者名稱和密碼,然後點擊登入。發(fā)出請求後,透過查詢資料庫在後端驗證使用者。如果請求有效,則使用從資料庫中獲取的使用者資訊建立會話,然後在回應(yīng)頭中傳回會話訊息,以便將會話ID儲存在瀏覽器中。提供用於存取應(yīng)用程式中受

Angular元件及其顯示屬性:了解非block預(yù)設(shè)值 Angular元件及其顯示屬性:了解非block預(yù)設(shè)值 Mar 15, 2024 pm 04:51 PM

Angular框架中元件的預(yù)設(shè)顯示行為不是區(qū)塊級元素。這種設(shè)計選擇促進(jìn)了元件樣式的封裝,並鼓勵開發(fā)人員有意識地定義每個元件的顯示方式。透過明確設(shè)定CSS屬性 display,Angular組件的顯示可以完全控制,從而實現(xiàn)所需的佈局和響應(yīng)能力。

專案過大怎麼辦?如何合理拆分Angular項目? 專案過大怎麼辦?如何合理拆分Angular項目? Jul 26, 2022 pm 07:18 PM

Angular專案過大,怎麼合理拆分它?以下這篇文章跟大家介紹一下合理分割A(yù)ngular專案的方法,希望對大家有幫助!

See all articles