• home > webfront > engineer > Architecture >

    插件化架构设计(3):前端可视化化平台插件架构-grafana实践

    Author:zhoulujun Date:

    插件化架构可以链接多个子系统,而做到开闭原则。即插件核心和接口不变,系统可以持续接入新插件,来丰富系统的功能。可视化平台各种可视化图表展示功能不一,要想满足给个平台需求,只有走插件化道路

    插件实践方案

    其实插件你就把它当一个组件来用就好。用起来就是异步组件加载。

    vue异步组件加载

    <template>
      <div class="wrapper">
        <h3 style="text-align:left;">VueComponentMode</h3>
        <button @click="show = false">销毁</button>
        <button @click="switchComponent('component1')">组件1</button>
        <button @click="switchComponent('component2')">组件2</button>
        <div class="a">
          <component :is="apps" v-if="show"></component>
        </div>
      </div>
    </template>
    <script>
        import Vue from 'vue';
        export default {
            name: "VueComponent",
            data() {
                return {
                    show: false,
                    apps: 'ModelPage',
                }
            },
            methods: {
                /*
                * 通过动态注册全局组件实现动态异步加载组件的功能
                * */
                switchComponent: function (component) {
                    Vue.component('ModelPage', () => import(`./${component}`));
    
                    //由于components改变后视图不会自动刷新, 需要手动刷新, 也可以使用this.$forceUpdate()
                    this.show = false;
                    let that = this;
                    window.setTimeout(function () {
                        that.show = true;
                    })
                }
            }
        }
    </script>


    react粗暴版

    import React, { Component } from "react";
    
    export default function asyncComponent(importComponent) {
      class AsyncComponent extends Component {
        constructor(props) {
          super(props);
          this.state = {
            component: null
          };
        }
        componentDidMount() {
          importComponent().then((mod) => {
            this.setState({
              // 同时兼容ES6和CommonJS的模块
              component: mod.default ? mod.default : mod
            });
          });
        }
    
        render() {
          const C = this.state.component;
          return C ? <C {...this.props} /> : null;
        }
      }
    
      return AsyncComponent;
    }

    react16.6 天赋就有懒加载

     Vue  TSX 异步加载插件

    import SystemJS from 'systemjs/dist/system.js';
    import { Component } from "vue-property-decorator";
    import { Component as tsc } from "vue-tsx-support/lib/api";
    interface Props {
    }
    interface Event {
    }
    @Component
    export default class ChartWrapper extends tsc<Props, Event> {
      tempCom  = null
      mounted(){
        // import Comp from 'path/'
        const Comp=  SystemJS.import('path/')
        this.$createElement(Comp, {
          props: {
            query: {
              propsA: 'a',
            },
            onChange: (targets: any) => {},
          },
        })
      }
      render(){
        return (<div>{this.tempCom}</div>)
      }
    }


    组件/模块异步加载方案,请参看《前端模块化方案:前端模块化/插件化异步加载方案探索





    转载本站文章《插件化架构设计(3):前端可视化化平台插件架构-grafana实践》,
    请注明出处:https://www.zhoulujun.cn/html/webfront/engineer/Architecture/8926.html