现在有点像是着了魔一样,又或是写 JAVA 写出啥毛病,无论搞什么都会想着扩展,整点插件化,留点扩展接口什么的。
在[之前](https://blog.thetbw.xyz/archives/plugin-system-by-pl4j),我给当时写的游戏面板按照插件化的思路,对不同游戏进行灵活配置,具体项目已经正式上线了,可以[这里](https://www.tyteam.net/)查看,虽然后面我没有在这继续开发,但这又是另外一回事了,后面可以展开说说。
最近我想写一个 JVM 工具,可以查看 JVM 情况,对内存进行分析,通过 Java Agent 对进程进行操作,Class 处理等等,能做的想想还挺多,就像是给 [Arthas](https://arthas.aliyun.com/doc/) 做了一个图形界面一样。
一开始肯定不能实现全部的功能,所以我想通过插件的方式扩展,在此之前,我写过一个 [jdbc-monitor](https://github.com/thetbw/monitor-jdbc),用于监控java应用的sql执行情况,也不完善就是。
--- 
之前的插件化多少有一点问题,就是他们每个插件都是一个单独的页面,在一个Web Iframe 中展示,能切入的点有点少,Iframe 还存在跨域问题。
我有想过能不能有一套插件,可以控制逻辑和显示,有一套多端可用的自定义 UI,然后通过接口暴露给插件,同时也可以控制插件的行为,限制权限。
所以我在想参考一下别的系统的插件设计。 
###  Halo
halo 的插件还是有很多可以学习的,毕竟我也是搞 Java 的,Pl4j 也是从它这里或的了一些灵感,不过它的自定义数据结构我还是没搞懂,感觉挺有意思的,后面可以学学,在[这个地方](https://docs.halo.run/developer-guide/plugin/api-reference/server/extension)。
我主要关注的还是 UI,他这个把 Vue 打包成单个 Js,把 Vue 的 Component 也都是放一起,然后留一个入口,注册 Component。
```javascript
import { definePlugin } from "@halo-dev/console-shared";
export default definePlugin({
  components: {},
  routes: [],
  ucRoutes: [],
  extensionPoints: {}
});
```
但是这种没法对 Js 做权限限制吧,会不会有安全问题,例如一个恶意插件,是可以获取到 Token 修改页面等的。
### 懒猫微服
后台我又看了看这种 Nas 系统的,他们的[文档在这](https://developer.lazycat.cloud/app-example-python.html),想看看他们怎么实现多个应用的,后来才发现,就是启动了多个 Docker 容器,页面用 Nginx 反代,然后应该还是每个用 Iframe 之类的隔离
### Vscode
后来突然想到了 Vscode,Vscode可以自定义 UI,同时存在与多端,后来看到 vscode其实也是一个 `setWebview` 之类的 ,和我当初想到的差不多,所以还是用我之前的思路吧。
### Zed
最后说一下 Zed , 一个新兴的编辑器吧,它的插件能实现的功能不算多,不能自定义 UI,不过由于是 Rust 写的原生 UI,速度非常快。它的扩展也是由 Rust 写的,最后编译成 Wasm ,由此就可以跨平台使用了,Wasm 真是个不错的主意,也能在 Web 上使用,如果能实现一套渲染 Api,可以在 Wasm内渲染 UI,就更好了。
--- 
这次写的有点乱,本身就是前段时间突然想到的折腾过程,后面也不一定搞这个东西,研究了一会,本来是打算把我的这个 TODO 事项划掉的,但是又想到,正所谓 '思绪来的快,去的也快',自己的思考虽然也没带来什么,但这样消失也是太可惜了,不放就让他永久留在我的博客里,这正是博客存在的意义。
       
          插件化的思考
