@xingtukeji/micro 1.0.0 → 1.0.1
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/index.ts +59 -36
- package/package.json +1 -1
package/index.ts
CHANGED
|
@@ -6,6 +6,7 @@ export interface AppOption {
|
|
|
6
6
|
url: string
|
|
7
7
|
el?: HTMLElement | string
|
|
8
8
|
preload?: boolean
|
|
9
|
+
token?: ()=>string | string
|
|
9
10
|
params?: { [key: string]: any }
|
|
10
11
|
}
|
|
11
12
|
export interface App extends AppOption {
|
|
@@ -13,24 +14,31 @@ export interface App extends AppOption {
|
|
|
13
14
|
}
|
|
14
15
|
|
|
15
16
|
const _apps = []
|
|
17
|
+
const CONSTANT = {
|
|
18
|
+
KEY: '$xtm', // 父应用注入子应用实例的key
|
|
19
|
+
IS_MICRO: '__XT_MICRO', // 是否在微应用中
|
|
20
|
+
MICRO_NAME: '__XT_MICRO_NAME', // 微应用名称
|
|
21
|
+
MICRO_TOKEN: '__XT_MICRO_TOKEN', // 微应用token
|
|
22
|
+
MICRO_APP: '__XT_MICRO_APP', // 微应用实例
|
|
23
|
+
DOM_ID_PREFIX: 'xt-micro-ifr-' // dom id前缀
|
|
24
|
+
}
|
|
25
|
+
//dom id前缀
|
|
26
|
+
// export const DOM_ID_PREFIX = 'xt-ifr-'
|
|
16
27
|
|
|
17
28
|
/**
|
|
18
29
|
* 判断是否在微应用中
|
|
19
30
|
*/
|
|
20
31
|
const _isMicro = ref(false)
|
|
21
|
-
Object.defineProperty(window,
|
|
32
|
+
Object.defineProperty(window, CONSTANT.IS_MICRO, {
|
|
22
33
|
get: function () {
|
|
23
|
-
return
|
|
34
|
+
return _isMicro.value
|
|
24
35
|
},
|
|
25
36
|
set: function (newValue) {
|
|
26
37
|
_isMicro.value = newValue
|
|
27
|
-
}
|
|
38
|
+
}
|
|
28
39
|
})
|
|
29
40
|
export const isMicro = _isMicro
|
|
30
41
|
|
|
31
|
-
//dom id前缀
|
|
32
|
-
export const DOM_ID_PREFIX = 'xt-ifr-'
|
|
33
|
-
|
|
34
42
|
/**
|
|
35
43
|
* 生成微应用id
|
|
36
44
|
* 增加前缀
|
|
@@ -38,7 +46,7 @@ export const DOM_ID_PREFIX = 'xt-ifr-'
|
|
|
38
46
|
* @returns 返回dom id
|
|
39
47
|
*/
|
|
40
48
|
const generateId = (name: string) => {
|
|
41
|
-
return `${DOM_ID_PREFIX}${name}`
|
|
49
|
+
return `${CONSTANT.DOM_ID_PREFIX}${name}`
|
|
42
50
|
}
|
|
43
51
|
/**
|
|
44
52
|
* 处理微应用url
|
|
@@ -46,12 +54,16 @@ const generateId = (name: string) => {
|
|
|
46
54
|
* @param params 携带参数
|
|
47
55
|
* @returns 拼接后的url
|
|
48
56
|
*/
|
|
49
|
-
const generateURL = (
|
|
57
|
+
const generateURL = (app: AppOption) => {
|
|
50
58
|
function isObject(variable) {
|
|
51
59
|
return variable !== null && typeof variable === 'object' && !Array.isArray(variable)
|
|
52
60
|
}
|
|
53
|
-
const _parmas = typeof params === 'function' ? params() : isObject(params) ? params : {}
|
|
54
|
-
|
|
61
|
+
const _parmas = typeof app.params === 'function' ? app.params() : isObject(app.params) ? app.params : {}
|
|
62
|
+
const _token = typeof app.token === 'function' ? app.token() : isObject(app.token) ? app.token : {}
|
|
63
|
+
return `${app.url}?${CONSTANT.IS_MICRO}=true
|
|
64
|
+
&${CONSTANT.MICRO_NAME}=${app.name}
|
|
65
|
+
&${CONSTANT.MICRO_TOKEN}=${_token}
|
|
66
|
+
&${qs.stringify(_parmas)}`
|
|
55
67
|
}
|
|
56
68
|
|
|
57
69
|
class MicroApp {
|
|
@@ -84,20 +96,20 @@ class MicroApp {
|
|
|
84
96
|
if (!ifr) {
|
|
85
97
|
ifr = document.createElement('iframe')
|
|
86
98
|
ifr.id = generateId(this.app.name)
|
|
87
|
-
const url = generateURL(this.app
|
|
99
|
+
const url = generateURL(this.app)
|
|
88
100
|
ifr.src = url
|
|
89
101
|
ifr.classList.add('micro-iframe')
|
|
90
|
-
ifr.
|
|
91
|
-
|
|
92
|
-
|
|
102
|
+
ifr.addEventListener('load', (event)=>{
|
|
103
|
+
this.onLoad.call(this, event)
|
|
104
|
+
})
|
|
105
|
+
ifr.addEventListener('error', this.onError)
|
|
106
|
+
ifr.addEventListener('unload', this.onUnload)
|
|
93
107
|
this.dom = ifr
|
|
94
108
|
}
|
|
95
|
-
// else {
|
|
96
|
-
// ifr = this.dom
|
|
97
|
-
// }
|
|
98
109
|
isHide ? (ifr.style.display = 'none') : ifr.style.removeProperty('display')
|
|
99
110
|
this.panel = panel
|
|
100
111
|
panel.appendChild(ifr)
|
|
112
|
+
|
|
101
113
|
} else {
|
|
102
114
|
throw new Error('el not found')
|
|
103
115
|
}
|
|
@@ -158,8 +170,9 @@ class MicroApp {
|
|
|
158
170
|
}
|
|
159
171
|
}
|
|
160
172
|
|
|
161
|
-
onLoad() {
|
|
162
|
-
|
|
173
|
+
onLoad(event: Event) {
|
|
174
|
+
console.log('micro app load', this, event)
|
|
175
|
+
_postMicro(this.app)
|
|
163
176
|
}
|
|
164
177
|
|
|
165
178
|
onUnload() {
|
|
@@ -176,7 +189,10 @@ class MicroApp {
|
|
|
176
189
|
* @param app
|
|
177
190
|
*/
|
|
178
191
|
export const setupApp = (app: AppOption) => {
|
|
179
|
-
|
|
192
|
+
//在子应用加载完成后,发送消息给子应用
|
|
193
|
+
// setTimeout(() => {
|
|
194
|
+
// _postMicro(app)
|
|
195
|
+
// },0)
|
|
180
196
|
return (_apps[app.name] = {
|
|
181
197
|
...app,
|
|
182
198
|
instance: new MicroApp(app),
|
|
@@ -213,7 +229,7 @@ export const startApp = (name: string, options?: Partial<AppOption>) => {
|
|
|
213
229
|
} else {
|
|
214
230
|
app.instance.mount(app.el)
|
|
215
231
|
}
|
|
216
|
-
_postMicro()
|
|
232
|
+
// _postMicro(app)
|
|
217
233
|
resolve(app)
|
|
218
234
|
} else {
|
|
219
235
|
reject('app not found')
|
|
@@ -237,32 +253,39 @@ function getQueryParameter(name, url = window.location.href) {
|
|
|
237
253
|
return decodeURIComponent(results[2].replace(/\+/g, " "));
|
|
238
254
|
}
|
|
239
255
|
|
|
256
|
+
interface MicroInitOptions{
|
|
257
|
+
authHandler?: (token: string) => void
|
|
258
|
+
}
|
|
240
259
|
/**
|
|
241
260
|
* 微应用-子应用初始化
|
|
242
261
|
* 非必须,但建议使用
|
|
243
262
|
*/
|
|
244
|
-
export const microInit = () => {
|
|
245
|
-
|
|
263
|
+
export const microInit = (options: MicroInitOptions = {}) => {
|
|
246
264
|
//处理url参数
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
//
|
|
265
|
+
const micro = getQueryParameter(CONSTANT.IS_MICRO)
|
|
266
|
+
const microName = getQueryParameter(CONSTANT.MICRO_NAME)
|
|
267
|
+
//设置环境变量
|
|
251
268
|
if (micro) {
|
|
252
|
-
window[
|
|
269
|
+
window[CONSTANT.IS_MICRO] = true
|
|
253
270
|
}
|
|
254
271
|
//监听message,设置环境变量
|
|
255
272
|
window.addEventListener('message', (e) => {
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
window['__XT_MICRO'] = e.data.data
|
|
273
|
+
if (e.data.cmd === `$xt/micro/${microName}`) {
|
|
274
|
+
console.log('micro', e.data.data)
|
|
275
|
+
window[CONSTANT.MICRO_APP] = e.data.data
|
|
260
276
|
}
|
|
261
277
|
})
|
|
262
|
-
}
|
|
263
278
|
|
|
264
|
-
|
|
279
|
+
//处理token
|
|
280
|
+
const token = getQueryParameter(CONSTANT.MICRO_TOKEN)
|
|
281
|
+
options.authHandler && options.authHandler(token)
|
|
282
|
+
}
|
|
265
283
|
|
|
266
|
-
const _postMicro = () => {
|
|
267
|
-
window.postMessage({ cmd:
|
|
284
|
+
const _postMicro = (app: AppOption) => {
|
|
285
|
+
window.postMessage({ cmd: `$xt/micro/${app.name}`, data: {
|
|
286
|
+
name: app.name,
|
|
287
|
+
url: app.url,
|
|
288
|
+
preload: app.preload,
|
|
289
|
+
// params: app.params
|
|
290
|
+
} }, '*')
|
|
268
291
|
}
|