Modularity Plugin
The Modularity Plugin provides two main features:
- Dynamic Module Loading
- Extensions System
Dynamic Module Loading
The Dynamic Module Loading system allows you to load Vue.js modules at runtime.
Usage
import { useDynamicModules } from '@framework/core/plugins/modularity';
import { createApp } from 'vue';
import { createRouter } from 'vue-router';
const app = createApp(App);
const router = createRouter(/ router config /);
const { load, extensionsHelper } = useDynamicModules(app, {
router,
appName: 'your-app-name'
},
{
baseUrl: 'https://your-modules-host.com/',
manifestFileName: 'manifest.json',
});
await load();
Module Structure
Each module should have:
- A manifest file (manifest.json) describing module files generated by
Vite
during build time - An entry point file that exports a Vue plugin
- Optional CSS files
Example manifest.json:
{
"entry": {
"file": "index.js",
"isEntry": true
},
"styles": {
"file": "styles.css"
}
}
Example module:
export default {
install(app, options) {
},
extensions: {
}
}
Extensions System
The Extensions System enables communication between the application and its modules.
Types of Extensions
- Inbound Extensions: Extensions that allow the application to customize and extend the module's functionality
- Outbound Extensions: Extensions that the module provides to extend the application's functionality
Registering Extensions
export default {
install(app) {
},
extensions: {
inbound: {
'customization-point': {
someConfig: true
}
},
outbound: {
'extension-point': [
{
id: 'MyExtension',
component: MyComponent,
}
]
}
}
}
Using Extensions Helper
import { useExtensionsHelper } from '@vc-shell/framework';
import { inject } from 'vue';
const extensionsHelper = inject(extensionsHelperSymbol);
const outboundExtensions = extensionsHelper.getOutboundExtensions('extension-point');
const inboundExtensions = extensionsHelper.getInboundExtensions('your-module-id', 'customization-point');
const moduleExtensions = extensionsHelper.getModuleExtensions('your-module-id');
Extension Types
- Component Extensions
interface ExtensionPoint = {
id: string;
component: Component;
}
- Composable Function Extensions
interface ComposableFunction = {
id: string;
fn: (...args: unknown[]) => unknown;
}
- Configuration Object Extensions
type Extension = Record<string, unknown>;
Best Practices
- Always provide unique IDs for extensions
- Document your module's extension points
- Handle missing or failed extensions gracefully
- Use TypeScript interfaces for type safety
- Keep extension configurations simple and serializable