Browse Source

add: 添加bus通过umd方式引入的demo

master
Poised_flw 4 years ago
parent
commit
6f2aae80f1
  1. 1
      src/tis_app_template_kt/bus.min.js
  2. 1
      src/tis_app_template_kt/package.json
  3. 1
      src/tis_app_template_kt/public/index.html
  4. 363
      src/tis_app_template_kt/public/lib/bus.min.js
  5. 16
      src/tis_app_template_kt/rollup.config.js
  6. 1
      src/tis_app_template_kt/src/components/controlMixins.js
  7. 2
      src/tis_app_template_kt/src/pc.vue
  8. 5
      src/tis_app_template_kt/src/tis/bus.js
  9. 2
      src/tis_app_template_kt/src/tis/index.js
  10. 3
      src/tis_app_template_kt/vue.config.js
  11. 57
      src/tis_app_template_kt/yarn.lock

1
src/tis_app_template_kt/bus.min.js
File diff suppressed because it is too large
View File

1
src/tis_app_template_kt/package.json

@ -27,6 +27,7 @@
"lint-staged": "^9.5.0",
"postcss-px-to-viewport": "git+https://git.inscloudtech.com/mirrors/postcss-px-to-viewport.git",
"prettier": "^1.19.1",
"rollup-plugin-replace": "^2.2.0",
"rollup-plugin-uglify": "^6.0.4",
"sass": "^1.26.5",
"sass-loader": "^8.0.2",

1
src/tis_app_template_kt/public/index.html

@ -28,6 +28,7 @@
<script type="text/javascript" src="/lib/bus.min.js"></script>
<!--<script type="text/javascript" src="http://localhost:7001/js/chunk-vendors.js"></script>-->
<!--<script type="text/javascript" src="http://localhost:7001/js/app.js"></script>-->
</body>

363
src/tis_app_template_kt/public/lib/bus.min.js

@ -0,0 +1,363 @@
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('vue')) :
typeof define === 'function' && define.amd ? define(['exports', 'vue'], factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.TISBUS = {}, global.Vue));
})(this, (function (exports, Vue) { 'use strict';
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var Vue__default = /*#__PURE__*/_interopDefaultLegacy(Vue);
const jsAttachPoint = document.querySelector('body');
//const cssAttachPoint = document.querySelector('head')
async function loadResources(resources) {
if (!resources.length) return
for (const resource of resources) {
//
jsAttachPoint.appendChild(resource);
await onLoad(resource).catch(() => {
// resourcesLoaded.forEach(item => {
// if (resource.src.indexOf(item) > 0) {
// let res = item.replace(new RegExp("/\static\/","gm"),``);
// console.error(`${res}资源加载失败,请检查该软件段是否正确安装!`);
// resourcesLoaded.delete(item);
// }
// });
// console.log(resourcesLoaded.entries());
jsAttachPoint.removeChild(resource);
});
}
}
function createStylesheet(href) {
const link = document.createElement('link');
link.setAttribute('rel', 'stylesheet');
link.setAttribute('href', href);
return link
}
function createScript(src) {
// const script = document.createElement('script')
// script.setAttribute('type', 'text/javascript')
// script.setAttribute('src', src.src? src.src :src);
// if (/require.min.js/.test(src)) script.setAttribute("data-main", '/TIS_DLTS_WEB/esapp-map/Build/Js/main.js');
const script = document.createElement('script');
script.setAttribute('type', 'text/javascript');
// if (src && src === "/TIS_DLTS_WEB/esapp-map/Build/Js/require.min.js") script.setAttribute("data-main", '/TIS_DLTS_WEB/esapp-map/Build/Js/main.js');
if (/require.min.js/.test(src)) {
script.setAttribute('src', "/TIS_DLTS_WEB/esapp-map/Build/Js/require.min.js");
script.setAttribute("data-main", '/TIS_DLTS_WEB/esapp-map/Build/Js/main.js');
} else {
script.setAttribute('src', src.src ? src.src : src);
}
return script
}
function onLoad(el) {
return new Promise((resolve, reject) => {
el.onload = el.onreadystatechange = function () {
let readyState = el.readyState;
if (typeof readyState === 'undefined' || /^(loaded|complete)$/.test(readyState)) {
resolve();
// 卸载事件和断开dom引用,避免内存泄漏
el.onload = el.onerror = el.onreadystatechange = null;
}
};
el.onerror = function () {
let readyState = el.readyState;
if (typeof readyState === 'undefined' || /^(loaded|complete)$/.test(readyState)) {
console.log('load js resources failed');
reject({error: 'load js resources failed'});
// 卸载事件和断开dom引用,避免内存泄漏
el.onload = el.onerror = el.onreadystatechange = null;
}
};
})
}
const resourcesLoaded = new Set();
const baseUrl$1 = "" ;
let currentBaseUrl = "";
async function registerApps(appObject,curBaseUrl) {
//开发态需要根据域名加载资源,运行态不需要加publicPath
let reg = /^([hH][tT]{2}[pP]:\/\/|[hH][tT]{2}[pP][sS]:\/\/)/;
currentBaseUrl = reg.test(curBaseUrl) ? curBaseUrl : "";
// if("development" === 'development'){
// console.log('ppppp',baseUrl)
// const response = await fetch(`${baseUrl}/tisplatform.json`,{method:'get'});
// const scripts = await response.json()
// console.log('000000000000',Object.values(scripts))
// Object.values(scripts).map(async script => await getAppLoader(script)())
// }else{
if (appObject === undefined || appObject == null) {
return Promise.resolve('[所加载资源为null]');
}
await getAppLoader(appObject)();
// }
}
function getAppLoader(info) {
return async function () {
if (info === undefined || info == null) return
const {cssFiles, jsFiles} = info;
if (cssFiles) {
await loadResources([
...cssFiles.filter(notLoaded).map(appendBaseUrl).map(createStylesheet),
...jsFiles.filter(notLoaded).map(appendBaseUrl).map(createScript)
]);
} else {
await loadResources([
...jsFiles.filter(notLoaded).map(appendBaseUrl).map(createScript)
]);
}
}
}
function appendBaseUrl(target) {
return (currentBaseUrl ? currentBaseUrl : baseUrl$1) + target;
}
function notLoaded(file) {
const loaded = resourcesLoaded.has(file);
resourcesLoaded.add(file);
return !loaded
}
// temp
let curBaseUrl = '';
const baseUrl = "" ;
// 数据机制,考虑vuex来实现
const bus = new Vue__default["default"]({
data: {
components: [], // components
asserts: {},
deviceType: "pc",
actives: [],//从菜单中激活的组件,
layouts: [],//由自定义组件和第三方组件组成的布局组件集合
widgets: [],//在应用模板内部需要加载的widgets
},
methods: {
getDeviceType() {
return this.deviceType
},
getTemplateLayouts(){
return this.layouts;
},
// 传递当前所处组件的上下文环境
menuStatusUpdate(){
const onActives = this.getTemplateLayouts().filter(l => !l.lazy).map(c=>c.component.name || c.component);
const appId = '';
console.log('============>', appId);
// TODO 这里通过event-bus来实现吧,Vue实例获取不到
this.$emit('TIS_TEMPLATE_MENU_ACTIVE', {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__default["default"].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);
},
// 初始化配置信息
async initData(props) {
const dev = "development" === 'development';
curBaseUrl = props.tis ? props.tis.entry : baseUrl;
const esData = await Vue__default["default"].prototype.$axios.get(`${curBaseUrl}/esplug.json`).catch(err => console.error(err));
const asserts = await Vue__default["default"].prototype.$axios.get(`${curBaseUrl}/tisplatform.json`).catch(err => console.error(err));
try {
//运行模式才取用框架返回的数据
if (props.tis && !dev) {
console.log('框架传入的components:',props.tis.components);
this.components = props.tis.components ? [...props.tis.components,...esData.data.components] : esData.data.components;
this.asserts = Object.keys(props.tis.asserts).length !== 0 ? props.tis.asserts : asserts.data;
this.widgets = props.tis.widgets ? props.tis.widgets : esData.data.widgets;
} else {
this.components = esData.data.components;
this.asserts = asserts.data;
this.widgets = esData.data.widgets;
}
//避免不填此属性,默认懒加载
this.components = this.components.map(c => {
if (!Object.prototype.hasOwnProperty.call(c, "lazy") && c.type !== "background") {
c.lazy = true;
}
return c;
});
} catch (e) {
console.error(e);
}
},
}
});
function onSetup(options = {}) {
bus.layouts = options.layout;
}
async function onMount(props) {
await bus.initData(props);
bus.initLayouts(bus.components);
bus.initLayouts(bus.widgets);
}
exports["default"] = bus;
exports.onMount = onMount;
exports.onSetup = onSetup;
Object.defineProperty(exports, '__esModule', { value: true });
}));

16
src/tis_app_template_kt/rollup.config.js

@ -1,17 +1,23 @@
import { uglify } from 'rollup-plugin-uglify'
import replace from 'rollup-plugin-replace'
export default {
input: 'src/tis/bus.js',
output: {
file: 'bus.min.js',
format: 'iife'
file: 'public/lib/bus.min.js',
format: 'umd',
name: 'TISBUS'
},
external: [
'vue',
'axios'
],
plugins: [
uglify()
//uglify(),
replace({
//'process.env.NODE_ENV': JSON.stringify('production'),
'process.env.NODE_ENV': JSON.stringify('development'),
'process.env.BASE_URL': JSON.stringify('')
}),
/*
babel({
exclude: ["node_modules/**"],
@ -25,5 +31,5 @@ export default {
]
})
*/
]
],
}

1
src/tis_app_template_kt/src/components/controlMixins.js

@ -33,7 +33,6 @@ export const controlMixins = {
///记录激活数量
return list;
},
watch: ['$tis.layouts'],
default() {
return [];
},

2
src/tis_app_template_kt/src/pc.vue

@ -61,7 +61,7 @@
};
</script>
<style lang="scss">
<style lang="scss" scoped>
.app {
padding: 10px 10px 50px 10px;

5
src/tis_app_template_kt/src/tis/bus.js

@ -1,5 +1,4 @@
import Vue from "vue";
import axios from 'axios'
import {registerApps} from './scriptsLoader/index'
// temp
@ -189,8 +188,8 @@ const bus = new Vue({
async initData(props) {
const dev = process.env.NODE_ENV === 'development';
curBaseUrl = props.tis ? props.tis.entry : baseUrl;
const esData = await axios.get(`${curBaseUrl}/esplug.json`).catch(err => console.error(err));
const asserts = await axios.get(`${curBaseUrl}/tisplatform.json`).catch(err => console.error(err));
const esData = await Vue.prototype.$axios.get(`${curBaseUrl}/esplug.json`).catch(err => console.error(err));
const asserts = await Vue.prototype.$axios.get(`${curBaseUrl}/tisplatform.json`).catch(err => console.error(err));
try {
//运行模式才取用框架返回的数据
if (props.tis && !dev) {

2
src/tis_app_template_kt/src/tis/index.js

@ -10,7 +10,7 @@ import AsyncComputed from 'vue-async-computed'
import axios from 'axios'
import Vuex from 'vuex'
import EventBusExample from '../components/EventBusExample'
import bus, { onMount, onSetup } from './bus'
import bus, { onSetup, onMount } from 'tisbus'
Vue.component('EventBusExample', EventBusExample)
Vue.config.productionTip = false;

3
src/tis_app_template_kt/vue.config.js

@ -136,12 +136,13 @@ module.exports = {
configureWebpack: {
externals: {
'tisui': 'TIS',//
'tisbus': 'TISBUS',
'vue': {
root: 'Vue',
commonjs: 'vue',
commonjs2: 'vue',
amd: 'vue'
}
},
},
resolve: {
alias: {

57
src/tis_app_template_kt/yarn.lock

@ -1023,6 +1023,11 @@
dependencies:
"@types/node" "*"
"@types/estree@*":
version "0.0.50"
resolved "https://registry.nlark.com/@types/estree/download/@types/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83"
integrity sha1-Hgyqk2TT/M0pMcPtlv2+ql1MyoM=
"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18":
version "4.17.24"
resolved "https://registry.nlark.com/@types/express-serve-static-core/download/@types/express-serve-static-core-4.17.24.tgz?cache=0&sync_timestamp=1629707772598&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fexpress-serve-static-core%2Fdownload%2F%40types%2Fexpress-serve-static-core-4.17.24.tgz#ea41f93bf7e0d59cd5a76665068ed6aab6815c07"
@ -3745,6 +3750,11 @@ estraverse@^5.1.0, estraverse@^5.2.0:
resolved "https://registry.nlark.com/estraverse/download/estraverse-5.2.0.tgz?cache=0&sync_timestamp=1622604531280&other_urls=https%3A%2F%2Fregistry.nlark.com%2Festraverse%2Fdownload%2Festraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880"
integrity sha1-MH30JUfmzHMk088DwVXVzbjFOIA=
estree-walker@^0.6.1:
version "0.6.1"
resolved "https://registry.npm.taobao.org/estree-walker/download/estree-walker-0.6.1.tgz?cache=0&sync_timestamp=1611956983677&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Festree-walker%2Fdownload%2Festree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362"
integrity sha1-UwSRQ/QMbrkYsjZx0f4yGfOhs2I=
esutils@^2.0.2:
version "2.0.3"
resolved "https://registry.npm.taobao.org/esutils/download/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
@ -5207,6 +5217,13 @@ is-promise@^2.1.0:
resolved "https://registry.npm.taobao.org/is-promise/download/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1"
integrity sha1-OauVnMv5p3TPB597QMeib3YxNfE=
is-reference@^1.1.2:
version "1.2.1"
resolved "https://registry.nlark.com/is-reference/download/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7"
integrity sha1-iy2sCzcfS8mU/eq6nrVC0DAC0Lc=
dependencies:
"@types/estree" "*"
is-regex@^1.0.4, is-regex@^1.1.4:
version "1.1.4"
resolved "https://registry.nlark.com/is-regex/download/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
@ -5711,6 +5728,13 @@ lru-cache@^5.1.1:
dependencies:
yallist "^3.0.2"
magic-string@^0.25.2:
version "0.25.7"
resolved "https://registry.nlark.com/magic-string/download/magic-string-0.25.7.tgz?cache=0&sync_timestamp=1618847046304&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fmagic-string%2Fdownload%2Fmagic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051"
integrity sha1-P0l9b9NMZpxnmNy4IfLvMfVEUFE=
dependencies:
sourcemap-codec "^1.4.4"
make-dir@^2.0.0:
version "2.1.0"
resolved "https://registry.nlark.com/make-dir/download/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5"
@ -7476,7 +7500,7 @@ resolve-url@^0.2.1:
resolved "https://registry.npm.taobao.org/resolve-url/download/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2:
resolve@^1.10.0, resolve@^1.11.0, resolve@^1.12.0, resolve@^1.14.2:
version "1.20.0"
resolved "https://registry.nlark.com/resolve/download/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
integrity sha1-YpoBP7P3B1XW8LeTXMHCxTeLGXU=
@ -7554,6 +7578,25 @@ ripemd160@^2.0.0, ripemd160@^2.0.1:
hash-base "^3.0.0"
inherits "^2.0.1"
rollup-plugin-commonjs@^10.1.0:
version "10.1.0"
resolved "https://registry.npm.taobao.org/rollup-plugin-commonjs/download/rollup-plugin-commonjs-10.1.0.tgz#417af3b54503878e084d127adf4d1caf8beb86fb"
integrity sha1-QXrztUUDh44ITRJ6300cr4vrhvs=
dependencies:
estree-walker "^0.6.1"
is-reference "^1.1.2"
magic-string "^0.25.2"
resolve "^1.11.0"
rollup-pluginutils "^2.8.1"
rollup-plugin-replace@^2.2.0:
version "2.2.0"
resolved "https://registry.npm.taobao.org/rollup-plugin-replace/download/rollup-plugin-replace-2.2.0.tgz?cache=0&sync_timestamp=1572273363490&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frollup-plugin-replace%2Fdownload%2Frollup-plugin-replace-2.2.0.tgz#f41ae5372e11e7a217cde349c8b5d5fd115e70e3"
integrity sha1-9BrlNy4R56IXzeNJyLXV/RFecOM=
dependencies:
magic-string "^0.25.2"
rollup-pluginutils "^2.6.0"
rollup-plugin-uglify@^6.0.4:
version "6.0.4"
resolved "https://registry.npm.taobao.org/rollup-plugin-uglify/download/rollup-plugin-uglify-6.0.4.tgz#65a0959d91586627f1e46a7db966fd504ec6c4e6"
@ -7564,6 +7607,13 @@ rollup-plugin-uglify@^6.0.4:
serialize-javascript "^2.1.2"
uglify-js "^3.4.9"
rollup-pluginutils@^2.6.0, rollup-pluginutils@^2.8.1:
version "2.8.2"
resolved "https://registry.npm.taobao.org/rollup-pluginutils/download/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e"
integrity sha1-cvKvB0i1kjZNvTOJ5gDlqURKNR4=
dependencies:
estree-walker "^0.6.1"
run-async@^2.4.0:
version "2.4.1"
resolved "https://registry.npm.taobao.org/run-async/download/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455"
@ -7970,6 +8020,11 @@ source-map@^0.7.3:
resolved "https://registry.npm.taobao.org/source-map/download/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
integrity sha1-UwL4FpAxc1ImVECS5kmB91F1A4M=
sourcemap-codec@^1.4.4:
version "1.4.8"
resolved "https://registry.npm.taobao.org/sourcemap-codec/download/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4"
integrity sha1-6oBL2UhXQC5pktBaOO8a41qatMQ=
spdx-correct@^3.0.0:
version "3.1.1"
resolved "https://registry.npm.taobao.org/spdx-correct/download/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9"

Loading…
Cancel
Save