@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.
Files changed (2) hide show
  1. package/index.ts +59 -36
  2. 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, '__XT_MICRO', {
32
+ Object.defineProperty(window, CONSTANT.IS_MICRO, {
22
33
  get: function () {
23
- return this.__XT_MICRO
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 = (url: string, params: { [key: string]: any } = {}) => {
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
- return `${url}?__XT_MICRO=true&${qs.stringify(_parmas)}`
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.url, this.app.params)
99
+ const url = generateURL(this.app)
88
100
  ifr.src = url
89
101
  ifr.classList.add('micro-iframe')
90
- ifr.onload = this.onLoad.call(this)
91
- // ifr.onunload = this.onUnload
92
- ifr.onerror = this.onError
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
- _postMicro()
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
- // const urlParams = new URLSearchParams(window.location.search)
248
- // const micro = urlParams.get('__XT_MICRO')
249
- const micro = getQueryParameter('__XT_MICRO')
250
- //
265
+ const micro = getQueryParameter(CONSTANT.IS_MICRO)
266
+ const microName = getQueryParameter(CONSTANT.MICRO_NAME)
267
+ //设置环境变量
251
268
  if (micro) {
252
- window['__XT_MICRO'] = true
269
+ window[CONSTANT.IS_MICRO] = true
253
270
  }
254
271
  //监听message,设置环境变量
255
272
  window.addEventListener('message', (e) => {
256
- //
257
- if (e.data.cmd === '$xt/micro') {
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
- // window.postMessage({ cmd: '$xt/micro', data: true }, '*')
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: '$xt/micro', data: true }, '*')
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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xingtukeji/micro",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "private": false,
5
5
  "description": "",
6
6
  "main": "index.ts",