±à¼ÍƼö: |
±¾ÎÄÀ´×Ôsegmentfault£¬±¾ÎĽéÉÜÁËǰ¶Ë΢·þÎñ»¯Ë¼Ïë½éÉÜ£¬Î¢Ç°¶ËµÄËÄ´óÉè¼ÆÀíÄîÒÔ¼°ÕûÌåµÄ¹¤³ÌÁ÷³ÌµÈÏà¹ØÄÚÈÝ¡£ |
|
Ë¢ÐÂÒ³Ãæ£¿Â·Óɲð·Ö£¿No£¬¶¯Ì¬¼ÓÔØ×é¼þ¡£
±¾ÎÄ·ÖΪÒÔÏÂËIJ¿·Ö£º
ǰ¶Ë΢·þÎñ»¯Ë¼Ïë½éÉÜ
΢ǰ¶ËµÄÉè¼ÆÀíÄî
ʵս΢ǰ¶Ë¼Ü¹¹Éè¼Æ
»ùÓÚ Mooa ½øÐÐǰ¶Ë΢·þÎñ»¯
ǰ¶Ë΢·þ»¯
¶ÔÓÚǰ¶Ë΢·þ»¯À´Ëµ£¬ÓÐÕâôһЩ·½°¸£º
Web Component ÏÔÈ»¿ÉÒÔÒ»¸öºÜÓÅÐãµÄ»ù´¡¼Ü¹¹¡£È»¶ø£¬ÎÒÃDz¢²»¿ÉÄÜÈ¥´óÁ¿µØ¸´Ð´ÒÑÓеÄÓ¦Óá£
iFrame¡£ÄãÊÇËµÕæµÄÂð£¿
ÁíÍâÒ»¸ö΢ǰ¶Ë¿ò¼Ü Single-SPA£¬ÏÔÈ»ÊÇÒ»¸ö¸üºÃµÄ·½Ê½¡£È»¶ø£¬Ëü²¢·Ç Production
Ready¡£
ͨ¹ý·ÓÉÀ´ÇзÖÓ¦Ó㬶øÕâ¸öÌø×ª»áÓ°ÏìÓû§ÌåÑé¡£
µÈµÈ¡£
Òò´Ë£¬µ±ÎÒÃÇ¿¼ÂÇǰ¶Ë΢·þÎñ»¯µÄʱºò£¬ÎÒÃÇÏ£Íû£º
¶ÀÁ¢²¿Êð
¶ÀÁ¢¿ª·¢
¼¼ÊõÎÞ¹Ø
²»Ó°ÏìÓû§ÌåÑé
¶ÀÁ¢¿ª·¢
ÔÚ¹ýÈ¥µÄ¼¸ÐÇÆÚÀÎÒ»¨·ÑÁË´óÁ¿µÄʱ¼äÔÚѧϰ Single-SPA
µÄ´úÂë¡£µ«ÊÇ£¬ÎÒ·¢ÏÖËüÔÚ¿ª·¢ºÍ²¿ÊðÉÏÕæµÄÌ«Âé·³ÁË£¬ÍêÈ«´ï²»µ½¶ÀÁ¢²¿ÊðµØ±ê×¼¡£°´ Single-SPA
µÄÉè¼Æ£¬ÎÒÐèÒªÔÚÈë¿ÚÎļþÖÐÉùÃûÎÒµÄÓ¦Óã¬È»ºó²ÅÄÜÈ¥¹¹½¨£º
declareChildApplication('inferno',
() => import('src/inferno/inferno.app.js'),
pathPrefix('/inferno')); |
ͬʱ£¬ÔÚÎÒµÄÓ¦ÓÃÀÎÒ»¹ÐèҪȥָ¶¨ÎÒµÄÉúÃüÖÜÆÚ¡£Õâ¾ÍÒâζ×Å£¬µ±ÎÒ¿ª·¢ÁËÒ»¸öеÄÓ¦ÓÃʱ£¬±ØÐë¸üÐÂÁ½·Ý´úÂ룺Ö÷¹¤³ÌºÍÓ¦Óá£ÕâʱÎÒÃÇ»¹¼«¿ÉÄÜÔÚͬһ¸öÔ´ÂëÀ﹤×÷¡£
µ±³öÏÖ¶à¸öÍŶӵÄʱºò£¬ÔÚͬһ·ÝÔ´ÂëÀ﹤×÷£¬ÏÔÈ»±äµÃÏ൱µÄ²»¿É¿¿¡ª¡ª±ÈÈç˵£¬¶Ô·½ÍŶÓʹÓõÄÊÇ Tab£¬¶øÎÒÃÇʹÓõÄÊÇ
2 ¸ö¿Õ¸ñ£¬¸ô±ÚµÄÀÏÍõÓõÄÊÇ 4 ¸ö¿Õ¸ñ¡£
¶ÀÁ¢²¿Êð
Ò»¸öµ¥ÌåµÄǰ¶ËÓ¦ÓÃ×î´óµÄÎÊÌâÊÇ£¬¹¹½¨³öÀ´µÄ js¡¢css ÎļþÏ൱µÄ¾Þ´ó¡£¶øÎ¢Ç°¶ËÔòÒâζ×Å£¬Õâ¸öÎļþ±»¶ÀÁ¢µØ²ð·Ö³É¶à¸öÎļþ£¬ËüÃDZã¿ÉÒÔ¶ÀÁ¢È¥²¿ÊðÓ¦Óá£
ÎÒÃÇÕæµÄÐèÒª¼¼ÊõÎÞ¹ØÂð£¿
µÈµÈ£¬ÎÒÃÇÊÇ·ñÕæµÄÐèÒª¼¼ÊõÎ޹أ¿Èç¹ûÎÒÃDz»ÐèÒª¼¼ÊõÎ޹صϰ£¬Î¢Ç°¶ËÎÊÌâ¾ÍºÜÈÝÒ×½â¾öÁË¡£
ÊÂʵÉÏ£¬¶ÔÓڴ󲿷ֵĹ«Ë¾ºÍÍŶÓÀ´Ëµ£¬¼¼ÊõÎÞ¹ØÖ»ÊÇÒ»¸öÎÞ¹ØÍ´Ñ÷µÄ»°Êõ¡£µ±Ò»¼Ò¹«Ë¾µÄ¼¸¸ö´´Ê¼ÈËʹÓÃÁË
Java£¬ÄÇô¼«ÓпÉÄÜÔÚδÀ´µÄÑ¡ÐÍÉϼÌÐøÊ¹Óà Java¡£³ý·Ç£¬Ò»Ð©¶îÍâµÄ·þÎñÀ´Ê¹Óà Python À´ÊµÏÖÈ˹¤ÖÇÄÜ¡£Òò´Ë£¬Ôڴ󲿷ֵÄÇé¿öÏ£¬ÈÔÈ»ÊǼ¼ÊõջΨһ¡£
¶ÔÓÚǰ¶ËÏîÄ¿À´Ëµ£¬¸üÊÇÈç´Ë£ºÒ»¸ö²¿ÃÅÀï»ù±¾ÉÏÖ»»áÑ¡ÓÃÒ»¸ö¿ò¼Ü¡£
ÓÚÊÇ£¬ÎÒÃÇÑ¡ÔñÁË Angular¡£
²»Ó°ÏìÓû§ÌåÑé
ʹÓ÷ÓÉÌø×ªÀ´½øÐÐǰ¶Ë΢·þÎñ»¯£¬ÊÇÒ»Öֺܼòµ¥¡¢¸ßЧµÄÇзַ½Ê½¡£È»¶ø£¬Â·ÓÉÌø×ªµØ¹ý³ÌÖУ¬»áÓÐÒ»¸ö°×ÆÁµÄ¹ý³Ì¡£ÔÚÕâ¸ö¹ý³ÌÖУ¬Ìø×ªÇ°µÄÓ¦Óúͽ«ÒªÌø×ªµÄÓ¦Ó㬶¼Ê§È¥Á˶ÔÒ³ÃæµÄ¿ØÖÆÈ¨¡£Èç¹ûÕâ¸öÓ¦ÓóöÁËÎÊÌ⣬ÄÇôÓû§¾Í»áÒ»Á³ã±ơ£
ÀíÏëµÄÇé¿öÏ£¬ËüÓ¦¸Ã¿ÉÒÔ±»¿ØÖÆ¡£
΢ǰ¶ËµÄÉè¼ÆÀíÄî
Éè¼ÆÀíÄîÒ»£ºÖÐÐÄ»¯Â·ÓÉ
»¥ÁªÍø±¾ÖÊÊÇÈ¥ÖÐÐÄ»¯µÄÂ𣿲»£¬DNS ¾ö¶¨ÁËËü²»ÊÇ¡£TAB£¬¾ö¶¨ÁËËü²»ÊÇ¡£
΢·þÎñ´Ó±¾ÖÊÉÏÀ´Ëµ£¬ËüÓ¦¸ÃÊÇÈ¥ÖÐÐÄ»¯µÄ¡£µ«ÊÇ£¬ËüÓÖ²»ÄÜÊÇÍêÈ«µÄÈ¥ÖÐÐÄ»¯¡£¶ÔÓÚÒ»¸ö΢·þÎñÀ´Ëµ£¬ËüÐèÒªÒ»¸ö·þÎñ×¢²áÖÐÐÄ£º
·þÎñÌṩ·½Òª×¢²áͨ¸æ·þÎñµØÖ·£¬·þÎñµÄµ÷Ó÷½ÒªÄÜ·¢ÏÖÄ¿±ê·þÎñ¡£
¶ÔÓÚÒ»¸öǰ¶ËÓ¦ÓÃÀ´Ëµ£¬Õâ¸ö¶«Î÷¾ÍÊÇ·ÓÉ¡£

´ÓÒ³ÃæÉÏÀ´Ëµ£¬Ö»ÓÐÎÒÃÇÔÚÍøÒ³ÉÏÌí¼ÓÒ»¸ö²Ëµ¥Á´½Ó£¬Óû§²ÅÄÜÖªµÀij¸öÒ³ÃæÊÇ¿ÉÒÔʹÓõġ£

¶ø´Ó´úÂëÉÏÀ´Ëµ£¬ÄǾÍÊÇÎÒÃÇÐèÒªÓÐÒ»¸öµØ·½À´¹ÜÀíÎÒÃǵÄÓ¦Óãº**·¢ÏÖ´æÔÚÄÄЩӦÓã¬ÄĸöÓ¦ÓÃʹÓÃÄĸö·ÓÉ¡£
¹ÜÀíºÃÎÒÃǵÄ·ÓÉ£¬Êµ¼ÊÉϾÍÊǹÜÀíºÃÎÒÃǵÄÓ¦Óá£
Éè¼ÆÀíÄî¶þ£º±êʶ»¯Ó¦ÓÃ
ÔÚÉè¼ÆÒ»¸ö΢ǰ¶Ë¿ò¼ÜµÄʱºò£¬ÎªÃ¿¸öÏîĿȡһ¸öÃû×ÖµÄÎÊÌâ¾À½áÁËÎҺܾ᪡ªÔõôȥ¹æ·¶»¯Õâ¸ö¶«Î÷¡£Ö±µ½£¬ÎÒÔÙÒ»´ÎÏëµ½ÁË¿µÍþ¶¨ÂÉ£º
ϵͳÉè¼Æ(²úÆ·½á¹¹µÈͬ×éÖ¯ÐÎʽ£¬Ã¿¸öÉè¼ÆÏµÍ³µÄ×éÖ¯£¬Æä²úÉúµÄÉè¼ÆµÈͬÓÚ×éÖ¯Ö®¼äµÄ¹µÍ¨½á¹¹¡£

»»¾äÈË»°Ëµ£¬¾ÍÊÇͬһ¸ö×é֯ϣ¬²»¿ÉÄÜÓÐÁ½¸öÏîÄ¿µÄÃû³ÆÊÇÒ»ÑùµÄ¡£
ËùÒÔ£¬Õâ¸öÎÊÌâºÜ¼òµ¥¾Í½â¾öÁË¡£
Éè¼ÆÀíÄîÈý£ºÉúÃüÖÜÆÚ
Single-SPA Éè¼ÆÁËÒ»¸ö»ù±¾µÄÉúÃüÖÜÆÚ£¨ËäÈ»ËüûÓÐͳһ¹ÜÀí£©£¬Ëü°üº¬ÁËÎåÖÖ״̬£º
load£¬¾ö¶¨¼ÓÔØÄĸöÓ¦Ó㬲¢°ó¶¨ÉúÃüÖÜÆÚ
bootstrap£¬»ñÈ¡¾²Ì¬×ÊÔ´
mount£¬°²×°Ó¦Óã¬Èç´´½¨ DOM ½Úµã
unload£¬É¾³ýÓ¦ÓõÄÉúÃüÖÜÆÚ
unmount£¬Ð¶ÔØÓ¦Óã¬Èçɾ³ý DOM ½Úµã
ÓÚÊÇ£¬ÎÒÔÚÉè¼ÆÉÏ»ù±¾ÉÏÑØÓÃÁËÕâ¸öÉúÃüÖÜÆÚ¡£ÏÔÈ»£¬ÖîÈç load Ö®Àà¶ÔÓÚÎÒµÄÉè¼ÆÊǶàÓàµÄ¡£
Éè¼ÆÀíÄîËÄ£º¶ÀÁ¢²¿ÊðÓëÅäÖÃ×Ô¶¯»¯
´ÓijÖÖÒâÒåÉÏÀ´Ëµ£¬Õû¸öÿϵͳÊÇÎ§ÈÆ×ÅÓ¦ÓÃÅäÖýøÐеġ£Èç¹ûÓ¦ÓõÄÅäÖÃÄÜ×Ô¶¯»¯£¬ÄÇôÕû¸öϵͳ¾Í×Ô¶¯»¯¡£
µ±ÎÒÃÇÖ»¿ª·¢Ò»¸öеÄ×é¼þ£¬ÄÇôÎÒÃÇÖ»ÐèÒª¸üÐÂÎÒÃǵÄ×é¼þ£¬²¢¸üÐÂÅäÖü´¿É¡£¶øÕâ¸öÅäÖñ¾ÉíÒ²Ó¦¸ÃÊÇÄÜ×Ô¶¯Éú³ÉµÄ¡£
ʵս΢ǰ¶Ë¼Ü¹¹Éè¼Æ
»ùÓÚÒÔÉϵÄǰÌᣬϵͳµÄ¹¤×÷Á÷³ÌÈçÏÂËùʾ£º

ÕûÌåµÄ¹¤³ÌÁ÷³ÌÈçÏÂËùʾ£º
Ö÷¹¤³ÌÔÚÔËÐеÄʱºò£¬»áÈ¥·þÎñÆ÷»ñÈ¡×îеÄÓ¦ÓÃÅäÖá£
Ö÷¹¤³ÌÔÚ»ñÈ¡µ½ÅäÖú󣬽«Ò»Ò»´´½¨Ó¦Ó㬲¢ÎªÓ¦Óðó¶¨ÉúÃüÖÜÆÚ¡£
µ±Ö÷¹¤³Ì¼à²âµ½Â·Óɱ仯µÄʱºò£¬½«Ñ°ÕÒÊÇ·ñÓжÔÓ¦µÄ·ÓÉÆ¥Åäµ½Ó¦Óá£
µ±Æ¥Åä¶Ô¶ÔÓ¦Ó¦ÓÃʱ£¬Ôò¼ÓÔØÏàÓ¦µÄÓ¦Óá£
¹Ê¶ø£¬Æä¶ÔÓ¦µÄ¼Ü¹¹ÈçÏÂͼËùʾ£º

¶ÀÁ¢²¿ÊðÓëÅäÖÃ×Ô¶¯»¯
ÎÒÃÇ×öµÄ²¿Êð²ßÂÔÈçÏ£ºÎÒÃǵÄÓ¦ÓÃʹÓõÄÅäÖÃÎļþ½Ð apps.json£¬ÓÉÖ÷¹¤³ÌÈ¥»ñÈ¡Õâ¸öÅäÖá£Ã¿´Î²¿ÊðµÄʱºò£¬ÎÒÃÇÖ»ÐèÒª½«
apps.json Ö¸Ïò×îеÄÅäÖÃÎļþ¼´¿É¡£ÅäÖõÄÎļþÀàÈçÏÂËùʾ£º
96a7907e5488b6bb.json
6ff3bfaaa2cd39ea.json
dcd074685c97ab9b.json |
Ò»¸öÓ¦ÓõÄÅäÖÃÈçÏÂËùʾ£º
{ "name":
"help", "selector": "help-root",
"baseScriptUrl": "/assets/help",
"styles": [ "styles.bundle.css"
], "prefix": "help",
"scripts": [ "inline.bundle.js",
"polyfills.bundle.js", "main.bundle.js"
]
} |
ÕâÀïµÄ selector ¶ÔÓ¦ÓÚÓ¦ÓÃËùÐèÒªµÄ DOM ½Úµã£¬prefix ÔòÊÇÓÃÓÚ URL ·ÓÉÉÏ¡£ÕâЩ¶¼ÊÇ×Ô¶¯´Ó
index.html ÎļþºÍ package.json ÖлñÈ¡Éú³ÉµÄ¡£
Ó¦Óüä·ÓÉ¡ª¡ªÊ¼þ
ÓÉÓÚÏÖÔÚµÄÓ¦Óñä³ÉÁËÁ½²¿·Ö£ºÖ÷¹¤³ÌºÍÓ¦Óò¿·Ö¡£¾Í»á³öÏÖÒ»¸öÎÊÌ⣺ֻÓÐÒ»¸ö¹¤³ÌÄܲ¶»ñ·Óɱ仯¡£µ±ÓÉÖ÷¹¤³ÌÈ¥¸Ä±äÓ¦ÓõĶþ¼¶Â·ÓÉʱ£¬¾ÍÎÞ·¨ÓÐЧµØ´«´ïµ½×ÓÓ¦Óá£ÔÚÕâʱ£¬Ö»ÄÜͨ¹ýʼþµÄ·½Ê½È¥Í¨Öª×ÓÓ¦Óã¬×ÓÓ¦ÓÃÒ²ÐèÒª¼à²âÊÇ·ñÊǵ±Ç°Ó¦ÓõÄ·ÓÉ¡£
if (event.detail.app.name
=== appName) {
let urlPrefix = 'app'
if (urlPrefix) {
urlPrefix = `/${window.mooa.option.urlPrefix}/`
}
router.navigate([event.detail.url.replace(urlPrefix
+ appName, '')])
} |
ÏàËÆµÄ£¬µ±ÎÒÃÇÐèÒª´ÓÓ¦Óà A Ìø×ªµ½Ó¦Óà B ʱ£¬ÎÒÃÇÒ²ÐèÒªÕâÑùµÄÒ»¸ö»úÖÆ£º
window.addEventListener('mooa.routing.navigate',
function(event: CustomEvent) {
const opts = event.detail
if (opts) {
navigateAppByName(opts)
}
}) |
ʣϵÄÖîÈç Loading ¶¯»Ò²ÊÇÀàËÆµÄ¡£
ʹÓà Mooa ½øÐÐ
So£¬ÎÒÃǾÍÓÐÁËǰ¶Ë΢·þÎñ¿ò¼Ü Mooa¡£Ëü»ùÓÚ single-spa && single-spa-angular-cli£¬²¢ÇÒ·ûºÏÒÔÉϵÄÉè¼ÆË¼Ïë¡£
GayHub µØÖ·£ºhttps://github.com/phodal/mooa
¶ÔÓÚÖ÷¹¤³Ì¶øÑÔ£¬Ö»ÐèÒªÒÔϵļ¸ÐдúÂë¾Í¿ÉÒÔÍê³ÉÉÏÃæµÄ¹¦ÄÜ£º
http.get<any[]>('/assets/apps.json')
.subscribe(data => {
data.map((config) => {
that.mooa.registerApplication(config.name, config,
mooaRouter.matchRoute(config.prefix));
});
this.mooa.start();
});
this.router.events.subscribe((event: any) =>
{
if (event instanceof NavigationEnd) {
that.mooa.reRouter(event);
}
}); |
²¢Ìí¼ÓÒ»¸ö¶ÔÓ¦µÄ×ÓÓ¦Ó÷ÓÉ£º
{
path: 'app/:appName/:route',
component: HomeComponent
} |
ÔòÈçÉÏËùÊöµÄËĸö²½Öè¡£
¶ÔÓÚ×Ó¹¤³Ì¶øÑÔ£¬ÔòÖ»ÐèÒªÒ»¸ö¶ÔÓ¦µÄ Hook ²Ù×÷£º
mooaPlatform.mount('help').then((opts)
=> {
platformBrowserDynamic().bootstrapModule(AppModule)
.then((module) => {
opts['attachUnmount'](module);
});
}); |
²¢ÉèÖúöÔÓ¦µÄ base_href:
providers: [
{provide: APP_BASE_HREF, useValue: mooaPlatform.appBase()},
] |
àÅ£¬¾ÍÊÇÕâô¼òµ¥¡£DEMO ÊÓÆµÈçÏ£º
Demo µØÖ·¼û£ºhttp://mooa.phodal.com/
GitHub ʾÀý£ºhttps://github.com/phodal/mooa |