# 对应关系

# config.json配置

  {
    "name": "",
    "plugins": {
      "home-page-epu": "/plugins/base/hello-world-plugin/src/index",
      "events-ep": "/plugins/base/events-plugin/src/index",
      "flows-1-epu": "/plugins/base/flows-plugin/src/index",
      "flows-base-epu": "/plugins/base/flows-plugin/src/index",
      "flows-2-epu": "/plugins/demo/flows-plugin/src/index",
      "flows-3-epu": "/plugins/base/flows-plugin/src/index",
      "logics-epl": "/plugins/base/logic-plugin/src/index",
      "dynamic-epu": "/plugins/base/dynamic-routes-plugin/src/index",
      "register-epu": "/plugins/base/register-plugin/src/index",
      "store-epu": "/plugins/base/store-event-plugin/src/index",
      "test-epu": "/plugins/base/test-view-plugin/index.js",
      "ui-header-epu": "/plugins/hangzhou/ui-header-plugin/src/index",
      "ui-body-epu": "/plugins/base/ui-body-plugin/src/index",
      "ui-footer-epu": "/plugins/base/ui-footer-plugin/src/index",
      "nest-epu": "/plugins/demo/nest-plugin/src/index"
    }
  }

具体配置参考插件使用config.json配置,使用参考插件使用部分

# 一对一

插件与扩展点一对一: 例如: /plugins/base/hello-world-plugin

// plugin/index.ts

import HelloWorld from "../components/HelloWorld.vue";
import { Plugin, PluginAPI } from "@esign/plugin-core";

export default (): Plugin => ({
  name: "hello-world-plugin", // 插件的名称,唯一标识符
  // 插件初始化函数,只会执行一次;返回一个 Hook 对象
  setup({ setAppContext, useAppContext }: PluginAPI) {
    return {
      // core/manager.ts line 21
      "home-page-epu": () => {
        // 返回 HelloWorld 组件
        return HelloWorld;
      },
    };
  },
});

# 一对多

插件与扩展点: 一对多, 例如: /plugins/base/flows-plugin

  • 目录结构

    flows-plugin
    │  .esignrc.js
    │  package.json
    │  tsconfig.json
    │
    └─src
        │  index.ts
        │  typings.d.ts
        │
        ├─components
        │  ├─Flow1Component
        │  │      index.module.less
        │  │      index.tsx
        │  │
        │  ├─Flow3Component
        │  │      index.module.less
        │  │      index.tsx
        │  │
        │  └─FlowBaseComponent
        │          index.module.less
        │          index.tsx
        │
        └─plugin
                flows-1-plugin.ts
                flows-3-plugin.ts
                flows-base-plugin.ts
    
  • 插件代码

      // plugin/index.ts
      import FlowBaseComponent from '../components/FlowBaseComponent/index'
      import { Plugin, PluginAPI } from '@esign/plugin-core'
    
      export default (): Plugin => ({
      name: 'events-plugin',
      setup({ setAppContext, useAppContext }: PluginAPI) {
          return {
            'flows-base-epu': () => {
              return FlowBaseComponent
            },
            dataTransform: (value: string) => {
              return `---flow-2-start---${value}---flow-2-end---`
            }
          }
        }
      })
    
      // index.ts
      import PluginBase from './plugin/flows-base-plugin'
      import Plugin1 from './plugin/flows-1-plugin'
      import Plugin3 from './plugin/flows-3-plugin'
    
      // 数组的形式返回多个插件
      export default [
        PluginBase,
        Plugin1,
        Plugin3,
      ]
    

# 逻辑插件

例如: /plugins/base/logic-plugin

  • 插件代码
      // utils
      function dialog(value: string | number = "逻辑插件") {
        alert(value);
      }
    
      export { dialog };
    
      //plugin
      import * as utils from "../logics";
      import type { Plugin, PluginAPI } from "@esign/plugin-core";
    
      export default (): Plugin => ({
        name: "base-logic-plugin",
        setup({ setAppContext, useAppContext }: PluginAPI) {
          return {
            "logics-epl": () => {
              return utils;
            },
          };
        },
      });
    
  • 调用逻辑插件
    <template>
      <div class="home">
        <img alt="Vue logo" src="../assets/images/logo.png">
        <br>
        <button @click="logicFn.dialog('逻辑插件')">点击</button>
      </div>
    </template>
    
    <script lang="ts">
    import { Component, Vue } from 'vue-property-decorator'
    
    @Component({})
    export default class ParamsView extends Vue {
      logicFn: any = null
    
      async mounted() {
        this.logicFn = await this.$esExtensionPointLogic('logics-epl');
      }
    }
    </script>
    

# 动态路由插件

例如: /plugins/base/dynamic-routes-plugin

  • 插件代码
    // plugin/index.ts
    import TestView from '../pages/test/index.tsx'
    import HelloWorld from '../pages/HelloWorld.vue'
    import Index from '../pages/index/index.tsx'
    import { Plugin, PluginAPI } from '@esign/plugin-core'
    import { RouteConfig } from 'vue-router'
    
    export default (): Plugin => ({
      name: 'base-dynamic-routes-plugin', // 插件的名称,唯一标识
      registerHook: {  }, // 注册新的 hooks
      // 插件初始化函数,只会执行一次;返回一个 Hook 对象
      setup(api: PluginAPI) {
        return {
          'dynamic-epu'({ basename = '' }) {
            return [
              {
                path: `${basename}`,
                name: 'pluginMain',
                component: Index,
                children: [
                  {
                    path: `${basename}/test`,
                    name: 'pluginTest',
                    component: TestView,
                    meta: {
                      title: 'test view',
                      basename,
                    },
                  },
                  {
                    path: `${basename}/helloworld`,
                    name: 'pluginHello',
                    component: HelloWorld,
                    meta: {
                      title: 'hello world',
                      basename,
                    },
                  },
                  {
                    path: `${basename}/`,
                    redirect: `${basename}/helloworld`,
                  }
                ],
              },
            ] as RouteConfig[]
          },
          pageComponents() {
            // 返回 TestView 组件
            return TestView
          },
        }
      },
    })
    
  • 调用插件 router.js部分
    import { beforeEnterHook } from '@esign/plugin-core'
    
    export const routes = [
      ...路由配置
      {
        path: '/middlePage', // 中间路由
        beforeEnter (from, to, next) {
          beforeEnterHook({
            from,
            next, 
            router
          }, 
          {
            // 插件基础路径
            baseName: 'third',
            // 原应用默认页面
            defaultPath: '/'
          })
        }
      },
      { 
        path: '*', 
        /**
         * 微前端的模式下请携带微前端子应用基础路径,如:path: '/subapp-demo'
         */
        redirect: '/middlePage' }, // 默认页面统一跳转至 /middlePage 路由
    ]
    
  • 动态路由跳转方式 跳转动态路由根路径(third)+扩展点名称,例如
      this.$router.push(`/third/${扩展点名称}`)
    
上次更新: 6/8/2023, 3:49:30 AM