# 共享子应用模块
有时候为了从分治的角度出发,子应用的业务逻辑经常维护在子应用内部。但是有时候往往会出现宿主希望使用子应用中的某个逻辑或者组件,但是又不希望重新拷贝一份代码的情况。
为了解决类似这种复用的问题, Alfa
中提供了一个 low level 的 API 帮你你共享子应用中的某些模块代码。这些被共享出去的模块被称为 exposedModule
。
# 子应用导出共享模块
首先你需要在子应用中的代码中利用 registerExposedModule
显示的声明你要导出的模块. 如下面的代码所示
import About from './About';
import restartECS from './restartECS'
import { registerExposedModule } from '@alicloud/console-os-react-portal';
// 注册子应用的模块
registerExposedModule('About', About);
registerExposedModule('restart', restartECS);
# 宿主消费共享模块
然后你可以通过 loadExposedModule
的方法来在宿主中消费子应用中的注册的模块,如下所示。
// 宿主
const appInfo = {
id: 'os-example',
manifest: 'http://g.alicdn.com/ConsoleOS/OSExample/0.0.5/os-example.manifest.json'
}
// 使用组件
const About = lazy<React.FC<{test: string}>>(
() => loadExposedModule(appInfo, 'About').then((c) => ({ default: c }))
);
// 使用导出函数
const restartServer = async () => {
const restartECS = await loadExposedModule(appInfo, 'restart');
restartECS(/*instanceID*/)
}
const App = () => {
return (
<>
<Suspense fallback={<div>loading</div>}>
<About test="1" />
</Suspense>
</>
)
}
这个例子中,我们消费了子应用中导出的一个组件,一个方法。对于 React 组件我们可以利用 lazy
& Suspense
来消费。 对于一般的方法就可以直接调用方法的形式来使用。