cloud-web-corejs 1.0.54-dev.770 → 1.0.54-dev.771

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "cloud-web-corejs",
3
3
  "private": false,
4
- "version": "1.0.54-dev.770",
4
+ "version": "1.0.54-dev.771",
5
5
  "scripts": {
6
6
  "dev": "vue-cli-service serve",
7
7
  "lint": "eslint --ext .js,.vue src",
@@ -170,7 +170,6 @@
170
170
  "src/components/langTag",
171
171
  "src/components/formDialog",
172
172
  "src/api",
173
- "src/bootstrap",
174
173
  "src/views/bd",
175
174
  "src/views/support",
176
175
  "src/views/user",
@@ -40,17 +40,6 @@ import LuckyExcel from "luckyexcel";
40
40
  //导入库export.js 这个文件是es6的,不能在普通的HTML文件直接引入js文件(虽然都是js文件,但是有区别,具体请百度es6与es5)!需要把es6转es5才可以直接引入使用!
41
41
  import { exportExcel, generateExcelFile } from "./export";
42
42
  import { saveAs } from "file-saver";
43
- import {
44
- getPublicAssetUrl,
45
- loadStyles,
46
- } from "@base/utils/externalAssets";
47
-
48
- const luckysheetStyleUrls = [
49
- "luckysheet/plugins/css/pluginsCss.css",
50
- "luckysheet/plugins/plugins.css",
51
- "luckysheet/css/luckysheet.css",
52
- "luckysheet/assets/iconfont/iconfont.css",
53
- ].map(getPublicAssetUrl);
54
43
 
55
44
  export default {
56
45
  name: "luckysheet",
@@ -73,23 +62,12 @@ export default {
73
62
  };
74
63
  },
75
64
  beforeDestroy() {
76
- if (window.luckysheet) {
65
+ if (luckysheet) {
77
66
  this.exitEditMode();
78
- window.luckysheet.destroy();
67
+ luckysheet.destroy();
79
68
  }
80
69
  },
81
- async mounted() {
82
- try {
83
- await loadStyles(luckysheetStyleUrls);
84
- } catch (error) {
85
- console.error("Luckysheet 样式加载失败", error);
86
- return;
87
- }
88
- if (this._isDestroyed) return;
89
- if (!window.luckysheet) {
90
- console.error("luckysheet未初始化");
91
- return;
92
- }
70
+ mounted() {
93
71
  // In some cases, you need to use $nextTick
94
72
  // this.$nextTick(() => {
95
73
  let config = this.options.config || {};
package/src/index.js CHANGED
@@ -1,211 +1,366 @@
1
- /**version-1.0*/
2
- import "./public-path"; // qiankun publicPath 修正,必须保持第一行
1
+ /**version-1.0*/
2
+ import "./public-path"; // qiankun publicPath 修正,必须保持第一行
3
3
  import Vue from "vue";
4
4
  import Cookies from "js-cookie";
5
5
  import "normalize.css/normalize.css"; // a modern alternative to CSS resets
6
- import Button from "element-ui/lib/button";
7
- import Checkbox from "element-ui/lib/checkbox";
8
- import Dialog from "element-ui/lib/dialog";
9
- import Form from "element-ui/lib/form";
10
- import FormItem from "element-ui/lib/form-item";
11
- import Input from "element-ui/lib/input";
12
- import TabPane from "element-ui/lib/tab-pane";
13
- import Tabs from "element-ui/lib/tabs";
14
- import Tooltip from "element-ui/lib/tooltip";
15
- import Loading from "element-ui/lib/loading";
16
- import Message from "element-ui/lib/message";
17
- import MessageBox from "element-ui/lib/message-box";
6
+ import Element from "element-ui";
18
7
  import "@/styles/element-variables.scss";
19
- import "@/styles/index.scss"; // 登录页与业务页共用同一套全局样式
20
-
21
- import App from "@base/App";
22
- import store from "@base/store";
23
- import router, { resetRouter } from "@base/router";
24
- import settings from "@/settings";
25
- import { setToken as setAuthToken } from "@base/utils/auth";
26
-
8
+ import "@/styles/index.scss"; // global css
9
+
10
+ import App from "@base/App";
11
+ import store from "@base/store";
12
+ import router, { resetRouter } from "@base/router";
13
+ import settings from "@/settings";
14
+ import { setToken as setAuthToken } from "@base/utils/auth";
15
+
27
16
  import "@/icons"; // icon
28
17
  import "@base/permission"; // permission control
29
- import "@base/resources/js/base/common.js"; // request 序列化在登录接口阶段即依赖
30
-
31
- import installLoginVab from "@base/utils/loginVab";
32
-
33
- Vue.use(installLoginVab);
34
-
35
- //vform
36
- // import '@base/components/xform/utils/directive'
37
-
38
- import i18n from "@base/lang/index.js";
39
-
40
- /**
41
- * If you don't want to use mock-server
42
- * you want to use MockJs for mock api
43
- * you can execute: mockXHR()
44
- *
45
- * Currently MockJs will be used in the production environment,
46
- * please remove it before going online ! ! !
47
- */
48
- if (process.env.NODE_ENV === "production") {
49
- /* const { mockXHR } = require('../mock')
50
- mockXHR() */
51
- }
52
-
53
- [
54
- Button,
55
- Checkbox,
56
- Dialog,
57
- Form,
58
- FormItem,
59
- Input,
60
- TabPane,
61
- Tabs,
62
- Tooltip,
63
- ].forEach((component) => Vue.use(component));
64
- Vue.use(Loading.directive);
65
- Vue.prototype.$ELEMENT = { size: Cookies.get("size") || "medium" };
66
- Vue.prototype.$loading = Loading.service;
67
- Vue.prototype.$message = Message;
68
- Vue.prototype.$msgbox = MessageBox;
69
- Vue.prototype.$alert = MessageBox.alert;
70
- Vue.prototype.$confirm = MessageBox.confirm;
71
- Vue.prototype.$prompt = MessageBox.prompt;
72
-
18
+
19
+ import * as filters from "@base/filters"; // global filters
20
+
21
+ // main.js 文件添加以下代码
22
+
23
+ import BaseKeepAlive from "@base/utils/keepAlive.js";
24
+
25
+ Vue.component("BaseKeepAlive", BaseKeepAlive);
26
+
27
+ import VXETable from "vxe-table";
28
+ import "vxe-table/lib/style.css";
29
+
30
+ // 引入扩展插件
31
+ // import "@base/components/table/plugins/extend-cell-area/vxe-table-extend-cell-area.es6.min.js";
32
+ // import "@base/components/table/plugins/extend-cell-area/vxe-table-extend-cell-area.min.css";
33
+
34
+ /* // 设置授权信息
35
+ VXETable.setup({
36
+ // showAuthLog: true, // 是否在控制台显示授权信息,专业版支持关闭
37
+ // authId: 'gbeumewkoyt2rhf9', // 获取授权后在官网登录后进入“用户中心”查看
38
+ authId: 'gbeumewkoyt2rhft', // 获取授权后在官网登录后进入“用户中心”查看
39
+ // onAuth (e) {
40
+ // // 打印授权状态
41
+ // console.log(e)
42
+ // }
43
+ }) */
44
+
45
+ import Vab from "@base/utils/vab";
46
+
47
+ Vue.use(Vab);
48
+
49
+ Vue.use(VXETable);
50
+
51
+ /* import tablePluns from "@/mixins/table/index.js"
52
+ VXETable.use(tablePluns) */
53
+
54
+ import "@base/components/table/index.js";
55
+
56
+ import drag from "@base/directive/el-drag-dialog/index.js";
57
+
58
+ Vue.use(drag.install);
59
+
60
+ import elDialogCenter from "@base/directive/el-dialog-center/index.js";
61
+
62
+ Vue.use(elDialogCenter.install);
63
+
64
+ import ErroreBox from "@base/components/errorMsg/index.js";
65
+
66
+ Vue.use(ErroreBox);
67
+
68
+ import ExcelExport from "@base/components/excelExport/index.js";
69
+
70
+ Vue.use(ExcelExport);
71
+
72
+ import ExcelImport from "@base/components/excelImport/index.js";
73
+
74
+ Vue.use(ExcelImport);
75
+
76
+ import ConfirmDialog from "@base/components/confirmDialog/index.js";
77
+
78
+ Vue.use(ConfirmDialog);
79
+
80
+ import baseAlert from "@base/components/baseAlert/index.js";
81
+
82
+ Vue.use(baseAlert);
83
+
84
+ import FormDialog from "@base/components/formDialog/index.js";
85
+
86
+ Vue.use(FormDialog);
87
+
88
+ import permission from "@base/directive/permission";
89
+
90
+ Vue.use(permission);
91
+
92
+ import VabUpload from "@base/components/VabUpload/index.js";
93
+
94
+ Vue.use(VabUpload);
95
+
96
+ Vue.component("baseUpload", () =>
97
+ import("@base/components/VabUpload/view.vue")
98
+ );
99
+
100
+ import baseAttachment from "@base/components/baseAttachment/install";
101
+
102
+ Vue.use(baseAttachment);
103
+ Vue.component("attachmentShowList", () =>
104
+ import("@base/components/baseAttachment/showList")
105
+ );
106
+
107
+ import "@base/resources/js/base/common.js";
108
+
109
+ import vxeFilter from "@base/components/table/vxeFilter/index.js";
110
+
111
+ Vue.use(vxeFilter);
112
+
113
+ import baseTableExport from "@base/components/excelExport/button.vue";
114
+
115
+ Vue.component(baseTableExport.name, baseTableExport);
116
+
117
+ /* Vue.component('extendedProperties', () => import('@base/components/extendedProperties/view.vue')); */
118
+
119
+ import LimitNumber from "@base/directive/LimitNumber/index.js";
120
+
121
+ Vue.use(LimitNumber);
122
+
123
+ import baseInputNumber from "@base/components/baseInputNumber/index.vue";
124
+
125
+ Vue.component(baseInputNumber.name, baseInputNumber);
126
+
127
+ import elReadonly from "@base/directive/el-readonly/index.js";
128
+
129
+ Vue.use(elReadonly);
130
+
131
+ /*import cnPrint from "@base/components/cnPrint/index.js"
132
+
133
+ Vue.use(cnPrint);*/
134
+
135
+ /* Vue.component('oplogTable', () => import('@base/components/oplogTable/index.vue')); */
136
+ import oplogTable from "@base/components/oplogTable/index.vue";
137
+
138
+ Vue.component(oplogTable.name, oplogTable);
139
+
140
+ import baseInputBatch from "@base/components/baseInputBatch/index.vue";
141
+
142
+ Vue.component(baseInputBatch.name, baseInputBatch);
143
+
144
+ import baseArea from "@base/components/baseArea/index.vue";
145
+
146
+ Vue.component(baseArea.name, baseArea);
147
+
148
+ Vue.component("baseInputExport", () =>
149
+ import("@base/components/baseInputExport/index.vue")
150
+ );
151
+
152
+ Vue.component("advancedSearchDialog", () =>
153
+ import("@base/components/advancedSearchDialog/index.vue")
154
+ );
155
+
156
+ import baseTabs from "@base/components/baseTabs/index.vue";
157
+
158
+ Vue.component(baseTabs.name, baseTabs);
159
+
160
+ import baseTabPane from "@base/components/baseTabs/baseTabPane.vue";
161
+
162
+ Vue.component(baseTabPane.name, baseTabPane);
163
+
164
+ import vb_tabs from "@base/components/vb-tabs/index.vue";
165
+ import vb_tab_pane from "@base/components/vb-tabs/tab-pane.vue";
166
+ import xTabs from "@base/components/vb-tabs/x-tabs.vue";
167
+
168
+ Vue.component(vb_tabs.name, vb_tabs);
169
+ Vue.component(vb_tab_pane.name, vb_tab_pane);
170
+ Vue.component(xTabs.name, xTabs);
171
+
172
+ Vue.component("status-tag", () =>
173
+ import("@base/components/statusTag/index.vue")
174
+ );
175
+
176
+ Vue.component("CodeEditor", () =>
177
+ import("@base/components/code-editor/index.vue")
178
+ );
179
+
180
+ Vue.component("scriptDescriptionButton", () =>
181
+ import("@base/components/scriptDescription/button")
182
+ );
183
+
184
+ Vue.component("scriptTestButton", () =>
185
+ import("@base/components/scriptTest/button")
186
+ );
187
+
188
+ import baseTextarea from "@base/components/base-textarea/index.vue";
189
+
190
+ Vue.component(baseTextarea.name, baseTextarea);
191
+
192
+ import jsonImport from "@base/components/jsonImport/index.js";
193
+
194
+ Vue.use(jsonImport);
195
+
196
+ import langImport from "@base/components/langImport/index.js";
197
+
198
+ Vue.use(langImport);
199
+
200
+ //vform
201
+ // import '@base/components/xform/utils/directive'
202
+
203
+ import i18n from "@base/lang/index.js";
204
+
205
+ /**
206
+ * If you don't want to use mock-server
207
+ * you want to use MockJs for mock api
208
+ * you can execute: mockXHR()
209
+ *
210
+ * Currently MockJs will be used in the production environment,
211
+ * please remove it before going online ! ! !
212
+ */
213
+ if (process.env.NODE_ENV === "production") {
214
+ /* const { mockXHR } = require('../mock')
215
+ mockXHR() */
216
+ }
217
+
218
+ Vue.use(Element, {
219
+ size: Cookies.get("size") || "medium", // set element-ui default size
220
+ // locale: enLang // 如果使用中文,无需设置,请删除
221
+ });
222
+
223
+ // register global utility filters
224
+ Object.keys(filters).forEach((key) => {
225
+ Vue.filter(key, filters[key]);
226
+ });
227
+
73
228
  Vue.config.productionTip = false;
74
-
75
- let instance = null;
76
-
77
- function render(props = {}) {
78
- const { container } = props;
79
- instance = new Vue({
80
- router,
81
- store,
82
- i18n,
83
- render: (h) => h(App),
84
- }).$mount(container ? container.querySelector("#app") : "#app");
85
- window.$vueRoot = instance;
86
- }
87
-
88
- if (!window.__POWERED_BY_QIANKUN__) {
89
- // 独立运行 / 主应用形态:行为与拆分前一致
90
- render();
91
- }
92
-
93
- /**
94
- * qiankun 子应用生命周期。
95
- * 引包子应用入口 re-export 即可:export * from "cloud-web-corejs/src/index";
96
- * 主子通信协议见 docs/qiankun微前端改造-实现方案.md 3.3。
97
- */
98
- export async function bootstrap() {}
99
-
100
- export async function mount(props = {}) {
101
- if (props.appCode) {
102
- // 主应用可经 props 覆盖,子应用也可在自身 settings.js 里声明
103
- settings.appCode = props.appCode;
104
- }
105
- if (props.token) {
106
- // token 存 sessionStorage,按 origin 隔离——跨域/跨端口主应用的登录态子应用天然拿不到,
107
- // 主应用显式下发 token 即可免登(写入自身登录态后守卫按已登录走 getInfo2)
108
- setAuthToken(props.token);
109
- store.commit("user/SET_TOKEN", props.token);
110
- }
111
- store.commit("micro/SET_MICRO_CONTEXT", {
112
- appCode: props.appCode || settings.appCode,
113
- // 非数组(null/未传)= 自治嵌入模式:子应用自拉菜单、保留自身壳(micro store 据此置 selfManaged)
114
- menus: Array.isArray(props.menus) ? props.menus : null,
115
- mainAdapter: props.mainAdapter || null,
116
- // 主应用经本地调试覆盖装载:允许 URL 直达未配菜单的页面
117
- debug: !!props.microDebug,
118
- });
119
- // 再次挂载时 unmount 已重置路由,而 roles 仍在会使守卫跳过路由生成,这里主动补一次
120
- if (store.getters.roles && store.getters.roles.length > 0) {
121
- if (store.state.micro.selfManaged) {
122
- await store.dispatch("permission/generateRoutes2", {
123
- flag: store.state.user.userFlag,
124
- });
125
- } else {
126
- await store.dispatch(
127
- "permission/generateRoutesFromProps",
128
- props.menus || []
129
- );
130
- }
131
- }
132
- render(props);
133
- }
134
-
135
- /**
136
- * 保活协议(主应用 loadMicroApp 模式):
137
- * update({ microActive: false }) —— 容器被隐藏:暂停路由监听(守卫 next(false) +
138
- * ensureURL 置空,防止对主应用的 URL 变化做出反应、回写 URL 互相打架);
139
- * update({ microActive: true }) —— 容器重新显示:恢复监听并把当前 hash 同步进路由
140
- * (含主应用在隐藏期间切到本应用另一菜单的深导航场景)。
141
- */
142
- let pausedEnsureURL = null;
143
-
144
- function pauseSubRouter() {
145
- if (store.state.micro.routerPaused) return;
146
- store.commit("micro/SET_ROUTER_PAUSED", true);
147
- const history = router.history;
148
- if (history && typeof history.ensureURL === "function") {
149
- pausedEnsureURL = history.ensureURL;
150
- history.ensureURL = function () {};
151
- }
152
- }
153
-
154
- function resumeSubRouter() {
155
- if (store.state.micro.routerPaused) {
156
- store.commit("micro/SET_ROUTER_PAUSED", false);
157
- if (pausedEnsureURL) {
158
- router.history.ensureURL = pausedEnsureURL;
159
- pausedEnsureURL = null;
160
- }
161
- }
162
- syncSubRouter();
163
- }
164
-
165
- function syncSubRouter() {
166
- const current = window.location.hash.replace(/^#/, "") || "/";
167
- if (router.currentRoute.fullPath !== current) {
168
- router.push(current).catch(() => {});
169
- }
170
- }
171
-
172
- /**
173
- * 主应用页签"刷新"转发过来时在子应用内部重建当前页组件。
174
- * 不能套用主应用那招(delCachedView + 跳 /redirect):子应用与主应用共用同一个
175
- * 浏览器 hash,跳 /redirect 会被主应用 afterEach 判成"离开子应用路由",
176
- * 容器随即隐藏并暂停子应用路由,重建被掐断——表现就是点刷新没反应。
177
- * 改为自增序号通知 AppMain 原地销毁重建,全程不碰 URL。
178
- */
179
- function refreshCurrentView() {
180
- store.commit("micro/BUMP_RELOAD_SEQ");
181
- }
182
-
183
- export async function update(props = {}) {
184
- if (props.microActive === false) {
185
- pauseSubRouter();
186
- } else if (props.microActive === true) {
187
- resumeSubRouter();
188
- }
189
- if (props.microRefresh) {
190
- refreshCurrentView();
191
- }
192
- }
193
-
194
- export async function unmount() {
195
- if (store.state.micro.routerPaused && pausedEnsureURL) {
196
- router.history.ensureURL = pausedEnsureURL;
197
- pausedEnsureURL = null;
198
- }
199
- if (instance) {
200
- instance.$destroy();
201
- if (instance.$el) {
202
- instance.$el.innerHTML = "";
203
- }
204
- instance = null;
205
- }
206
- if (window.$vueRoot) {
207
- window.$vueRoot = null;
208
- }
209
- store.commit("micro/CLEAR_MICRO_CONTEXT");
210
- resetRouter();
211
- }
229
+
230
+ let instance = null;
231
+
232
+ function render(props = {}) {
233
+ const { container } = props;
234
+ instance = new Vue({
235
+ router,
236
+ store,
237
+ i18n,
238
+ render: (h) => h(App),
239
+ }).$mount(container ? container.querySelector("#app") : "#app");
240
+ window.$vueRoot = instance;
241
+ }
242
+
243
+ if (!window.__POWERED_BY_QIANKUN__) {
244
+ // 独立运行 / 主应用形态:行为与拆分前一致
245
+ render();
246
+ }
247
+
248
+ /**
249
+ * qiankun 子应用生命周期。
250
+ * 引包子应用入口 re-export 即可:export * from "cloud-web-corejs/src/index";
251
+ * 主子通信协议见 docs/qiankun微前端改造-实现方案.md 3.3。
252
+ */
253
+ export async function bootstrap() {}
254
+
255
+ export async function mount(props = {}) {
256
+ if (props.appCode) {
257
+ // 主应用可经 props 覆盖,子应用也可在自身 settings.js 里声明
258
+ settings.appCode = props.appCode;
259
+ }
260
+ if (props.token) {
261
+ // token 存 sessionStorage,按 origin 隔离——跨域/跨端口主应用的登录态子应用天然拿不到,
262
+ // 主应用显式下发 token 即可免登(写入自身登录态后守卫按已登录走 getInfo2)
263
+ setAuthToken(props.token);
264
+ store.commit("user/SET_TOKEN", props.token);
265
+ }
266
+ store.commit("micro/SET_MICRO_CONTEXT", {
267
+ appCode: props.appCode || settings.appCode,
268
+ // 非数组(null/未传)= 自治嵌入模式:子应用自拉菜单、保留自身壳(micro store 据此置 selfManaged)
269
+ menus: Array.isArray(props.menus) ? props.menus : null,
270
+ mainAdapter: props.mainAdapter || null,
271
+ // 主应用经本地调试覆盖装载:允许 URL 直达未配菜单的页面
272
+ debug: !!props.microDebug,
273
+ });
274
+ // 再次挂载时 unmount 已重置路由,而 roles 仍在会使守卫跳过路由生成,这里主动补一次
275
+ if (store.getters.roles && store.getters.roles.length > 0) {
276
+ if (store.state.micro.selfManaged) {
277
+ await store.dispatch("permission/generateRoutes2", {
278
+ flag: store.state.user.userFlag,
279
+ });
280
+ } else {
281
+ await store.dispatch(
282
+ "permission/generateRoutesFromProps",
283
+ props.menus || []
284
+ );
285
+ }
286
+ }
287
+ render(props);
288
+ }
289
+
290
+ /**
291
+ * 保活协议(主应用 loadMicroApp 模式):
292
+ * update({ microActive: false }) —— 容器被隐藏:暂停路由监听(守卫 next(false) +
293
+ * ensureURL 置空,防止对主应用的 URL 变化做出反应、回写 URL 互相打架);
294
+ * update({ microActive: true }) —— 容器重新显示:恢复监听并把当前 hash 同步进路由
295
+ * (含主应用在隐藏期间切到本应用另一菜单的深导航场景)。
296
+ */
297
+ let pausedEnsureURL = null;
298
+
299
+ function pauseSubRouter() {
300
+ if (store.state.micro.routerPaused) return;
301
+ store.commit("micro/SET_ROUTER_PAUSED", true);
302
+ const history = router.history;
303
+ if (history && typeof history.ensureURL === "function") {
304
+ pausedEnsureURL = history.ensureURL;
305
+ history.ensureURL = function () {};
306
+ }
307
+ }
308
+
309
+ function resumeSubRouter() {
310
+ if (store.state.micro.routerPaused) {
311
+ store.commit("micro/SET_ROUTER_PAUSED", false);
312
+ if (pausedEnsureURL) {
313
+ router.history.ensureURL = pausedEnsureURL;
314
+ pausedEnsureURL = null;
315
+ }
316
+ }
317
+ syncSubRouter();
318
+ }
319
+
320
+ function syncSubRouter() {
321
+ const current = window.location.hash.replace(/^#/, "") || "/";
322
+ if (router.currentRoute.fullPath !== current) {
323
+ router.push(current).catch(() => {});
324
+ }
325
+ }
326
+
327
+ /**
328
+ * 主应用页签"刷新"转发过来时在子应用内部重建当前页组件。
329
+ * 不能套用主应用那招(delCachedView + 跳 /redirect):子应用与主应用共用同一个
330
+ * 浏览器 hash,跳 /redirect 会被主应用 afterEach 判成"离开子应用路由",
331
+ * 容器随即隐藏并暂停子应用路由,重建被掐断——表现就是点刷新没反应。
332
+ * 改为自增序号通知 AppMain 原地销毁重建,全程不碰 URL。
333
+ */
334
+ function refreshCurrentView() {
335
+ store.commit("micro/BUMP_RELOAD_SEQ");
336
+ }
337
+
338
+ export async function update(props = {}) {
339
+ if (props.microActive === false) {
340
+ pauseSubRouter();
341
+ } else if (props.microActive === true) {
342
+ resumeSubRouter();
343
+ }
344
+ if (props.microRefresh) {
345
+ refreshCurrentView();
346
+ }
347
+ }
348
+
349
+ export async function unmount() {
350
+ if (store.state.micro.routerPaused && pausedEnsureURL) {
351
+ router.history.ensureURL = pausedEnsureURL;
352
+ pausedEnsureURL = null;
353
+ }
354
+ if (instance) {
355
+ instance.$destroy();
356
+ if (instance.$el) {
357
+ instance.$el.innerHTML = "";
358
+ }
359
+ instance = null;
360
+ }
361
+ if (window.$vueRoot) {
362
+ window.$vueRoot = null;
363
+ }
364
+ store.commit("micro/CLEAR_MICRO_CONTEXT");
365
+ resetRouter();
366
+ }