Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

开发调试 #75

Open
zyh2123606 opened this issue Jul 3, 2023 · 6 comments
Open

开发调试 #75

zyh2123606 opened this issue Jul 3, 2023 · 6 comments

Comments

@zyh2123606
Copy link

插件加载完在基座应用的其他组件中怎么使用插件视图,其次怎么在开发中和基座应用联动(热更新)

@moonrailgun
Copy link
Owner

一般来说要为了避免出现架构管理问题应当尽量避免插件之间相互调用,如果真的需要相互调用需要以url引用(类似deno)或者基座配置补全url的方式来实现插件间的相互引用

image

这两个参数选一


关于热更新,你可以通过watch动态编译插件,然后基座项目监听插件文件修改动作

@zyh2123606
Copy link
Author

可能是我没描述清楚,入口加载远程插件后,基座路由组件里怎么使用远程插件视图

@moonrailgun
Copy link
Owner

这个不属于ministar的范畴,需要自己实现。

具体实现方法很灵活,就和实现一个功能有多重方法一样没办法一一举例

以 Tailchat 的实现为例,插件把视图注册到基座项目暴露的对象中,然后基座在恰当的时候去加载这个对象里面的内容。


题外话,mini-star所代表的技术方案微内核架构是常规微前端的超集,即微内核架构可以实现微前端架构的功能,但是需要自己用代码补全部分逻辑。如果你想要的仅仅是通过路由去加载, 即一个页面只会有一个子应用,那么建议可以直接用微前端架构,减少重复的工作。

@zyh2123606
Copy link
Author

zyh2123606 commented Jul 4, 2023

我对这个库倒是很感兴趣,只是如果插件都是远程的,执行完initMiniStar({
plugins: [
{name: 'rhjc-web-main-plugin', url: 'http://localhost:8888/plugin/rhjc-web-main-plugin/index.js'}
]
})后项目里怎么使用rhjc-web-main-plugin这个插件呢,假如这个插件暴露了很多方法出来,我要怎么使用,现在window.__ministar_loadedModules['@plugins/rhjc-web-main-plugin']能暴露插件出来


I am very interested in this library, but if the plug-ins are all remote, after executing initMiniStar({
plugins: [
{name: 'rhjc-web-main-plugin', url: 'http://localhost:8888/plugin/rhjc-web-main-plugin/index.js'}
]
}) How to use the rhjc-web-main-plugin plugin in the later project? If this plugin exposes many methods, how do I use it? Now window.__ministar_loadedModules['@plugins/rhjc-web-main-plugin'] Can expose plugins

@moonrailgun
Copy link
Owner

为了架构考虑。这是一种单向依赖。在面向对象编程中我们常把这个操作称之为控制反转(ioc)

作为基座项目对于插件是无感知的,而插件是知道基座项目的存在的。如果你能理解ioc就很容易理解基座项目与插件的生存位了。

举个例子:

基座项目:

export const pluginMessage = []

regSharedModule('@capital/pluginMessage', () => Promise.resolve({ pluginMessage }))

initMiniStar(...).then(()=> {
  console.log("Print all message", pluginMessage )
})

插件1:

import { pluginMessage } from '@capital/pluginMessage';

pluginMessage.push('Plugin 1')

插件2:

import { pluginMessage } from '@capital/pluginMessage';

pluginMessage.push('Plugin 2')

通过 regSharedModule 或者 regDependency 将基座的内容暴露给插件,那么插件就可以拿到基座暴露的上下文实现一些操作。

然后基座再根据约定的协议在对插件无感知的基础上去使用插件注入的内容。

当然这种方式只是一种,ministar就是帮助开发者在两个不相干的项目中实现状态共享,以此来做到整体架构的独立干净

@zyh2123606
Copy link
Author

zyh2123606 commented Jul 4, 2023

谢谢🙏耐心解答


Thank you for answering patiently

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants