單頁應用程式 (SPA) 可為網站使用者提供引人入勝的體驗。開發人員希望能夠使用SPA架構建立網站,而作者則希望能夠順暢地編輯使用SPA架構建立之網站的AEM內容。
SPA製作功能提供全方位的解決方案,可支援AEM中的SPA。 本文介紹React架構上的簡化SPA應用程式,說明其如何組合,讓您快速啟動並執行自己的SPA。
本文章以React框架為基礎。 如需Angular架構的對應檔案,請參閱 AEM中的SPA快速入門 — Angular.
本文概述簡單的SPA的基本功能,以及您需要瞭解的最低運作要求。
如需SPA在AEM中運作方式的詳細資訊,請參閱下列檔案:
為了能夠在SPA內製作內容,內容必須儲存在AEM中,並由內容模型公開。
若在SPA外部開發的AEM不遵守內容模型合約,將無法編寫。
本檔案將逐步解說使用React架構建立的簡化SPA的結構,並說明其運作方式,以便您將這種瞭解套用至您自己的SPA。
除了預期的React相依性外,範例SPA還可以運用其他程式庫,以更有效率地建立SPA。
此 package.json
file定義整體SPA套件的需求。 此處列出作用中AEM的最小SPA相依性。
"dependencies": {
"@adobe/aem-react-editable-components": "~1.0.4",
"@adobe/aem-spa-component-mapping": "~1.0.5",
"@adobe/aem-spa-page-model-manager": "~1.0.3"
}
由於此範例是以React架構為基礎,因此中有兩個React專屬相依性 package.json
檔案:
react
react-dom
此 aem-clientlib-generator
會運用,以便在建置流程中自動建立使用者端程式庫。
"aem-clientlib-generator": "^1.4.1",
如需更多相關詳細資訊,請參閱 在此填入GitHub.
此 aem-clientlib-generator
已設定於 clientlib.config.js
檔案如下所示。
module.exports = {
// default working directory (can be changed per 'cwd' in every asset option)
context: __dirname,
// path to the clientlib root folder (output)
clientLibRoot: "./../content/jcr_root/apps/my-react-app/clientlibs",
libs: {
name: "my-react-app",
allowProxy: true,
categories: ["my-react-app"],
embed: ["my-react-app.responsivegrid"],
jsProcessor: ["min:gcc"],
serializationFormat: "xml",
assets: {
js: [
"dist/**/*.js"
],
css: [
"dist/**/*.css"
]
}
}
};
實際建立應用程式運用 網頁元件 用於整合,以及用於自動建立使用者端程式庫的aem-clientlib-generator。 因此, build指令將類似於:
"build": "webpack && clientlib --verbose"
建置後,可將套件上傳至AEM執行個體。
任何 AEM 專案都應利用 AEM 專案原型,它支援使用 React 或 Angular 的 SPA 專案並利用 SPA SDK。
如前所述,包含相依性並建置應用程式後,您將會擁有可上傳至AEM執行個體的有效SPA套件。
本檔案的下一節將引導您瞭解AEM中SPA的結構、驅動應用程式的重要檔案以及它們如何協同運作。
簡化的影像元件可作為範例,但應用程式的所有元件都以相同的概念為基礎。
進入SPA的入口點當然是 index.js
此處顯示的檔案已簡化,以專注於重要內容。
import ReactDOM from 'react-dom';
import App from './App';
import { ModelManager, Constants } from "@adobe/aem-spa-page-model-manager";
...
ModelManager.initialize().then((pageModel) => {
ReactDOM.render(
<App cqChildren={pageModel[Constants.CHILDREN_PROP]} cqItems={pageModel[Constants.ITEMS_PROP]} cqItemsOrder={pageModel[Constants.ITEMS_ORDER_PROP]} cqPath={ModelManager.rootPath} locationPathname={ window.location.pathname }/>
, document.getElementById('page'));
});
的主要功能 index.js
就是利用 ReactDOM.render
函式來判斷DOM中要插入應用程式的位置。
這是此函式的標準用法,並非此範例應用程式所特有。
使用元件範本(例如JSX)以靜態方式例項化元件時,必須將值從模型傳遞至元件的屬性。
透過轉譯應用程式, index.js
呼叫 App.js
,此處以簡化版顯示,著重於重要內容。
import {Page, withModel } from '@adobe/aem-react-editable-components';
...
class App extends Page {
...
}
export default withModel(App);
App.js
主要用於包住構成應用程式的根元件。 任何應用程式的進入點是頁面。
轉譯頁面時, App.js
呼叫 Page.js
此處以簡化版列出。
import {Page, MapTo, withComponentMappingContext } from "@adobe/aem-react-editable-components";
...
class AppPage extends Page {
...
}
MapTo('my-react-app/components/structure/page')(withComponentMappingContext(AppPage));
在此範例中 AppPage
類別擴充 Page
,其中包含後續可使用的內部內容方法。
此 Page
擷取頁面模型的JSON表示法,並處理內容以包裝/裝飾頁面的每個元素。 進一步詳細資訊,請參閱 Page
可以在檔案中找到 SPA Blueprint。
在轉譯頁面時,元件(例如 Image.js
如此處所示,皆可呈現。
import React, {Component} from 'react';
import {MapTo} from '@adobe/aem-react-editable-components';
require('./Image.css');
const ImageEditConfig = {
emptyLabel: 'Image',
isEmpty: function() {
return !this.props || !this.props.src || this.props.src.trim().length < 1;
}
};
class Image extends Component {
render() {
return (<img src={this.props.src}>);
}
}
MapTo('my-react-app/components/content/image')(Image, ImageEditConfig);
AEM中SPA的核心想法是將SPA元件對應至AEM元件,並在修改內容時更新元件(反之亦然)。 檢視檔案 SPA編輯器概觀 以取得此通訊模式的摘要。
MapTo('my-react-app/components/content/image')(Image, ImageEditConfig);
此 MapTo
方法會將SPA元件對應至AEM元件。 它支援使用單一字串或字串陣列。
ImageEditConfig
是組態物件,可為編輯器提供產生預留位置所需的中繼資料,進而協助您啟用元件的製作功能
如果沒有內容,則會提供標籤做為預留位置,以代表空白內容。
來自模型的資料會以元件屬性的形式動態傳遞。
您可以匯出元件並使其可編輯。
import React, { Component } from 'react';
import { MapTo } from '@adobe/aem-react-editable-components';
...
const EditConfig = {...}
class PageClass extends Component {...};
...
export default MapTo('my-react-app/react/components/structure/page')(PageClass, EditConfig);
此 MapTo
函式傳回 Component
這是延伸所提供之組合的結果 PageClass
類別名稱和屬性來啟用編寫功能。 此元件可匯出以稍後在應用程式的標籤中具現化。
使用匯出時 MapTo
或 withModel
函式, Page
元件,以 ModelProvider
讓標準元件可存取最新版本頁面模型或該頁面模型中的精確位置的元件。
如需詳細資訊,請參閱 SPA Blueprint檔案.
依預設,使用時您會收到元件的整個模型 withModel
函式。
單頁應用程式內的元件通常需要共用資訊。 有幾種建議的方法可以達成此目的,依複雜度遞增的順序列示如下。