±à¼ÍƼö: |
±¾ÎÄÀ´×Ôsohu£¬±¾ÎÄÖ÷Òª½éÉÜÁËÒÔʵÏÖ΢ǰ¶ËµÄÄ¿±ê£¬´ÓÁã¹¹½¨Ò»Ì×΢ǰ¶ËµÄ¿ª·¢·½°¸µÄ×î¼Ñʵ¼ù¡£ |
|
΢ǰ¶Ë£¨Micro-Frontend£©£¬Êǽ«Î¢·þÎñ£¨Micro-Services£©ÀíÄîÓ¦ÓÃÓÚǰ¶Ë¼¼ÊõºóµÄÏà¹ØÊµ¼ù£¬Ê¹µÃÒ»¸öǰ¶ËÏîÄ¿Äܹ»¾Óɶà¸öÍŶӶÀÁ¢¿ª·¢ÒÔ¼°¶ÀÁ¢²¿Êð¡£
±¾ÎÄÖн«»áÒÔ´ËΪĿ±ê£¬´ÓÁã¹¹½¨Ò»Ì×΢ǰ¶ËµÄ¿ª·¢·½°¸µÄ×î¼Ñʵ¼ù*£¬²¢ÓÃÓÚÍê³É Micro Frontends
ÍøÕ¾ÖеÄʾÀýÓ¦Óãº

* Èκεط½µÄ×î¼Ñʵ¼ù¶¼ÊÇ»ùÓÚÖ÷¹ÛÅжϵ쬲»ÒªÍÑÀëʵ¼Êä´Ó¡£
΢ǰ¶Ë¿ª·¢µÄÄ¿±ê
΢ǰ¶Ëʵ¼ùÖУ¬ÊÂʵÉÏËùÓеÄÐèÇó¶¼ÊÇΪ¡¸¶ÀÁ¢¿ª·¢¡¹ÒÔ¼°¡¸¶ÀÁ¢²¿Êð¡¹ÕâÁ½´óÄ¿±ê·þÎñµÄ£¬»òÕß¿ÉÒÔÈÏΪÊÇÁ½ÕߵľßÌåʵÏÖ´ëÊ©»òÕß×ÔÈ»ÑÜÉú½á¹û¡£Í¨³£ÎÒÃÇËù˵µÄ¡¸Î¢Ç°¶ËÌØÐÔ¡¹°üÀ¨µ«²»½öÏÞÓÚ£º
¼¼ÊõÎ޹أº¸÷¸ö¿ª·¢ÍŶӶ¼¿ÉÒÔ×ÔÐÐÑ¡Ôñ¼¼ÊõÕ»£¬²»ÊÜͬһÏîÄ¿ÖÐÆäËüÍŶÓÓ°Ï죻
´úÂë¶ÀÁ¢£º¸÷¸ö½»¸¶²úÎï¶¼¿ÉÒÔ±»¶ÀÁ¢Ê¹Ó㬱ÜÃâºÍÆäËü½»¸¶²úÎïñîºÏ£»
Ñùʽ¸ôÀ룺¸÷¸ö½»¸¶²úÎïÖеÄÑùʽ²»»áÎÛȾµ½ÆäËü×é¼þ£»
ÔÉúÖ§³Ö£º¸÷¸ö½»¸¶²úÎï¶¼¿ÉÒÔ×ÔÓÉʹÓÃä¯ÀÀÆ÷ÔÉú API£¬¶ø·ÇÒªÇóʹÓ÷â×°ºóµÄ API£»
ΪÁËÄܹ»ÊµÏÖ΢ǰ¶ËµÄÄ¿±ê£¬ÐèÒª¶ÔÏîÄ¿ÕûÌå½øÐвð·ÖºÍ¸ôÀë¡£

΢ǰ¶Ë½áºÏ΢·þÎñµÄ¼Ü¹¹
ÔçЩʱºò£¬ÎÒÃÇ¿ÉÄÜ»áÏëµ½ <iframe> £¬Ïë±Ø¶ÔÓÚ¡¸ÎªÊ²Ã´²»Óà <iframe>¡¹´ó¼Ò¶¼Äܸø³öÁ½Ö»ÊÖÊý²»¹ýÀ´µÄÀíÓÉÁË¡£
½üЩÄ꣬ÁíÒ»Ì× Web ÔÉúµÄ²ð·Ö¸ôÀë·½°¸Öð½¥½øÈëÈËÃǵÄÊÓÒ°£¬ÄDZãÊÇ Web Components¡£²»¹ý£¬ÕâÀï¶Ô
Web Components Ò»Ñù³Ö·ñ¶¨Ì¬¶È¡£
Ϊʲô Web Components ²»ÊÇÒ»¸öÓÐЧ·½°¸
ΪÁËÁ˽â·ñ¶¨ Web Components µÄÔÒò£¬Ê×ÏȼòÒª½éÉÜһϠWeb Components
ÊÇʲô¡£

https://www.webcomponents.org/
Web Components ÊÇÓÉ W3C ά»¤µÄ¼¼Êõ¸ÅÄ£¬Ä¿Ç°°üº¬*£º
Shadow DOM
Custom Elements
HTML Templates
CSS changes
ÕâËIJ¿·Ö¼¼ÊõÄÚÈÝ¡£
* Ôø¾»¹°üº¬¹ý HTML Imports£¬µ«ÔçÒѱ»ÒƳý£¬ºÜ¶àÏà¹Ø×ÊÁ϶¼Ã»ÓиüС£
ÐèҪעÒâµÄÊÇ£¬ËäÈ» Web Components °üº¬ÄÄЩÄÚÈÝÊÇ W3C ά»¤µÄ£¬µ«ÊÇÀïÃæµÄ¼¼Êõ±¾Éí²¢²»ÊÇ£¬Shadow
DOM¡¢Custom Elements ºÍ HTML Templates ¶¼ÊÇ HTML Living
Standard ºÍ DOM Living Standard ÖеÄÕýʽÄÚÈÝ£¬ÓÉ WHATWG ά»¤¡£
Òò´Ë¶ÔÓÚ Web Components µÄ·ñ¶¨Éæ¼°µ½Á½¸ö²ãÃæ£º
×÷Ϊ½»»¥Öмä²ãµÄ³¡¾°Ï£¬Shadow DOM¡¢Custom Elements ºÍ HTML Templates
½â¾öµÄÎÊÌâÊÇÍêÈ«¶ÀÁ¢µÄ£ºShadow DOM ÓÃÓÚ¸¨ÖúÑùʽ¸ôÀ룬Custom Elements ÓÃÓÚ¼ò»¯Æô¶¯´úÂ룬¶ø
HTML Templates ÓÃÓÚÄÚ²¿ÊµÏÖ¶ÔÖмä²ã·â×°ºÁÎÞ°ïÖú¡£×÷Ϊ¼¼ÊõÑ¡ÐͶøÑÔ£¬Ã¿¸öÎÊÌâµÄ½â¾ö·½°¸Ò²ÊÇÏ໥Õý½»µÄ£¬Òò´Ë
Web Components Õâ¸öα¸ÅÄîÔڴ˲¢²»ÄÜ·¢»ÓÈκÎÕûÌå¼ÛÖµ£»
Shadow DOM¡¢Custom Elements ·Ö±ð¶¼²»ÊÇÏàÓ¦ÎÊÌâµÄÓÐЧ½â¾ö·½°¸£¬ÒÔÏ»áÏêϸ˵Ã÷¡£
ÖÁ´Ë£¬ÎÒÃÇÒѾ¿ÉÒÔÍêÈ«Íüµô Web Components Õâ¸öα¸ÅÄֻ¿´¾ßÌå¼¼Êõ±¾Éí¡£
Ê×ÏÈÐèҪעÒâµÄÊÇ Shadow DOM ºÍ Custom Elements ¶¼Ö»ÓÐ IE11+ µÄ
Polyfill Ö§³Ö£¬Òò´ËÐèÒª¿¼ÂÇ IE9 ºÍ IE10 µÄÓ¦ÓÿÉÒÔÖ±½ÓÅųý¡£µ«¼´±ã¶ÔÓÚÖ»ÐèÒª¿¼ÂÇ
IE11+ µÄÓ¦ÓöøÑÔ£¬ÕâÁ½Ïî¼¼ÊõÒ²²¢·Ç×îÓŽ⡣
Custom Elements µÄÒþÐγɱ¾

Custom Elements Ó÷¨
Custom Elements ÓÃÓÚÀ©Õ¹ HTML Elements µÄ Registry£¬Èà HTML
Parser ÒÔ¼°Äܹ»Ê¶±ð×Ô¶¨ÒåµÄÔªËØÃû*£¬²¢ÇÒ»¹Äܹ»×Ô¶¯´¥·¢ÏàÓ¦µÄÉùÃ÷ÖÜÆÚ¡£
* ׼ȷµÄ˵ Custom Elements °üº¬ Autonomous custom elements
ºÍ Customized built-in elements Á½ÖÖÀàÐÍ£¬ÓÉÓÚºóÕß¼ÈûÓÐä¯ÀÀÆ÷µÄͳһÔÉúÖ§³Ö£¨Firefox
Ðû²¼Á˲»»áÖ§³Ö£©Ò²Ã»ÓпÉÓÃµÄ Polyfill£¬Òò´Ë±¾ÎÄÖÐĬÈϽö½öÖ¸´úǰÕß¡£
ÓÐÁË Custom Elements Ö®ºó£¬Æô¶¯´úÂë¾ÍÊÇ HTML
±¾Éí£¨»òÕßÏàÓ¦µÄ DOM API µ÷Óã©£º
<book-cardtitle="Custom
Elements"author="Web"price="42"></book-card> |
ÒÔ¼°£º
constbookCard=document.('book-card')
bookCard.setAttribute('title','Custom Elements')
bookCard.setAttribute('author','Web')
bookCard.setAttribute('price','42') |
ËäÈ»¿´ËƺÍÒ»°ãµÄ HTML Ä£°æ´úÂëÎÞÒ죬µ«ÊÂʵÉÏ Custom Elements ºÍ¿ò¼ÜÄ£°æÖÐÃ÷ÏÔ²»Í¬Ö®´¦µÄÊÇ£ºÃ»ÓÐ
Scoping ºÍ Validation¡£
Èç¹ûÔªËØÃû³öÏÖÆ«²î»òÕß±»ÒÀÀµ×é¼þδ±»ÒýÈëÔËÐÐʱ£¬ÄÇô¾ÍÖ»»áµÃµ½Ò»¸ö HTMLUnknownElement£¬²¢²»»á³öÏÖÈκδíÎ󣬴ӶøÈÃÓû§µÃµ½²»Ô¤ÆÚµÄ½á¹û¡£
ÁíÍâ´Ó DOM ²Ù×÷Ò²ÄÜ¿´³öÒ»¸öÖ÷ÒªÎÊÌâËùÔÚ£ºDOM API ²»Ö§³ÖÅúÁ¿¸üС£
¶ÔÓÚÔÉúµÄ DOM ²Ù×÷¶øÑÔ£¬ÕâÑùµ±È»²»»áÒý·¢Ê²Ã´ÎÊÌâ¡£²»¹ýÔÚµ±Ç°Ó¦ÓÃÖУ¬Custom
Elements µÄÖ°ÔðÊÇÉúÃüÖÜÆÚ´úÀí£¬´¦Àí·½Ê½¾ÍÊÇÔÚ attributeChangedCallback
ÉúÃüÖÜÆÚÖÐ֪ͨÆäËü¿ò¼Ü½øÐиüвÙ×÷¡£ÀàËÆÓÚ£º
classBookCardextendsHTMLElement
{attributeChangedCallback (name: string,oldValue:
string,newValue: string) {someOtherFramework.update({[name]:newValue})}} |
¶øÒòΪûÓÐÅúÁ¿¸üУ¬ÉÏÊöÐÞ¸Ä title¡¢author ºÍ price µÄ³¡¾°ÖУ¬´¥·¢ÁËÕûÕûÈý´ÎÊý¾Ý¸üвÙ×÷£¬¶ø¶ÔÓÚ£¨¾ø´ó¶àÊý£©ÊÓͼͬ²½¿ò¼Ü¶øÑÔ£¬Êý¾Ý¸üлáÓй̶¨µÄ¶îÍâ³É±¾£¨¼´Ê¹Ã»ÓÐÈκÎÊÓͼÐ޸ģ©£¬²»½öÒýÆð²»±ØÒªµÄÐÔÄÜÀË·Ñͬʱ»¹¿ÉÄܽøÈë²»Ô¤ÆÚµÄÖмä״̬¡£
µ±È»´æÔÚһЩ Workaround£¬ÀýÈçÔÚ·â×°²ãͳһµÈ´ý nextTick£¬»òÕßʹÓýÓÊܶÔÏóµÄ DOM
ÊôÐÔÀ´½øÐиüвÙ×÷£¬µ«ÊDz»ÂÛ¶ÔÓÚ¿Éά»¤ÐÔ»¹ÊÇÒ×ÓÃÐÔ¶øÑÔÈÔÈ»»áÔì³É¿É¹ÛµÄÓ°Ïì¡£
Shadow DOM ¶Ô·þÎñ¶ËäÖȾµÄ¸ß¶ÈÆÆ»µ

DOM Tree with Shadow Root
Shadow DOM V0 ÖÐÒýÈëÁË Content Projection µÄ»úÖÆ£¬Í¨¹ý <content>
ÔªËØÊµÏÖ¡£Ö®ºóµÄ V1 °æ±¾ÖиÄΪ <slot> ÔªËØ¡£
ÎÒÃÇÖªµÀ£¬·þÎñ¶ËäÖȾÄܹ»Ö±½Ó²ú³ö¾²Ì¬ HTML ±»ä¯ÀÀÆ÷½âÎö£¬²»¹ý <slot> µÄ³öÏÖÈÃÕýÈ·µÄ·þÎñ¶ËäÖȾ±äµÃ²»¿ÉÄÜ¡£
¼ÙÉèÒ»¸ö×é¼þ¾ß±¸ÈçÏ嵀 Shadow DOM£º
<divclass="foo"><h4>Foo
</h4><slot></slot>
</div> |
±»ÈçÏ´úÂëʹÓãº
<element-details><p>Bar
</p>
</element-details> |
ÄÇôʵ¼ÊäÖȾ½á¹ûΪ£º
<element-details><divclass="foo"><h4>Foo
</h4><p>Bar </p></div>
</element-details> |
ÎÊÌâÔÚÓÚ£¬Èç¹ûÎÒÃÇÕæµÄÔÚ·þÎñ¶ËäÖȾ³ö¸Ã½á¹û£¬ÔÙ´Óä¯ÀÀÆ÷¶ËÆô¶¯£¬ÄÇô·þÎñ¶ËµÄäÖȾ½á¹û¾Í»á±»ÊÓΪÔʼÄÚÈÝ£¬ÔٴνøÐÐͶӰ£º
<element-details><divclass="foo"><h4>Foo
</h4><divclass="foo"><h4>Foo
</h4><p>Bar </p></div></div>
</element-details> |
Ö®ËùÒÔ Web ¿ò¼ÜÖв»»á³öÏÖ¸ÃÎÊÌâ*£¬ÊÇÄܹ»¶ÔͶӰ¹ý³Ì½øÐпØÖÆ£¨Ê¹ÓöîÍâµÄÌØÊâÊôÐÔ½øÐбê×¢£©£¬¶øÔÚÔÉúʵÏÖÖв¢Ã»ÓÐÏàÓ¦µÄ¿ØÖÆÈ¨£¬ÎÞ·¨Çø·ÖÔʼÄÚÈÝ£¬´Ó¶øµ¼Ö²»ÕýÈ·µÄ¶àÖØäÖȾ¡£
* ¸üÕæÊµµÄÔÒòÊÇ´ó²¿·Ö Web ¿ò¼Üѹ¸ù¾Í²»Ö§³Ö´ÓÍⲿ HTML ³éÈ¡×ÓÄÚÈݽڵ㣬ֻÄÜÔÚ¿ò¼ÜÄÚ²¿Ê¹Óá£
ËùÒÔÈç¹ûҪʹÓà Shadow DOM£¬±ØÐëÈÃËùÓпª·¢ÈËԱǩÃû³Ðŵ¾ø²»Ê¹Óà <slot>
ÔªËØ¡£¼´±ãÈç´Ë£¬Ò²»¹ÓÐÆäËü·½ÃæµÄÎÊÌ⣬ÀýÈç <style>¡£
ÓëÒ»°ãµÄ Web ¿ª·¢ÀíÄͬµÄÊÇ£¬Shadow DOM ÖÐʹÓÃÄÚǶµÄ <style>
ÔªËØÊÇÍÆ¼öµÄ¿ª·¢·½Ê½£¨³ý´ËÖ®ÍâÖ»ÓÐ Inline Style ÓÐЧ£©£¬²¢ÇÒ½ö¶Ô Shadow Root
ÓÐЧ¡£
¶øÒ»µ©½« <style> äÖȾΪ×ӽڵ㣬Äǽ«»á¶ÔÒ³ÃæÑùʽ²úÉú¼«´óµÄÆÆ»µ£º
<element-details><style>p{background-color:red}</style><p>Foo
</p>
</element-details>
<p>Bar </p> |
ËùÒÔ³ýÁË <slot> ÔªËØÖ®Í⣬<style> ÔªËØÒ²±ðÓÃÁË£¬ÀÏÀÏʵʵȫ²¿Ð´³É
Inline Style °É¡£²»¹ýÎÊÌâÀ´ÁË£¬Ê¹Óà Shadow DOM µÄºËÐÄÄ¿µÄ¾ÍÊÇÑùʽ¸ôÀ룬²»ÄÜÊÜÒæÓڴ˵Ļ°ÎªÊ²Ã´»¹ÒªÓÃ
Shadow DOM ÄØ£¿
½»¸¶²úÎïµÄÉ趨
ËùνµÄ¡¸Î¢Ç°¶Ë¡¹ÀíÄîÏ£¬½»¸¶²úÎï´óÌå¿ÉÒÔ·ÖΪ¼¸¸ö²»Í¬µÄ¼¶±ð£º
¶ÀÁ¢²¿ÊðµÄÍøÕ¾£º¿ª·¢ÍŶӵĹ¹½¨²úÎïΪ¶ÀÁ¢ÍøÕ¾²¢×ÔÐÐÍê³ÉÍøÕ¾µÄ²¿Êð£¬Í¨³£¶ÔÓ¦µÄ¼¯³É·½Ê½ÎªÔÚ¶à¸ö³¤µÃºÜÏñµÄÍøÕ¾Ö®¼äÌø×ª»òÕß
<iframe> ±êÇ©ÒýÈëÍâ²¿Ò³Ãæ£»
ÍøÕ¾ÄÚÈÝ£º¿ª·¢ÍŶӵĹ¹½¨²úÎïΪ¶ÀÁ¢ÍøÕ¾µ«Í¨¹ýѹËõ°üÉÏ´«²¢²¿Êðµ½Í³Ò»Î»Öã¬Í¨³£¶ÔÓ¦µÄ¼¯³É·½Ê½Îª·þÎñÆ÷¶ËµÄ·´Ïò´úÀí£»
Ò³Ãæ½Å±¾£º¿ª·¢ÍŶӵĹ¹½¨²úÎïΪ Java ´úÂëÎļþ*²¢±»Õ¾µãÒýÈëµ½Õ¾µãÖУ»
* Ŀǰ´æÔÚÒ»¸ö HTML Modules Ìá°¸£¬ËäÈ»·¢²¼µÄÄÚÈÝÊÇ HTML Îļþµ«ÊÇÒýÈ뷽ʽÊÇ ES
Module£¬ÕâÀïÒ²ÊÓΪ·¢²¼ Java ´úÂëµÄ·½Ê½¡£
¶øºóÔÚ·¢²¼ Java ´úÂëµÄ´ó·½Ïò֮ϣ¬´óÌåÓÖ¿ÉÒÔ·ÖΪÁ½¸öÀà±ð£º
·¢²¼×é¼þ£ºÆô¶¯Î»ÖúÍʱ»úÍêÈ«Óɸ¸¼¶ÄÚÈÝ¿ØÖÆ£¬Ö§³Ö¶àʵÀý£¬ÀýÈç Custom Elements£»
·¢²¼¾Ö²¿Ó¦ÓãºÆô¶¯¹ý³ÌÓÉ×ÔÉíÅäÖã¬Ö»Äܵ¥ÊµÀý£¬ÀýÈç single-spa£»
¿ÉÒÔ¼òµ¥µÄÀà±ÈΪ£¬Ç°Õß·¢²¼µÄÊÇ¡¸Àࡹ£¬ºóÕß·¢²¼µÄÊÇ¡¸ÊµÀý¡¹¡£ÕâÀïÎÒÃÇÑ¡ÔñǰÕߣ¬ËùÓз¢²¼µÄÄÚÈݶ¼ÊÇ¿ÉÒÔÖØÓõÄ×é¼þ£¬Óɸ¸×é¼þ¾ö¶¨ºÎʱ¼°ºÎ´¦Ê¹Óá£
ÓÉÓÚ֮ǰÒѾÅųýÁË Custom Elements µÄÑ¡Ïµ±È»Ò²¾ÍÐèÒª¶¨ÒåеĽӿÚÀ´Âú×ã×é¼þ»¯µÄÐèÇó£¬Í¬Ê±±ÜÃâ
Custom Elements ÖеÄȱÏÝ¡£
×é¼þ»¯Éè¼Æ

Custom Elements ÖеÄÉúÃüÖÜÆÚ
ÓÉÓÚÄ¿±ê½ö½öÊÇʵÏÖÉúÃüÖÜÆÚ´úÀí£¬×ÔÉí²¢²»ÐèÒªÊÓͼ¹ÜÀíµÄÖ§³Ö£¬ËùÒÔÒ»ÇÐÏÖÓеĿò¼Ü¶¼¹ýÖØ£¬¶øÇÒ²»¿É¿ØµÄ·çÏÕ¼«¸ß¡£Îª´ËÐèÒª×ÔÐж¨ÒåÒ»Ì×
API£¬Ñ¡ÔñµÄ·½°¸Óкܶ࣬ÀýÈçÒ»¸öºÜ¼ò½éÓÐЧµÄÉè¼Æ¾ÍÊÇ Svelte µÄ get/set API£º
// Set state
component.set({value:42})
// Get state
const{value}=component.get() |
ͨ¹ýͳһµÄ״̬¸üРAPI£¬Äܹ»ÓÐЧ½â¾öÅúÁ¿¸üеÄÎÊÌ⣺
component.set({title:'Svelte-style',author:'Svelte',price:42,}) |
ÖÁÓÚʼþͨÐÅ API ºÍÉúÃüÖÜÆÚ API ¾Í¿ÉÒÔ¸üÎªËæÒâÁË¡£
Ö®ºó£¬»¹ÐèÒª¿¼ÂÇ×é¼þÓë×é¼þÖ®¼äÈç¹û½¨Á¢ÒÀÀµ¹ØÏµ¡£Custom Elements ·½°¸ÖдæÔÚµÄÒ»¸öÏÔÖøÎÊÌâ¾ÍÊÇ¡¸×é¼þʹÓá¹Ó롸ÒÀÀµ½¨Á¢¡¹µÄÍѽڣ¬µ¥·´ÃæÒÀ¿¿Íⲿ»·¾³Ò»´ÎÐÔÒýÈëËùÓÐÄÚÈÝ¡£
Òª½¨Á¢ Java ÎļþÖ®¼äµÄÒÀÀµ¹ØÏµ£¬×îΪֱ¹ÛµÄ·½Ê½¾ÍÊÇ ES Module£¬ÀàËÆÓÚ£º
import{render,Component}from'@domain/mf-helpers'
import{MyComp1}from'@domain/lib1'
classMyComp2extendsComponent{someMethod(){render(MyComp1,myElement)}} |
´ËÍ⻹¿ÉÒÔ¿¿ Dynamic Imports£¨Stage 3 Proposal£©´¦Àí¶¯Ì¬ÄÚÈݵÄÒÀÀµ£º
import{render,Component}from'@domain/mf-helpers'
classMyComp2extendsComponent{asyncsomeMethod()
{const{MyComp1}= awaitimport('@domain/lib1')render(MyComp1,myElement)}} |
»ùÓÚ ES Module ½¨Á¢µÄÒýÓùØÏµ£¬¿ÉÒÔÈÃ×é¼þµÄ¿ÉÓÃÐÔ±äµÃ¾ø¶Ô¿É¿¿¡£Èç¹û±»ÒÀÀµÄ£¿é¼ÓÔØÊ§°Ü£¬ÄÇôµ±Ç°Ä£¿éÒ²²»»á±»Ö´ÐУ¬´Ó¶ø½øÈ뵽ͳһµÄ´íÎó´¦ÀíÒ³Ãæ¡£µ±È»£¬ÔÚ
Dynamic Import µÄ·½Ê½Ï£¬µ÷ÓÃÕß¿ÉÒÔ×ÔÐж¨Òå¾Ö²¿´íÎó´¦Àí£¬Ìṩ Fallback Ö§³Ö*¡£
* ³ý·ÇÓÐÃ÷È·µÄÓ¦Óñ߽磨ÀýÈçС³ÌÐò¼¶±ðµÄ¶ÀÁ¢×Ó³ÌÐò£©£¬·ñÔò Fallback ÐÐΪ²¢²»¿¿Æ×£¬¶ÔÓÚÕûÌåÓ¦ÓöøÑÔÒÀÀµ²»¿ÉÓõÄÇé¿öÏÂÓ¦¸ÃÁ¢¼´±¨´í£¬¶ø·Ç¾¡×î´óŬÁ¦ÔËÐС£
ÕâÑùÔÚÔ´Âë²ãÃæÉϼ«´ó±£Ö¤Á˿ɶÁÐԺͿÉά»¤ÐÔ£¬ÓÐЧÌáÉýÁË¿ª·¢Ð§ÂÊ¡£
µ±È»£¬ÎÒÃÇÖªµÀʵ¼ÊÓ¦ÓÃÖв¢²»»áÔÚÉú²ú»·¾³Ö±½ÓʹÓÃä¯ÀÀÆ÷µÄÄ£¿éÖ§³Ö£¬¶øÊÇÔ¤ÏȽøÐдò°ü¹¹½¨¡£ÎªÁ˱£³Ö¶ÀÁ¢²¿ÊðµÄÄ¿±ê£¬ÐèÒªÔÚ¹¹½¨¹ý³ÌÖÐÅųýÆäËü×é¼þµÄÒÀÀµ£¬²¢½«ÒÀÀµµÄÈ·¶¨¹ý³ÌÑÓÆÚµ½ÔËÐÐʱµÄ´¦Àí¡£
¶øÖÁÓÚÑùʽ¸ôÀ룬ֱ½Ó½»Óɸ÷¸öÍŶÓ×ÔÐд¦Àí¼´¿É£¬Ö÷Á÷¿ò¼Ü»ù±¾¶¼ÌṩÁË×é¼þÑùʽ½â¾ö·½°¸¡£´ËÍ⣬¿¿Ô¼¶¨Ç°×º²¢²»ÄܱÜÃâÑùʽ³åÍ»£¬ËäÈ»²»»áÎÛȾ¸¸×é¼þ£¬µ«ÈÔÈ»Äܹ»¶Ô×Ó×é¼þ²úÉúÎÛȾ¡££¨³ý·ÇֻʹÓø¸×ÓÑ¡ÔñÆ÷²»Óúó´úÑ¡ÔñÆ÷£©
Ò»°ãÔÚÕû¸öÓ¦ÓÃÖУ¬Ö»ÓÐijһ¼¶Ìض¨×é¼þ²Å»áʹÓ÷ÓÉ£¨Ã¿¸ö×é¼þÓò»Óõõ½×Ô¼ºÐÄÀïÓÐÊý£©£¬Òò´Ë×é¼þÉè¼ÆÖн«µ±Ç°µÄ
basePath ºÍ navigationFn ¾ÓÉ Context ²ã²ã´«µÝ£¬Èç¹ûÓÐij¸ö×é¼þÐèҪʵÏÖ×Ó·ÓÉ£¬×ÔÐзâ×°²¢±©Â¶µ½Ï¼¶¼´¿É¡£
¹¹½¨Ó벿Êð²ßÂÔ
֮ǰÒѾÌáµ½£¬ÎªÁ˱£Ö¤¿ª·¢Ð§ÂÊ£¬Ô´ÂëÖнö½öʹÓà ES Module À´ÒýÈëÍⲿ×é¼þ£¬²»¹ý²¢²»´ò°üµ½µ±Ç°×é¼þÖУ¬¶øÊÇÍÆ³Ùµ½ÔËÐÐʱ¾ö¶¨¡£
ÕâÀï¿ÉÄÜ»á²úÉúµÄÒÉÎÊÊÇ£¬×é¼þÊÇ·ñÐèÒª·¢²¼µ½ Registry£¿
´ð°¸ÊÇÐèÒª*£¬ÎªÁËʵÏÖÁ½¸öÄ¿±ê£º
Library as a Constraint£ºÄ£¿éµ¼³ö¡¢ÀàÐÍÇ©ÃûÄܹ»¾²Ì¬È·¶¨£»
Registry as a CDN£º²»Í¬°æ±¾Í¬Ê±´¦ÓÚ¿É·ÃÎÊ״̬£»
* ¼¼Êõ²ãÃæÉÏÈÔÈ»ÊDz»ÐèÒªµÄ£¬Ö»ÐèÒª·¢²¼ºóµÄ URL ¼´¿É¡£
ÕâÀïµÄ Registry ²¢²»Ò»¶¨ÊÇ NPM Registry£¬ÈκÎÄܹ»Îȶ¨×·ËݵĻúÖÆ¾ù¿É£¬ÀýÈç
Git Tags¡£
ËäÈ»¹¹½¨¹¤¾ß²ãÃæ²»ÒªÇó°²×°ÒÀÀµ£¬µ«ÊÇ×÷ΪÒÀÀµ°²×°Äܹ»ÓÐЧÌáÉý¿ª·¢ÌåÑ飬ÀýÈç±à¼Æ÷µÄ´úÂëÌáʾ£¬Í¬Ê±°æ±¾·¢²¼Ó¦µ±·ûºÏÓïÒ廯°æ±¾ºÅµÄÒªÇ󣨲¢Äܹ»½øÐÐÔËÐÐʱÑéÖ¤£©¡£
ͬÑù£¬ËäÈ»ÔËÐÐʱÐèÒªµÄÖ»ÓÐ×é¼þ·¢²¼µÄ URL£¬È»¶øÍ¨¹ý Registry ·¢²¼Äܹ»»ñµÃÖî¶àÓÅÊÆ£º
È«°æ±¾ÊµÊ±¿ÉÓ㺷¢²¼Ð°汾²¢²»»áÌæ»»µôÔÓа汾£¬ËùÓа汾ͬʱ´¦ÓÚ¿ÉÓÃ״̬£¬Äܹ»Í¨¹ýÔÚ
URL ÖÐÖ¸Ã÷°æ±¾½øÐзÃÎÊ£¬ÀýÈç https://unpkg.com/@angular/core@6.0.4
/bundles/core.umd.js£¬ÒÔÖÁÓÚÔÚÇл»°æ±¾£¨¸üлòÕß»ØÍË£©Ê±£¬²¢²»ÐèÒªÖØÐ²¿ÊðÏàÓ¦´úÂ룬¶ø½ö½öÐ޸İ汾ÅäÖÃÎļþ¼´¿É£»
Alias ×Ô¶¯¸üУºÎªÁË·½±ã×Ô¶¯Í¬²½£¬²âÊÔ»·¾³ÖпÉÒÔ²¢²»Ê¹ÓþßÌå°æ±¾ºÅ£¬¶øÊ¹Óà Alias£¬ÀýÈçÔÚ
Staging »·¾³ÖÐʹÓà @stable£¬¾ÍÄÜÎÞÐèÅäÖÃ×Ô¶¯Í¬²½×îа汾£¬¿ìËÙÑéÖ¤¼æÈÝÐÔÎÊÌâ¡£
³ý´ËÖ®Í⣬ÐèÒªÒýÈëÔËÐÐʱµÄÒÀÀµ¹ÜÀí·½°¸¡£
ES Module ËäÈ»ÔÚËùÓÐÖ÷Á÷ä¯ÀÀÆ÷Öж¼ÒѾµÃµ½Ö§³Ö£¬µ«ÊǴ󲿷ÖÓ¦ÓÃÈÔÈ»ÐèÒªÕչ˲¿·ÖÀϾɰ汾£¬Í¬Ê±
ES Module µÄÄ£¿éÒýÈë¹ý³ÌÎÞ·¨À¹½Ø£¬Òò´ËÎÞ·¨Ê¹ÓÃÔÉúʵÏÖ¡£
µ±Ç°µÄÖ÷Á÷Ä£¿é¸ñʽÖУ¬Äܹ»ÓÃÓÚä¯ÀÀÆ÷ÔËÐÐʱµÄÖ»ÓÐ AMD ºÍ System.register Á½ÖÖ£¬Ïà±È֮ϺóÕßҪǿ´óµÄ¶à£¬¼¸ºõÌṩÁË
ES Module µÄÓïÒåµÄÍêÕûÖ§³Ö£¨ÀýÈçÑ»·ÒÀÀµºÍ¶¥²ãÒì²½µÈ´ý£©¡£Í¬Ê±£¬ºóÕßÒ²ÓÐ SystemJS
ÕâÑùµÄÓÅÐ㹤¾ß£¬×Ô´øÀ©Õ¹Ö§³Ö£¬´Ó¶øÎÞÐè´ÓÁ㿪ʼ×ÔÐÐʵÏÖ¡£
ÀýÈç¶ÔÓÚ ES Module µÄ´úÂ룺
import{render,Component}from'@domain/mf-helpers'
import{MyComp1}from'@domain/lib1'
exportclassMyComp2extendsComponent{someMethod(){render(MyComp1,myElement)}} |
´ò°üΪ System.registry ¸ñʽºóÊä³öΪ£º
System.register('@domain/lib2',
['@domain/mf-helpers','@domain/lib1'], function(exports,module)
{'use strict';varrender,Component,MyComp1; return{setters:[function(module)
{render=module.render;Component=module.Component;}
,function(module){MyComp1=module.MyComp1;}], execute:function()
{classMyComp2extendsComponent{someMethod() {render(MyComp1,myElement);}}
exports('MyComp2',MyComp2);}};}); |
ÕâÀïËäȻûÓÐÆäËüÍⲿÒÀÀµ£¬µ«ÐèҪעÒâµÄÊÇ£¬@domain Ö®ÍâµÄÆäËü×é¼þÄÚ²¿ÒÀÀµ²¢Ã»ÓÐʵʱ¸üеÄÒªÇ󣬿ÉÒÔÖ±½Ó´ò°üµ½ÎļþÖС£
ΪÁ˽øÐа汾ÑéÖ¤£¬ÐèÒª¶ÔÊä³öÄÚÈݽøÐв¿·ÖÀ©Õ¹£º
System.pkgInfo({name:'@domain/lib2',version:'1.0.1',
dependencies: {'@domain/mf-helpers':{version:'^1.0.0'},'
@domain/lib1':{version:'^1.2.3'},}});System.register(/*
... */); |
´Ó¶øÄܹ»ÑéÖ¤ lib1 ºÍ lib2 ÊÇ·ñÆ¥Åä°æ±¾ÒªÇ󣨻¹¿ÉÒÔÓÐÆäËüºóÐøÀ©Õ¹ÓÃ;£©¡£
ËäÈ»ÕâÀォ mf-helpers ×÷ΪÍⲿÒÀÀµ£¬µ«ÊÇÍêȫӦµ±ÔÊÐíÄÚÁª£¬Òò´ËÆäÄÚ²¿ÊµÏÖ±ØÐëÍêÈ« Structural£¬´Ó¶ø±ÜÃ⸱±¾¼ä³åÍ»*¡£
* ׼ȷµÄ˵²¢Ã»ÓбÜÃ⣬ֻÊÇ֪ͨÏà¹ØÈËԱȥ½â¾ö¡£
ËùÒÔÔËÐÐʱÐèÒªÀ©Õ¹ System.register() ºÍ System.instantiate()
Á½¸ö¹³×Ó£¬²¢Ôö¼Ó System.pkgInfo() µÄʵÏÖ¡£
ÒÀÀµ¿âµÄ¸´ÓÃ
ËäȻ΢ǰ¶ËµÄÄ¿±êÊÇ´úÂë¸ôÀ룬µ«ÊÇÈÔÈ»¿ÉÒÔÔÊÐí¿ª·¢ÈËÔ±Ö÷¶¯ÉùÃ÷µÄ¿É¸´ÓÃÄÚÈÝ¡£
ÔÚµ±Ç°µÄ·¢²¼·½Ê½Ï£¬¶Ô¿É¸´ÓÃÒÀÀµºÍ²»¿É¸´ÓÃÒÀÀµ½øÐвîÒ컯´¦ÀíÊ®·Ö¼òµ¥£º²»¿É¸´ÓÃÒÀÀµ´ò°üµ½×é¼þÄÚ²¿£¬¿É¸´ÓÃÒÀÀµ±£ÁôÄ£¿éÉùÃ÷¡£²»¹ýÈÔÈ»´æÔÚµÄÎÊÌâÊÇ£¬ÈçºÎʵÏֿɸ´ÓÃÒÀÀµµÄ¸´Óã¿
ΪÁËÄܹ»½øÐÐÒÀÀµ¸´Óã¬ÐèÒªÄܹ»¶ÔÒÀÀµ½øÐжÀÁ¢´ò°ü²¢¼Ç¼Æä URL£º
System.pkgInfo({name:'@domain/lib3',version:'1.0.1',
dependencies: {'some-lib':{version:'^1.0.0',path:'./some-lib.js'},}}); |
ÓÚÊǵ± lib3 ±»ÔËÐÐʱ¼ÓÔØÊ±£¬»áÅжϵ±Ç°»·¾³ÖÐÊÇ·ñÒѾ´æÔÚ¼æÈÝ ^1.0.0 °æ±¾µÄ some-lib
°ü£¬Èç¹û²»´æÔÚ£¬ÔòÇëÇó¶ÔÓ¦µÄ URL »ñÈ¡¡£
²»¹ýÓ¦µ±×¢Ò⣬ͬһÒÀÀµµÄµ¥¸±±¾Óë¶à¸±±¾²îÒì¿ÉÒÔ»áÓ°ÏìÔËÐнá¹û£¬ÉùÃ÷¿É¸´ÓõÄÒÀÀµÊ±ÐèҪȷ±£Æä×ñÑÓïÒ廯°æ±¾ºÅ²¢ÇÒûÓÐÄÚ²¿×´Ì¬£¬Í¬Ê±Ò²Ï£Íû×ÔÉíûÓÐÆäËüÍⲿÒÀÀµ¡£µ±È»ÏÖʵÖÐÒ²ºÜÈÝÒ×ÕÒµ½¿É¸´ÓÃÒÀÀµµÄµäÐÍ£¬±ÈÈç³£ÓõŤ¾ß¿â£ºlodash
»òÕß moment¡£
ÔÚÏßʾÀý
ÕâÀïÖØÐ´ÁË https://micro-frontends.org/ÖеÄÈýÍŶÓÏîÄ¿£¬·Ö±ðÓÉ Angular¡¢React¡¢Vue
ʵÏÖ£¬ÍêÃÀ¶ÔÓ¦ÑÕÉ«¹ØÏµ¡£
ʾÀýµØÖ·Îª£ºhttps://trotyl.github.io/ mif-demo-entry/£¬ÏàÓ¦µÄ×é¼þÔ´Âë·Ö±ðλÓÚ£º
trotyl/mif-demo-angular
trotyl/mif-demo-react
trotyl/mif-demo-vue |
»ù´¡ÉèʩλÓÚ£º
trotyl/mif-core
trotyl/mif-runtime |
ÓÉÓÚÎÄÕÂÊǹØÓÚ Micro-Frontend µÄÌÖÂÛ£¬Òò´ËʾÀý´úÂëÖй㷺ʹÓà mif ×÷Ϊǰ׺¡£
ʾÀýÖÐÒÔ×îÍâ²ã Red ÍŶÓ×é¼þ×÷Ϊ¸ù×é¼þÆô¶¯£º
const{render,ROOT_CONTEXT}
=mif.coreSystem.import ('https://trotyl.github.io/mif-demo-angula
r/demo-angular.mif.js') .then(m=>m.RedApp).then
(RedApp=>render(RedApp,{context:ROOT_CONTEXT},document.body)) |
¿ÉÒÔ¿´³ö£¬ÎÄÕ·ֱð´ÓÈý¸ö²»Í¬µÄ GitHub Repo ÖмÓÔØÁË×é¼þ½Å±¾£¬¹²Í¬¹¹³ÉÁËÕâ¸öÍêÕûµ«Ç°¶ËÓ¦Óãº

Ò³Ãæ½Å±¾ÇëÇó
ͬʱ£¬ËäÈ»Èý¸ö×é¼þÖж¼Ê¹ÓÃÁË moment ×÷ΪÒÀÀµ£¬µ«ÓÉÓÚÉèÖÃÁËÔÊÐí¸´Óã¬ÔÚÕû¸öÓ¦ÓÃÖнö½ö±»¼ÓÔØÒ»´Î£¬Ö®ºó±»ËùÓÐ×é¼þËù¹²Óá£
ʾÀýÖÐʹÓõÄÁÙʱ֧³Ö¿âÈÔÈ»´æÔںܶàÎÊÌ⣬²¢²»½¨ÒéÖ±½ÓÔÚÕæÊµµÄ΢ǰ¶ËÏîĿʹÓá£
дÔÚ×îºó
΢ǰ¶ËÊÇÒ»¸ö¾Þ´óµÄ»°Ì⣬±¾ÎÄÓÉÓÚʱ¼ä¹ØÏµ£¬²¢Ã»ÓÐÉæ¼°µ½ËùÓпÉÄܵķ½Ãæ¡£ÔÚĿǰµÄºÜ¶àÍŶÓÖУ¬Î¢Ç°¶Ëʵ¼ùÍùÍùÒâζמ޴óµÄÎþÉü£¬ÀýÈç½ö½öΪÁËÓÅ»¯ËùνµÄ²¿Êðʱ¼ä£¬¾Í²»¹ËÒ»ÇÐµÄ·ÅÆúÓ¦ÓÃÐÔÄÜ¡¢´úÂëÖÊÁ¿¡¢¿ª·¢ÌåÑéµÈµÈ¡£¶ø±¾ÎĵÄÄ¿±êÔòÊÇ̽Ë÷Ò»Ìõ¾¡¿ÉÄܱ£Áôµ±Ç°Ç°¶ËÉú̬µÄÓÅÐãʵ¼ù£¬ÓÖÄܹ»Âú×ã΢ǰ¶Ë¿ª·¢ÀíÄîµÄ¾«Ö»¯·½°¸¡£ |