实用 API
简介
Backstage 插件力求自成一体,尽可能多的功能都在插件本身及其后端应用程序接口(API)中。 不过,插件总是需要在其边界之外与其他插件和应用程序本身进行通信。
Backstage 为插件提供了两种在客户端代码中跨边界通信的主要方法。 第一种是创建插件第二种是实用程序应用程序接口。创建插件应用程序接口(API)侧重于初始化插件和应用程序,而实用程序接口(Utility API)则为插件提供了在其整个生命周期内进行通信的方式。
使用应用程序接口
每个实用程序应用编程接口都与ApiRef实例是一个全局单例对象,没有任何附加状态或功能,其唯一用途是引用实用程序编程接口。ApiRef是使用创建 ApiRef由@backstage/core-plugin-api
中还有许多预定义的实用程序应用程序接口。@backstage/core-plugin-api
它们都以模式名称导出*ApiRef
例如errorApiRef
.
要访问 React 组件中的实用程序应用程序接口,请使用使用应用程序由@backstage/core-plugin-api
或有 Apis如果您喜欢类组件,请使用 HOC。ErrorApi可以这样访问
import React from 'react';
import { useApi, errorApiRef } from '@backstage/core-plugin-api';
export const MyComponent = () => {
const errorApi = useApi(errorApiRef);
// Signal to the app that something went wrong, and display the error to the user.
const handleError = error => {
errorApi.post(error);
};
// the rest of the component ...
};
注意ErrorApi这是因为errorApiRef
类 型为嵌入式,而使用应用程序就能推断出类型。
还要注意的是,使用实用程序编程接口并不局限于插件,Backstage的任何组件都可以使用,包括在@backstage/core-plugin-api
唯一的要求是,它们必须在AppProvider
在 React 树中。
提供应用程序接口
API 工厂
应用程序接口以ApiFactory实例,它封装了一个应用程序接口的实例化过程。 它是以下三项内容的集合:...ApiRef要实例化的 API 的名称、所有必要依赖项的列表,以及返回新 API 实例的工厂函数。
例如,默认情况下ApiFactory为ErrorApi:
createApiFactory({
api: errorApiRef,
deps: { alertApi: alertApiRef },
factory: ({ alertApi }) => {
const errorApi = new ErrorAlerter(alertApi, new ErrorApiForwarder());
UnhandledErrorForwarder.forward(errorApi, { hidden: false });
return errorApi;
},
});
在这个例子中errorApiRef
是我们的应用程序接口,它封装了ErrorApi类型警报 APIRef是我们的单一依赖项,我们将其命名为alertApi
的实现,然后传递给工厂函数,工厂函数返回ErrorApi.
创建 ApiFactory函数是一个瘦包装器,可以实现 TypeScript 类型推断。 您可能会注意到,上面的示例中没有类型注解,这是因为我们能够从ApiRef的返回值。factory
函数与api
'sApiRef在这种情况下ErrorApi它还会匹配deps
的参数,以及factory
函数,再次使用嵌入在ApiRefs.
注册应用程序接口工厂
向 Backstage 应用程序添加实用程序编程接口的责任在于三个不同的地方:Backstage 核心库、应用程序中包含的每个插件以及应用程序本身。
核心应用程序接口
从Backstage核心库开始,它提供了所有核心应用程序接口的实现。 核心应用程序接口是由@backstage/core-plugin-api
例如errorApiRef
和configigApiRef.
创建的任何应用程序都会加载核心应用程序接口。创建应用程序从@backstage/core-plugin-api
这意味着无 需采取任何步骤即可在应用程序中包含这些 API。
插件 API
除了核心 API 之外,插件还可以定义和导出自己的 API。 在这样做的同时,它们通常还应该提供自己 API 的默认实现,例如catalog
插件导出catalogApiRef
还提供了一个默认ApiFactory使用CatalogClient
插件提供的 API 工厂有一个限制:插件不得为核心 API 提供工厂,否则会导致应用程序无法启动。
插件通过apis
选项的创建插件例如
export const techdocsPlugin = createPlugin({
id: 'techdocs',
apis: [
createApiFactory({
api: techdocsStorageApiRef,
deps: { configApi: configApiRef },
factory({ configApi }) {
return new TechDocsStorageApi({
apiOrigin: configApi.getString('techdocs.storageUrl'),
});
},
}),
],
});
应用程序接口
最后,应用程序本身是添加应用程序接口的最终点,也是在运行时加载哪些应用程序接口的最终决定权所在。 应用程序可以覆盖任何核心或插件应用程序接口的工厂,但配置、应用程序主题和身份应用程序接口除外。 这些都是静态应用程序接口,绑定于创建应用程序因此无法覆盖。
重写应用程序接口(API)对于想要根据环境调整行为的应用程序来说非常有用。 在某些情况下,插件还可能导出多个相同应用程序接口(API)的实现,它们各自对后端存储和周围环境等有不同的要求。
向应用程序提供应用程序接口的工作原理与插件相同:
const app = createApp({
apis: [
/* ApiFactories */
],
// ... other options
});
一种常见的模式是从apis.ts
旁边App.tsx
见本软件仓库中的示例应用程序为例。