我正在开发一个包含插件的MEAN堆栈应用程序。在服务器应用中,我设法使用fs.lstatSync()
和stat.isDirectory()
加载插件文件。我还设法使用/public
向公众公开每个插件的app.use( pluginPublicPath, express.static( pluginServerPath ));
目录。
现在我必须在angular app中注入每个插件的main-service.ts
。我正在使用标准的Typescript Angular 2服务,如下图所示。应用程序类使用system.js
导入,没什么特别的。
项目结构
project
└─── plugins
| └─── my-plugin
| | └─── server // Some server stuff, all ok here
| | └─── public // Managed to expose it in the browser
| | └─── main.ts
| | └─── ...
| └─── some-plugin
| | └─── server
| | └─── public
| └─── another-plugin
| └─── server
| └─── public
└─── server // The server app
| └─── ...
└─── public // The public angular app, nothing special, the usual files
| └─── services
| | └─── foo-service.ts
| | └─── ...
| └─── app.component.ts
| └─── main-module.ts
| └─── ...
└─── server.js
└─── package.json
└─── ...
FOO-service.ts
// Static file, known and fixed path, no trouble here
import { Injectable } from '@angular/core';
import { AnotherService } from './another-service'
@Injectable()
export class MyService {
constructor( private _anotherService: AnotherService ) {}
}
我可以在 app.component.ts 或 foo-service.ts 中插入插件的main-service.ts
,直接在{{1}中输入方法。
constructor()
我想要实现的是动态地从每个插件导入import { MyPluginMainService } from '../../plugins/my-plugin/public/main-service'
export class MyService {
constructor( private _myPluginMainService : MyPluginMainService ) {}
}
文件。基本上我想有一个插件框架按惯例加载插件,而不是配置。我追求这个设计是为了避免在项目中添加新插件时更改核心文件。与CMS如何自动检测插件类似。
我期望通过从服务器生成的列表中注入插件服务来实现此目的。服务器应用程序已经知道哪些插件可用并已启用。我该如何继续动态注入main-service.ts
?我可以通过plugins/some-plugin/main-service.ts
端点从服务器导出引导公共应用程序所需的文件名和文件路径列表。此外,还欢迎提供涵盖这种情况的代码示例。谢谢!
app.components.ts - 我的猜测......
api/modules
我还猜测 main-module.ts
modules.forEach( module => import { module.name } from module.path );
export class MyService {
constructor( ??? ) {}
}