Browse Source

抽离bus

feature/bus
Poised_flw 4 years ago
parent
commit
45d4ad0783
  1. 2
      src/tis_app_template_kt/package.json
  2. 190
      src/tis_app_template_kt/src/tis/bus.js
  3. 210
      src/tis_app_template_kt/src/tis/index.js
  4. 9085
      src/tis_app_template_kt/yarn.lock

2
src/tis_app_template_kt/package.json

@ -24,7 +24,7 @@
"eslint-plugin-prettier": "^3.1.3",
"eslint-plugin-vue": "^6.2.2",
"lint-staged": "^9.5.0",
"postcss-px-to-viewport": "git+https://github.com/evrone/postcss-px-to-viewport.git",
"postcss-px-to-viewport": "git+https://git.inscloudtech.com/mirrors/postcss-px-to-viewport.git",
"prettier": "^1.19.1",
"sass": "^1.26.5",
"sass-loader": "^8.0.2",

190
src/tis_app_template_kt/src/tis/bus.js

@ -0,0 +1,190 @@
import Vue from "vue";
import {registerApps} from './scriptsLoader/index'
// 挂载vue的示例
let vueInstance = null
// 数据机制,考虑vuex来实现
const bus = new Vue({
data: {
components: [], // components
asserts: {},
deviceType: "pc",
actives: [],//从菜单中激活的组件,
layouts: [],//由自定义组件和第三方组件组成的布局组件集合
widgets: [],//在应用模板内部需要加载的widgets
},
methods: {
setVueInstance(instance) {
vueInstance = instance
},
getDeviceType() {
return this.deviceType
},
getTemplateLayouts(){
return this.layouts;
},
// 传递当前所处组件的上下文环境
menuStatusUpdate(){
const onActives = this.getTemplateLayouts().filter(l => !l.lazy).map(c=>c.component.name || c.component);
console.log('============>', vueInstance.appId)
// TODO 这里通过event-bus来实现吧,Vue实例获取不到
this.$emit('TIS_TEMPLATE_MENU_ACTIVE', {appId: vueInstance.appId, onActives: onActives,system:true})
},
async loadComponent(component) {
const comp = this.components.find(arg => arg.component === component) || {};
console.log('所有组件...', this.components,);
console.log('所有资源...', this.asserts);
console.log('当前加载组件...', component,);
console.log('匹配到的组件...', comp);
let assets = null;
let dependencies = [];
let isLib = false;
try {
const info = comp.segprefix;
assets = this.asserts[info];
dependencies = comp.dependencies || [];
isLib = comp.lib;
} catch (e) {
console.error(e)
}
//等待依赖下载完毕
for (const refer of dependencies) {
let reference = this.asserts[refer] || null;
await registerApps(reference, curBaseUrl);
}
return new Promise((resolve, reject) => {
//加载组件资源
console.log('开始加载组件资源', assets, curBaseUrl)
registerApps(assets, curBaseUrl).then(() => {
if (!isLib) {//正常组件的加载流程,isLib为true代表纯js lib库的加载
let startTime = new Date().getTime();
const looper = setInterval(() => {
if (Vue.component(`${component}`)) {
resolve(comp)
clearInterval(looper);
} else {
let nowTime = new Date().getTime();
if (nowTime - startTime > 2000) {
if (!assets) {
reject(`[loading error:${component}]:组件资源加载失败`)
} else {
reject(`[loading error:${component}]:loading component timed out`)
}
clearInterval(looper)
}
}
}, 300)
} else {
resolve(comp);
}
}).catch(err => {
if (!assets) {
reject(`[loading error:${component}]:组件资源加载失败`)
} else {
reject(`[loading error:${component}]:${err}`)
}
});
})
},
//自定义函数,支持开发者按需增加接口
openComponentByMenu(components) {
//长度变化才会触发computed?
this.components.filter(c => {
const component = c.component.name || c.component;
//激活组件命中此组件,更改状态
const hit = components.includes(component);
if (hit) {
c.lazy = !hit;
return c;
}
}).forEach(c => {
if (!this.layouts.some(l => (l.component.name || l.component) === c.component)) {
this.layouts.push(c);
}else{
//改变状态
this.layouts.forEach(l => {
if((l.component.name || l.component) === c.component ){
l.lazy = false;
}
})
}
if (!this.actives.some(l => l.component === c.component)) {
//弹窗暂定为同一时间只能打开一个
if (c.type === 'dialog') {
this.actives = [c];
} else {
this.actives.push(c);
}
}
});
//有 加入 无 删除?
console.log('layouts变化状态', this.layouts);
console.log('actives变化状态', this.actives);
this.menuStatusUpdate();
},
// 关闭组件
closeComponent(components) {
//修改layout中的状态
this.layouts.forEach(c => {
const component = c.component.name || c.component;
//激活组件命中此组件,更改状态
const hit = components.includes(component);
if (hit) {
c.lazy = hit;
}
})
//active中删除该组件
console.log('待删除组件', components)
components.forEach(c => {
const index = this.actives.findIndex(b => b.component === c);
console.log('aaaaaa', index);
if (index >= 0) {
this.actives.splice(index, 1);
}
})
console.log('layouts变化状态', this.layouts)
console.log('actives变化状态', this.actives)
this.menuStatusUpdate();
},
//initLayouts //layouts 初始化,外部组件
initLayouts(layouts = []) {
this.layouts.push(...layouts.filter(l => !l.lazy))
},
//获取组件
getWidgetsByType(type) {
//以type 或 position 命中widget,背景板默认lazy=false
return this.layouts.filter(f => (f.type === type || f.position === type) && !f.lazy).map(f => {
//string类型,来自配置文件,需要下载资源才能使用,懒加载组件不加载但是需要加入到数组中、、
if (typeof f.component === "string") {
console.log('下载component资源', f.component);
return this.loadComponent(f.component);
} else {
return f
}
});
},
//获取含有当前类型的激活组件
getActivesByType(type) {
return this.actives.filter(a => a.type === type);
},
}
});
export default bus

210
src/tis_app_template_kt/src/tis/index.js

@ -3,8 +3,9 @@
const devLib = process.env.VUE_APP_DEVLIB === "dev";
console.log('当前版本======> for',process.env.VUE_APP_DEVLIB)
if (window.__POWERED_BY_QIANKUN__) {
// eslint-disable-next-line no-undef 注入乾坤处理过的publicPath
__webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__ + (devLib ? "/TIS_APP_TEMPLATE_KT/" : '');
// 注入乾坤处理过的publicPath
// eslint-disable-next-line no-undef
window.__webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__ + (devLib ? "/TIS_APP_TEMPLATE_KT/" : '');
}
import Vue from "vue";
import store from './store'
@ -13,6 +14,7 @@ import {registerApps} from './scriptsLoader/index'
import axios from 'axios'
import Vuex from 'vuex'
import EventBusExample from '../components/EventBusExample'
import bus from './bus'
Vue.component('EventBusExample', EventBusExample)
Vue.config.productionTip = false;
@ -24,202 +26,12 @@ const dev = process.env.NODE_ENV === 'development';
// 在这个文件中进行对kt的适配
const baseUrl = dev ? process.env.BASE_URL : "";
let curBaseUrl = '';
const bus = new Vue({
data: {
components: [], // components
asserts: {},
deviceType: "pc",
actives: [],//从菜单中激活的组件,
layouts: [],//由自定义组件和第三方组件组成的布局组件集合
widgets: [],//在应用模板内部需要加载的widgets
}
});
let _App,
_instance,
_options = {},
// _layout,//由自定义组件和第三方组件组成的布局组件集合
_props = {};
const tis = new Proxy(
{
Vue: Vue,
getDeviceType() {
return bus.deviceType;
},
getTemplateLayouts(){
return bus.layouts;
},
menuStatusUpdate(){
const onActives = tis.getTemplateLayouts().filter(l => !l.lazy).map(c=>c.component.name || c.component);
console.log('============>',this.appId)
this.$emit('TIS_TEMPLATE_MENU_ACTIVE', {appId: this.appId, onActives: onActives,system:true})
},
async loadComponent(component) {
const comp = bus.components.find(arg => arg.component === component) || {};
console.log('所有组件...', bus.components,);
console.log('所有资源...', bus.asserts);
console.log('当前加载组件...', component,);
console.log('匹配到的组件...', comp);
let assets = null;
let dependencies = [];
let isLib = false;
try {
const info = comp.segprefix;
assets = bus.asserts[info];
dependencies = comp.dependencies || [];
isLib = comp.lib;
} catch (e) {
console.error(e)
}
//等待依赖下载完毕
for (const refer of dependencies) {
let reference = bus.asserts[refer] || null;
await registerApps(reference, curBaseUrl);
}
return new Promise((resolve, reject) => {
//加载组件资源
console.log('开始加载组件资源', assets, curBaseUrl)
registerApps(assets, curBaseUrl).then(() => {
if (!isLib) {//正常组件的加载流程,isLib为true代表纯js lib库的加载
let startTime = new Date().getTime();
const looper = setInterval(() => {
if (Vue.component(`${component}`)) {
resolve(comp)
clearInterval(looper);
} else {
let nowTime = new Date().getTime();
if (nowTime - startTime > 2000) {
if (!assets) {
reject(`[loading error:${component}]:组件资源加载失败`)
} else {
reject(`[loading error:${component}]:loading component timed out`)
}
clearInterval(looper)
}
}
}, 300)
} else {
resolve(comp);
}
}).catch(err => {
if (!assets) {
reject(`[loading error:${component}]:组件资源加载失败`)
} else {
reject(`[loading error:${component}]:${err}`)
}
});
})
},
//自定义函数,支持开发者按需增加接口
openComponentByMenu(components) {
//长度变化才会触发computed?
bus.components.filter(c => {
const component = c.component.name || c.component;
//激活组件命中此组件,更改状态
const hit = components.includes(component);
if (hit) {
c.lazy = !hit;
return c;
}
}).forEach(c => {
if (!bus.layouts.some(l => (l.component.name || l.component) === c.component)) {
bus.layouts.push(c);
}else{
//改变状态
bus.layouts.forEach(l => {
if((l.component.name || l.component) === c.component ){
l.lazy = false;
}
})
}
if (!bus.actives.some(l => l.component === c.component)) {
//弹窗暂定为同一时间只能打开一个
if (c.type === 'dialog') {
bus.actives = [c];
} else {
bus.actives.push(c);
}
}
});
//有 加入 无 删除?
console.log('layouts变化状态', bus.layouts);
console.log('actives变化状态', bus.actives);
this.menuStatusUpdate();
},
// 关闭组件
closeComponent(components) {
//修改layout中的状态
bus.layouts.forEach(c => {
const component = c.component.name || c.component;
//激活组件命中此组件,更改状态
const hit = components.includes(component);
if (hit) {
c.lazy = hit;
}
})
//active中删除该组件
console.log('待删除组件', components)
components.forEach(c => {
const index = bus.actives.findIndex(b => b.component === c);
console.log('aaaaaa', index);
if (index >= 0) {
bus.actives.splice(index, 1);
}
})
console.log('layouts变化状态', bus.layouts)
console.log('actives变化状态', bus.actives)
this.menuStatusUpdate();
},
//initLayouts //layouts 初始化,外部组件
initLayouts(layouts = []) {
bus.layouts.push(...layouts.filter(l => !l.lazy))
},
//获取组件
getWidgetsByType(type) {
//以type 或 position 命中widget,背景板默认lazy=false
return bus.layouts.filter(f => (f.type === type || f.position === type) && !f.lazy).map(f => {
//string类型,来自配置文件,需要下载资源才能使用,懒加载组件不加载但是需要加入到数组中、、
if (typeof f.component === "string") {
console.log('下载component资源', f.component);
return this.loadComponent(f.component);
} else {
return f
}
});
},
//获取含有当前类型的激活组件
getActivesByType(type) {
return bus.actives.filter(a => a.type === type);
},
AppBus: bus,
},
{
get: function (_, k) {
if (k === "layouts") {
return bus.layouts;
}
return (_props.tis && _props.tis[k]) ? _props.tis[k] : _[k]
}
}
);
export function setup(App, options = {}) {
_App = App;
_options = options;
@ -242,16 +54,16 @@ export function setup(App, options = {}) {
*/
export async function bootstrap(props) {
//将这个bus同步给app内维护的bus
// tis.initAppBusById(bus,props.tis.appId)
// bus.initAppBusById(bus,props.tis.appId)
// props.tis.privateBus.asserts = bus.
//主题初始化
const theme = localStorage.getItem("TIS_DESIGN_THEME");
const theme = localStorage.getItem("TIS_DESIGN_THEME") || 'default';
swithTheme(theme);
_props = props;
Vue.prototype.$tis = tis;
Vue.prototype.$tis = bus;
Vue.prototype.$EsDataMsg = function (params = {}) {
if (typeof params.callback === "function") {
tis.$on('message', {system: true}, async (payload) => {
bus.$on('message', {system: true}, async (payload) => {
params.callback(payload.message)
})
}
@ -259,7 +71,7 @@ export async function bootstrap(props) {
Vue.prototype.$EsOpenComponent = function () {
}
props.onMessage.ref = _options.onMessage // 暴露onMessage回调给宿主
props.onMenu.ref = _options.onMenu // 暴露onMessage回调给宿主
props.onMenu && (props.onMenu.ref = _options.onMenu) // 暴露onMessage回调给宿主
if (typeof _options.bootstrap === "function") {
_options.bootstrap(props);
}
@ -310,9 +122,9 @@ export async function mount(props = {}) {
}
console.log('app frame', bus.components, bus.asserts);
//一些内部配置的component需要加入layouts
tis.initLayouts(bus.components);
bus.initLayouts(bus.components);
// widgets加入layouts
tis.initLayouts(bus.widgets);
bus.initLayouts(bus.widgets);
document.documentElement.setAttribute('data-device', "pc");
window.esapp = Object.assign({}, {
Vue: Vue,

9085
src/tis_app_template_kt/yarn.lock
File diff suppressed because it is too large
View File

Loading…
Cancel
Save