SPA和伺服器端轉譯 spa-and-server-side-rendering

NOTE
對於需要以SPA框架為基礎的使用者端轉譯(例如React或Angular)專案,建議使用SPA編輯器解決方案。
NOTE
如本檔案所述,需要Adobe Experience Manager (AEM) 6.5.1.0或更新版本才能使用SPA伺服器端轉譯功能。

概觀 overview

單頁應用程式(SPA)可為使用者提供豐富的動態體驗,以熟悉的方式反應和行為,通常就像原生應用程式一樣。 這是藉由依賴使用者端先載入內容,然後處理使用者互動的繁重工作,藉此將使用者端與伺服器之間所需的通訊量降到最低,讓應用程式更具反應性。

不過,這可能會導致較長的初始載入時間,尤其是當SPA較大且內容豐富時。 為了最佳化載入時間,部分內容可以在伺服器端轉譯。 使用伺服器端轉譯(SSR)可以加速頁面的初始載入,然後將進一步的轉譯傳遞給使用者端。

何時使用SSR when-to-use-ssr

並非所有專案都需要SSR。 雖然AEM完全支援適用於SPA的JS SSR,但Adobe不建議將其系統地實作到每個專案。

決定實作SSR時,您必須先估計增加SSR對專案實際代表的其他複雜性、工作量和成本,包括長期維護。 只有在增加值明顯超過預估成本時,才應選擇SSR架構。

SSR通常會在下列任一問題明確為「是」時提供某些值:

  • SEO: ​您的網站是否仍需要SSR才能由帶來流量的搜尋引擎正確編制索引? 請記住,主要搜尋引擎編目程式現在會評估JS。
  • 頁面速度: SSR是否能在真實環境中提供可衡量的速度提升,並增加整體使用者體驗?

只有當這兩個問題中至少有一個問題得到明確的「是」回答時,Adobe才會建議實作SSR。 以下幾節將說明如何使用Adobe I/O Runtime執行此操作。

Adobe I/O Runtime adobe-i-o-runtime

如果您確信您的專案需要實作SSR,Adobe建議的解決方案是使用Adobe I/O Runtime。

如需Adobe I/O Runtime的詳細資訊,請參閱下列內容:

以下章節詳細說明如何使用Adobe I/O Runtime在兩種不同的模型中為您的SPA實作SSR:

NOTE
Adobe建議每個環境使用個別的Adobe I/O Runtime工作區(預備、生產、測試等)。 這允許典型的系統開發生命週期(SDLC)模式,以及部署至不同環境的單一應用程式不同版本。 如需詳細資訊,請參閱檔案專案App Builder應用程式的CI/CD
除非每個執行個體型別的執行階段實施有所差異,否則不需要為每個執行個體(作者、發佈)使用個別的工作區。

遠端轉譯器設定 remote-renderer-configuration

AEM必須知道可在何處擷取遠端呈現的內容。 無論您選擇為SSR實作哪種模型,,都需要向AEM指定如何存取此遠端轉譯服務。

這是透過​ RemoteContentRenderer - Configuration Factory OSGi服務 ​完成的。 在http://<host>:<port>/system/console/configMgr的Web主控台組態主控台中搜尋字串「RemoteContentRenderer」。

轉譯器組態

下列欄位可供設定使用:

  • 內容路徑模式 — 符合部分內容的規則運算式(如有必要)
  • 遠端端點URL — 負責產生內容的端點URL
    • 若不在本機網路中,請使用安全的HTTPS通訊協定。
  • 其他要求標頭 — 要新增至傳送至遠端端點之要求的其他標頭
    • 模式: key=value
  • 要求逾時 — 遠端主機要求逾時(毫秒)
NOTE
無論您選擇實作AEM導向的通訊流程Adobe I/O Runtime導向的流程,您都必須定義遠端內容轉譯器組態。
如果您選擇使用自訂Node.js伺服器,也必須定義此組態。
NOTE
此設定使用遠端內容轉譯器,它具有其他可用的擴充和自訂選項。

AEM導向的通訊流程 aem-driven-communication-flow

使用SSR時,AEM中SPA的元件互動工作流程包含在Adobe I/O Runtime上產生應用程式初始內容的階段。

  1. 瀏覽器向AEM要求SSR內容。

  2. AEM會將模型發佈至Adobe I/O Runtime。

  3. Adobe I/O Runtime會傳回產生的內容。

  4. AEM透過後端頁面元件的HTL範本,提供Adobe I/O Runtime傳回的HTML。

server-side-rendering-cms-drivenaemnode-adobeio

Adobe I/O Runtime導向的通訊流程 adobe-i-o-runtime-driven-communication-flow

上一節將說明有關AEM中SPA之伺服器端轉譯的標準與建議實作,AEM在此會執行內容的自訂與提供。

或者,您也可以實作SSR,讓Adobe I/O Runtime負責啟動程式,有效反轉通訊流程。

這兩種模式都有效,並受到AEM支援。 不過,在實作特定模型之前,您應該先考量各別的優缺點。

Bootstrapping
優點
缺點
透過AEM
  • AEM會視需要管理插入程式庫
  • 僅在AEM
    上維護資源
  • SPA開發人員可能不熟悉
透過Adobe I/O Runtime
  • SPA開發人員更熟悉
  • AEM開發人員必須透過allowProxy屬性
    提供應用程式所需的Clientlib資源(例如CSS和JavaScript)
  • 資源必須在AEM與Adobe I/O Runtime
    之間同步
  • 若要啟用SPA的製作功能,可能需要Adobe I/O Runtime的Proxy伺服器

計畫SSR planning-for-ssr

只有部分應用程式必須呈現在伺服器端。 常見的範例是,在頁面初始載入時,顯示在摺疊上方的內容會在伺服器端轉譯。 這可傳送給使用者端已轉譯的內容,以節省時間。 當使用者與SPA互動時,其他內容會由使用者端轉譯。

當您考慮為SPA實作伺服器端轉譯時,請檢閱應用程式的哪些部分有必要。

使用SSR開發SPA developing-an-spa-using-ssr

SPA元件可由使用者端(在瀏覽器中)或伺服器端轉譯。 在轉譯伺服器端時,不會出現瀏覽器屬性,例如視窗大小和位置。 因此,SPA元件應同構,不對其呈現位置做任何假設。

若要使用SSR,請在AEM和Adobe I/O Runtime上部署您的程式碼,由伺服器端轉譯。 大部分的程式碼將相同,但伺服器特定的工作將有所不同。

AEM中SPA的SSR ssr-for-spas-in-aem

AEM中SPA的SSR需要Adobe I/O Runtime,此模組用於轉譯應用程式內容伺服器端。 在應用程式的HTL中,會呼叫Adobe I/O Runtime上的資源來呈現內容。

就像AEM可立即支援Angular和React SPA架構一樣,Angular和React應用程式也支援伺服器端轉譯。 如需詳細資訊,請參閱這兩個架構的NPM檔案。

如需簡單化的範例,請參閱We.Retail日誌應用程式。 它會呈現整個應用程式伺服器端。 雖然這不是真實世界的範例,但它的確說明了實施SSR所需的條件。

CAUTION
We.Retail日誌應用程式僅供示範之用,因此使用Node.js做為簡單範例,而非建議的Adobe I/O Runtime。 請勿將此範例用於任何專案工作。
NOTE
任何 AEM 專案都應使用 AEM 專案原型,它支援使用 React 或 Angular 的 SPA 專案並使用 SPA SDK。

使用Node.js using-node-js

Adobe I/O Runtime是在AEM中為SPA實作SSR的建議解決方案。

對於內部部署AEM例項,也可以使用自訂Node.js例項以上述相同方式實作SSR。 雖然Adobe支援此功能,但不建議使用。

NOTE
Adobe託管的AEM執行個體不支援Node.js。
NOTE
如果必須透過Node.js實作SSR,Adobe建議為每個AEM環境(作者、發佈、階段等)個別建立Node.js例項。

遠端內容轉譯器 remote-content-renderer

在AEM中搭配使用SSR與SPA所需的遠端內容轉譯器組態,會進入更一般的轉譯服務,您可以擴充和自訂這些服務,以符合您的需求。

RemoteContentRenderingService remotecontentrenderingservice

RemoteContentRenderingService是OSGi服務,用於擷取遠端伺服器上呈現的內容,例如從Adobe I/O。傳送至遠端伺服器的內容是根據傳遞的請求引數。

當需要額外的內容操作時,RemoteContentRenderingService可以透過相依性反轉插入到自訂Sling模型或servlet中。

此服務是由RemoteContentRendererRequestHandlerServlet在內部使用。

RemoteContentRendererRequestHandlerServlet remotecontentrendererrequesthandlerservlet

RemoteContentRendererRequestHandlerServlet可用來以程式設計方式設定要求組態。 DefaultRemoteContentRendererRequestHandlerImpl (提供的預設要求處理常式實作)可讓您建立多個OSGi設定,以將內容結構中的位置對應至遠端端點。

若要新增自訂要求處理常式,請實作RemoteContentRendererRequestHandler介面。 請務必將Constants.SERVICE_RANKING元件屬性設為大於100的整數,這是DefaultRemoteContentRendererRequestHandlerImpl的排名。

@Component(immediate = true,
        service = RemoteContentRendererRequestHandler.class,
        property={
            Constants.SERVICE_RANKING +":Integer=1000"
        })
public class CustomRemoteContentRendererRequestHandlerImpl implements RemoteContentRendererRequestHandler {}

設定預設處理常式的OSGi設定 configure-default-handler

預設處理常式的組態必須依照區段遠端內容轉譯器組態中的說明進行設定。

遠端內容轉譯器使用情形 usage

若要讓servlet擷取並傳回部分可插入頁面的內容:

  1. 確定您的遠端伺服器可以存取。
  2. 將下列其中一個片段新增至AEM元件的HTL範本。
  3. 選擇性地建立或修改OSGi設定。
  4. 瀏覽網站內容

通常,頁面元件的HTL範本是這類功能的主要收件者。

<sly data-sly-resource="${resource @ resourceType='cq/remote/content/renderer/request/handler'}" />

要求 requirements

此servlet會使用Sling模型匯出工具來序列化元件資料。 依預設,com.adobe.cq.export.json.ContainerExportercom.adobe.cq.export.json.ComponentExporter都支援作為Sling模型介面卡。 如有必要,您可以新增類別,讓請求能夠調整為使用RemoteContentRendererServlet並實作RemoteContentRendererRequestHandler#getSlingModelAdapterClasses。 其他類別必須擴充ComponentExporter

recommendation-more-help
19ffd973-7af2-44d0-84b5-d547b0dffee2