为用户界面可扩展性创建项目

NOTE
本文假定您对软件开发工具有一定的了解。

要创建自定义UI扩展,您必须为其创建一个App Builder项目。

本页介绍如何使用aio命令行生成通用App Builder项目。 “通用”表示项目​ ​是从产品特定的模板开始的。 使用通用应用程序启动可以使项目变得简单,并且允许项目与Workfront Fusion连接。

熟悉以下有关创建项目以用于Adobe Fusion AI扩展性的概念和术语可能会很有用。

  • Adobe Developer Console (https://developer.adobe.com/console)是您的项目所在的Web仪表板。

  • 术语

    table 0-row-2 1-row-2 2-row-2 3-row-2 4-row-2
    术语 它的含义
    组织 您公司的Adobe组织。 与在Fusion中使用的组织相同。
    项目 一个应用程序/扩展的容器。 您将为扩展创建一个项目。
    工作区 工作阶段的项目配置副本。 每个项目都有一个​ 生产 ​工作区,并且您通常还使用​ 暂存 ​工作区进行测试。 想想像“环境”这样的工作区。
    凭据/服务 允许您的应用程序使用的权限。 为您创建的默认值足以启动。
  • 创建项目的方法有两种:

    • 自动(推荐):​命令aio app init在生成代码时为您创建项目和工作区。 本文介绍了此过程。
    • 手动:​您首先在Developer Console中自己创建项目,然后指向aio。 我们建议仅在您的组织要求集中创建项目时才执行此操作。
  • 在决定使用哪个工作区时,请先开发并部署到​阶段。 仅当用户在其Fusion配置文件(用户头像菜单>产品设置> Fusion配置文件>首选项>暂存扩展)中打开暂存测试时,Fusion才会加载暂存内部版本;否则,只显示已发布的生产扩展。 您还可以使用aio app run在本地预览,然后稍后升级到​生产

    有关提升至生产环境的详细信息,请参阅发布您的扩展

运行aio app init

  1. 打开终端。

  2. 在终端中,移至保留项目的文件夹。

  3. 运行:

    code language-sh
    aio app init my-fusion-extension --standalone-app
    
    • my-fusion-extension是文件夹/应用程序名称。 您可以选择此名称,但应使用小写字母、连字符且不能使用空格。
    • --standalone-app告知CLI创建​普通应用程序框架,而不是要求您选择产品模板。 这是避免AEM(或任何其他)模板的关键。
  4. 出现提示时,选择您的组织(如果您属于多个组织)。

  5. 出现提示时,选择​ 创建新项目 ​并接受建议的名称,或选择现有的空项目。

    该命令会自动设置​ 暂存 ​和​ 生产 ​工作区。

    该命令还会将文件生成到my-fusion-extension文件夹并运行npm install

  6. 继续确认项目创建

NOTE
如果您更喜欢交互式菜单:​请运行aio app init my-fusion-extension > (不带--standalone-app)。 当它询问​**“您要搜索什么模板?”** 或显示模板核对清单,请勿选择AEM等产品模板。 选择选项以创建​独立应用程序 / “所有扩展点→无”

检查项目创建

  1. 在终端中,移到已创建的文件夹:

    code language-sh
    cd my-fusion-extension
    

    您应该看到类似于下面的结构(省略了一些文件):

    code language-none
    my-fusion-extension/
    |--- app.config.yaml   // main configuration (you will edit this)
    |---  package.json   //dependencies and scripts
    |---  src/    // your source code
    |---  web-src/  or  src/.../web-src/  // front-end files (HTML/JS)
    

    您最关心的两个文件是:

    • app.config.yaml:中央配置。 在此过程的后续步骤中,您将在此处添加一个extensions:部分,以将您的应用程序连接到Fusion扩展点。
    • package.json:列出您的应用程序使用的库。 您将在此处添加Adobe UI可扩展性来宾库。
  2. 继续添加所需的库

TIP
如果生成的布局在CLI版本之间略有不同,请不要担心。 此过程可告知您确切要创建哪些文件以及要放置哪些文件,以便您可以匹配预期的结构,而不管起始点是什么。

添加所需的库

您的扩展需要两个库:

  • @adobe/uix-guest:允许您的应用程序与Fusion(主机)通信。
  • @adobe/react-spectrum: Adobe的React UI组件,因此您的屏幕与Adobe的外观相匹配。 (可选,但推荐;您可以改用纯HTML。)

要安装这些库,请执行以下操作:

  1. 在终端中,运行:

    code language-sh
    npm install @adobe/uix-guest @adobe/react-spectrum
    
  2. (视情况而定)如果您生成的项目尚未包含React,请同时安装以下组件:

    code language-sh
    npm install react react-dom react-router-dom
    
  3. 继续确认项目生成

确认项目生成

在更改任何内容之前,请确保生成空项目

  1. 在终端中,运行:

    code language-sh
    aio app build
    

    如果此操作完成且没有错误,则表示您的工具和项目已正确配置。 您已准备好将该项目连接到Fusion。

    note tip
    TIP
    如果生成失败,​最常见的原因是不支持的Node.js版本。 运行node --version并确保其为18或20。
  2. 继续为Fusion配置项目。

为Fusion配置项目

设置自定义扩展的下一步是将通用项目连接到Workfront Fusion。

您将会:

  1. 为扩展创建文件夹
  2. 告知App Builder有关Fusion 扩展点 (在app.config.yaml中)的信息。
  3. 描述扩展的片段(在ext.config.yaml中)。
  4. 注册​您的小组件,以便Fusion知道其标题及其UI所在的位置。

我们全程使用fusion/nav-organization/1。 若要改为定位团队分区,请在所有位置交换fusion/nav-team/1。 要同时支持这两者,请为每个重复该模式。

为扩展创建文件夹

  1. 创建文件,使项目如下所示:

    code language-none
    my-fusion-extension/
    |-- app.config.yaml
    |-- src/
           |-- fusion-nav-organization-1/          // one folder per extension point
              |-- ext.config.yaml
              |-- web-src/
                 |-- src/
                    |-- components/
                       |-- App.js
                       |-- ExtensionRegistration.js
                       |-- DashboardWidget.js
                       |-- Constants.js
    

    我们建议在扩展点(fusion-nav-organization-1)之后命名文件夹。 确切名称由您决定,但必须与您在app.config.yaml中引用的名称匹配。

  2. 继续app.config.yaml中声明扩展点。

app.config.yaml中声明扩展点

  1. 打开app.config.yaml并将其内容更新为:

    code language-yaml
    extensions:
      fusion/nav-organization/1:
        $include: src/fusion-nav-organization-1/ext.config.yaml
    

    这些内容描述如下:

    • extensions::此应用实现一个或多个扩展点。
    • fusion/nav-organization/1:您插入的Fusion插槽。 名称必须完全匹配,包括版本1
    • $include::这指向描述此扩展的内容的第二个配置文件(在下一步中创建)。 将其保留在单独的文件中可保持app.config.yaml整洁,并允许您稍后添加更多扩展点。
    note
    NOTE
    如果要定位这两个扩展,请列出这两个扩展,每个扩展都有自己的文件夹:
    code language-yaml
    extensions:
            fusion/nav-organization/1:
                $include: src/fusion-nav-organization-1/ext.config.yaml
            fusion/nav-team/1:
                $include: src/fusion-nav-team-1/ext.config.yaml
    
    1. 继续ext.config.yaml中描述扩展

描述ext.config.yaml中的扩展

  1. 使用以下方式创建src/fusion-nav-organization-1/ext.config.yaml

    code language-yaml
    operations:
       view:
        - type: web
          impl: index.html
    web: web-src
    hooks:
      pre-app-build: node node_modules/@adobe/uix-guest/scripts/generate-metadata.js
       pre-app-run: node node_modules/@adobe/uix-guest/scripts/generate-metadata.js
    

    这些内容描述如下:

    • operations.view:声明您的扩展提供了从index.html提供的​视图 (可见UI)。 正因如此,扩展才会显示屏幕,而不是仅在后台运行。
    • web: web-src:保存前端文件的文件夹。 App Builder在此构建所有内容,并将其托管在Adobe的内容交付网络(CDN)上。
    • hooks:在生成/运行时自动运行的小型命令。 generate-metadata.js脚本随@adobe/uix-guest提供,并生成您的注册代码所需的app-metadata.json文件(请参阅步骤4)。 你不写这个脚本,你只是引用它。
    note
    NOTE
    如果您还需要服务器端逻辑,还可以添加无服务器actions(小型后端函数)。 操作是可选的,并且无需进行渲染UI,因此我们将其排除在外,以便本指南保持重点。 如果稍后添加它们,请在此处声明一个actions:文件夹,并在app.config.yaml中声明一个runtimeManifest:。 添加一个函数的最常见原因是调用Workfront/Fusion API而不点击浏览器CORS。
    有关调用API的信息,请参阅调用Workfront和Fusion API
  2. 继续设置稳定的扩展ID

设置稳定的扩展ID

您的扩展需要两个框架共享的唯一ID。

有关与自定义扩展相关的框架的信息,请参阅UI扩展中包含的框架

  1. 创建src/fusion-nav-organization-1/web-src/src/components/Constants.js

    code language-js
    module.exports = {
      extensionId: 'my-fusion-extension'
    };
    

    在您的代码引用扩展ID的任何位置使用相同的值。

  2. 继续注册您的小组件

注册您的构件

“注册”是隐藏的背景框架告诉Fusion您的扩展所提供内容的方式。 您声明了一个dashboard.getWidget()方法,该方法返回您的小部件的标题及其可见UI的URL。

  1. 创建src/fusion-nav-organization-1/web-src/src/components/ExtensionRegistration.js
    重要部分是register(...)调用:

    code language-js
    import { register } from "@adobe/uix-guest";
    import metadata from "../../../../app-metadata.json";
    import { extensionId } from "./Constants";
    
    async function init() {
      await register({
        id: extensionId,
        metadata,
        methods: {
          dashboard: {
            getWidget() {
              return {
                id: extensionId,
                title: "My Fusion tool",        // shown on the Fusion nav button
                description: "What this tool does",
                url: "/index.html#/my-widget",  // route to your visible UI
                hideWidgetHeader: false          // false = Fusion shows the title
              };
            }
          }
        }
       });
    }
    
    init().catch(console.error);
    

    要点:

    • title​是Fusion放置在导航按钮上的标签。 如果hideWidgetHeaderfalse,Fusion还会将标题显示为您UI上方的标题。
    • url​是您在此同一应用程序中的​visible UI的路由。 此处是您的前端路由器(在下一页设置)处理的哈希路由(#/my-widget)。 它必须解析为呈现屏幕的组件。
    • metadata​来自app-metadata.jsongenerate-metadata挂接在生成时为您创建。 导入它,如下所示。
    • dashboard.getWidget方法名称是同意的合同Fusion调用,用于发现您的小组件。 保留dashboard命名空间和getWidget名称。

扩展的后端现已完成。 构建扩展UI的下一个步骤。

有关构建UI的说明,请参阅构建自定义扩展UI

recommendation-more-help
workfront-fusion-help-workfront-fusion