使用?Angular?服務(wù)器端渲染?Transfer?State?Service
假設(shè)我們使用 Angular Universal 開發(fā)一個服務(wù)器端渲染的 Angular 應(yīng)用,這個應(yīng)用會消費一個第三方的 Restful API.
上述場景分為下列六個步驟:
- 用戶向部署了 Angular 服務(wù)器端應(yīng)用的 Node.js 服務(wù)器發(fā)起頁面請求
- Node.js 調(diào)用第三方 Restful API,
- 第三方 Restful API 返回結(jié)果,這個結(jié)果被用于渲染最后的頁面
- 服務(wù)器端渲染的頁面,返回給瀏覽器
- Angular 在瀏覽器中引導,并再次調(diào)用 Restful API
- Restful API 返回給瀏覽器,Angular 客戶端應(yīng)用重新將數(shù)據(jù)渲染到視圖中。

我們可以通過創(chuàng)建 TransferState 服務(wù)來提高應(yīng)用程序的效率,該服務(wù)是在 Node.js 服務(wù)器和瀏覽器中呈現(xiàn)的應(yīng)用程序之間交換的一個鍵值注冊表。
我們將通過一個 HTTP_INTERCEPTOR 機制來使用它,該機制將駐留在 HttpClient 服務(wù)中,并將操縱請求和響應(yīng)。
創(chuàng)建一個新的 class,實現(xiàn) HttpInterceptor 接口定義的 intercept 方法:
@Injectable({
providedIn: 'root'
})
export class HttpInterceptorService implements HttpInterceptor
public intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>>
每當對 HttpClient 服務(wù)執(zhí)行任何 API 調(diào)用時,都會調(diào)用此方法。
為了簡單起見,我們僅針對 GET 方法啟用 TransferState:
if (request.method !== 'GET') {
return next.handle(request);
}我們根據(jù) GET 請求的 URL 生成一個密鑰。 我們將使用鍵值對來存儲或檢索請求響應(yīng),具體取決于請求是在服務(wù)器端還是瀏覽器端處理:
const key: StateKey<string> = makeStateKey<string>(request.url);
為了區(qū)分服務(wù)器和瀏覽器運行環(huán)境,我們使用@angular/common庫中的 isPlatformServer 方法以及 PLATFORM_ID 注入令牌:
if (isPlatformServer(this.platformId)) {
//serverSide
} else {
//browserSide
}當服務(wù)器端渲染時,我們將 API 結(jié)果寫入 Transfer State 注冊表中:
if (isPlatformServer(this.platformId)) {
return next.handle(request).pipe(tap((event) => {
this.transferState.set(key, (<HttpResponse<any>> event).body);
}));在瀏覽器端代碼中,我們要檢查給定 HTTP 請求的響應(yīng)是否已經(jīng)駐留在 Transfer State 注冊表中。 如果存在,我們直接從注冊表中取出值,并清除注冊表,以便將來的調(diào)用可以存儲新數(shù)據(jù),并將響應(yīng)返回給調(diào)用者。
當且僅當注冊表中不存在給定的鍵,我們才在客戶端環(huán)境下執(zhí)行 HTTP 調(diào)用。
else {
const storedResponse = this.transferState.get<any>(key, null);
if (storedResponse) {
const response = new HttpResponse({body: storedResponse, status: 200});
this.transferState.remove(key);
return of(response);
} else {
return next.handle(request);
}
}到此這篇關(guān)于使用 Angular 服務(wù)器端渲染 Transfer State Service的文章就介紹到這了,更多相關(guān) Angular Transfer State Service內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一文詳解JavaScript中的事件循環(huán)(event?loop)機制
JavaScript中的事件循環(huán)(Event?Loop)是一種重要的機制,用于管理異步代碼的執(zhí)行,它確保?JavaScript?單線程環(huán)境中的任務(wù)按照正確的順序執(zhí)行,同時允許異步操作如定時器、網(wǎng)絡(luò)請求和事件處理,本將給大家詳細的介紹一下JavaScript事件循環(huán)機制,感興趣的朋友可以參考下2023-12-12
基于aotu.js實現(xiàn)微信自動添加通訊錄中的聯(lián)系人功能
這篇文章主要介紹了利用aotu.js實現(xiàn)微信自動添加通訊錄中的聯(lián)系人,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05
javascript中一些數(shù)組常用的API總結(jié)
Js中數(shù)組是一個重要的數(shù)據(jù)結(jié)構(gòu),它相比于字符串有更多的方法,本篇文章總結(jié)了一些數(shù)組中常用的API,我們把它們分成兩類,一類是會改變原始數(shù)組,一類是不會改變原始數(shù)組,感興趣的小伙伴可以學習一下2023-09-09
Bootstrap導航菜單點擊后無法自動添加active的處理方法
今天小編就為大家分享一篇Bootstrap導航菜單點擊后無法自動添加active的處理方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08
javascript 上下banner替換具體實現(xiàn)
這篇文章介紹了javascript 上下banner替換具體實現(xiàn),有需要的朋友可以參考一下2013-11-11
uni-app多環(huán)境配置實現(xiàn)自動部署的方式詳解
前后端分離開發(fā)模式中,無論前后端都有可能區(qū)分不同的環(huán)境配置,下面這篇文章主要給大家介紹了關(guān)于uni-app多環(huán)境配置實現(xiàn)自動部署的相關(guān)資料,需要的朋友可以參考下2022-06-06

