nodejs插件化框架——minimajs

本文介紹我開發的一個JavaScript編寫的插件化框架——minimajs,徹底開源,源碼下載地址:https://github.com/lorry2018/minimajs。該框架參考OSGi規範,將該規範定義的三大插件化功能在Node上實現了。MinimaJS三個功能:動態插件化,服務和擴展。該框架基於VSCode開發、使用ES6編碼,基於Node 8開發,代碼量幾千行,很是的簡單、優雅、輕量。框架的代碼結構劃分清晰,命名優雅。javascript

 

咱們先簡單看一下,如何來使用這個框架。css

import { Minima } from 'minimajs';
import path from 'path';

let minima = new Minima(path.join(__dirname, 'plugins'));
minima.start();

 經過這幾行代碼就能夠建立一個插件框架,而且從當前的plugins目錄下加載插件。html

 

每個插件在plugins目錄下,由plugin.json來定義插件的基本信息、依賴信息、服務和擴展,該文件必須在插件根目錄下,而且包含。一個插件由plugin.json和其它文件構成,其它文件爲可選,能夠包括js、html、css文件等。以下爲一個插件示例。對於plugin.json文件,除了id是必填屬性,其它均爲可選,這意味着最小的插件爲一個只定義了plugin.json且該文件只聲明插件id。java

通OSGi規範相似,每個插件能夠定義一個激活器,默認爲Activator.js,若是命名不是默認值,則須要在plugin.json裏面經過activator定義該激活器文件名。一個典型的Activator定義以下,用於聲明插件的入口和出口。git

import { PluginContext } from 'minimajs';

export default class Activator {
    constructor() {
        this.start = this.start.bind(this);
        this.stop = this.stop.bind(this);
    }

    /**
     * 插件入口
     * 
     * @param {PluginContext} context 插件上下文
     * @memberof Activator
     */
    start(context) {
        
    }

    /**
     * 插件出口
     * 
     * @param {PluginContext} context 插件上下文
     * @memberof Activator
     */
    stop(context) {

    }
}

 這裏start與stop分別表明入口和出口,用於服務註冊、綁定、事件監聽等。github

 

插件間經過服務進行通信,一個插件註冊服務,一個插件消費服務。插件註冊能夠經過plugin.json來聲明,也能夠經過激活器start方法的PluginContext參數的addService來註冊服務。以下所示,使用plugin.json來註冊一個服務。json

{
    "id": "demoPlugin",
    "startLevel": 5,
    "version": "1.0.0",
    "services": [{
        "name": "logService",
        "service": "LogService.js"
    }]
}

 另外一個插件,能夠經過激活器來消費服務。框架

import { PluginContext, log } from 'minimajs';

export default class Activator {
    static logService = null;

    constructor() {
        this.start = this.start.bind(this);
        this.stop = this.stop.bind(this);
    }

    /**
     * 插件入口
     * 
     * @param {PluginContext} context 插件上下文
     * @memberof Activator
     */
    start(context) {
        let logService = context.getDefaultService('logService');
        if (!logService) {
            throw new Error('The logService can not be null.');
        }
        Activator.logService = logService;

        logService.log('Get the logService successfully.');
    }

    stop(context) {}
}

 該框架還提供了插件擴展、類加載等特性,能夠經過框架提供的實例來探索。如下是一個插件化的REST框架,基於插件化構建的實例,能夠經過源碼下載獲取。this

這個示例演示了Express、Art-Template、WebAPI框架、插件動態擴展、Web輕量框架的構建,詳細能夠查看實例。編碼

相關文章
相關標籤/搜索