@fulgurjs/federation 5.1.3 → 5.2.0
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/CHANGELOG.md +17 -0
- package/README.en.md +7 -5
- package/README.md +14 -12
- package/dist/context.cjs +2 -2
- package/dist/context.js +2 -2
- package/dist/index.cjs +141 -48
- package/dist/index.js +141 -48
- package/dist/react-adapter.cjs +32 -1
- package/dist/react-adapter.d.cts +1 -1
- package/dist/react-adapter.d.ts +1 -1
- package/dist/react-adapter.js +32 -1
- package/dist/react.d.ts +2 -2
- package/dist/runtime-entry.d.ts +2 -2
- package/dist/runtime.js +7 -7
- package/dist/vue-adapter.cjs +99 -15
- package/dist/vue-adapter.d.cts +1 -1
- package/dist/vue-adapter.d.ts +1 -1
- package/dist/vue-adapter.js +100 -16
- package/examples/README.en.md +47 -0
- package/examples/README.md +40 -18
- package/examples/react/README.md +83 -0
- package/examples/react/host/README.md +49 -0
- package/examples/react/host/fulgurjs.config.ts +31 -0
- package/examples/{react-remote → react/host}/index.html +2 -1
- package/examples/react/host/package-lock.json +2381 -0
- package/examples/react/host/package.json +24 -0
- package/examples/react/host/src/App.tsx +19 -0
- package/examples/react/host/src/main.tsx +33 -0
- package/examples/react/host/src/pages/UtilsDemo.tsx +32 -0
- package/examples/react/host/src/remotePages.tsx +16 -0
- package/examples/{react-remote → react/host}/tsconfig.json +2 -3
- package/examples/{react-remote → react/host}/vite.config.ts +2 -2
- package/examples/react/remote/README.md +47 -0
- package/examples/react/remote/fulgurjs.config.ts +20 -0
- package/examples/{react-host → react/remote}/index.html +2 -1
- package/examples/react/remote/package-lock.json +2323 -0
- package/examples/react/remote/package.json +23 -0
- package/examples/react/remote/src/App.tsx +16 -0
- package/examples/react/remote/src/exposes/ClickButton.tsx +15 -0
- package/examples/react/remote/src/exposes/pages/DetailPage.tsx +10 -0
- package/examples/react/remote/src/exposes/pages/HomePage.tsx +12 -0
- package/examples/react/remote/src/exposes/utils.ts +10 -0
- package/examples/react/remote/src/main.tsx +11 -0
- package/examples/{react-host → react/remote}/tsconfig.json +3 -4
- package/examples/{react-host → react/remote}/vite.config.ts +2 -2
- package/examples/vue/README.md +85 -0
- package/examples/vue/host/README.md +50 -0
- package/examples/vue/host/fulgurjs.config.ts +30 -0
- package/examples/vue/host/index.html +12 -0
- package/examples/vue/host/package-lock.json +1855 -0
- package/examples/vue/host/package.json +21 -0
- package/examples/vue/host/src/App.vue +12 -0
- package/examples/vue/host/src/main.ts +44 -0
- package/examples/vue/host/src/pages/HomePage.vue +16 -0
- package/examples/vue/host/src/pages/UtilsDemo.vue +45 -0
- package/examples/vue/host/tsconfig.json +13 -0
- package/examples/vue/host/vite.config.ts +8 -0
- package/examples/vue/remote/README.md +47 -0
- package/examples/vue/remote/fulgurjs.config.ts +20 -0
- package/examples/vue/remote/index.html +12 -0
- package/examples/vue/remote/package-lock.json +1833 -0
- package/examples/vue/remote/package.json +20 -0
- package/examples/vue/remote/src/App.vue +16 -0
- package/examples/vue/remote/src/exposes/ClickButton.vue +16 -0
- package/examples/vue/remote/src/exposes/pages/DetailPage.vue +14 -0
- package/examples/vue/remote/src/exposes/pages/HomePage.vue +11 -0
- package/examples/vue/remote/src/exposes/utils.ts +10 -0
- package/examples/vue/remote/src/main.ts +6 -0
- package/examples/vue/remote/tsconfig.json +13 -0
- package/examples/vue/remote/vite.config.ts +8 -0
- package/package.json +2 -2
- package/examples/host/fulgurjs.config.ts +0 -26
- package/examples/react-host/README.md +0 -28
- package/examples/react-host/fulgurjs.config.ts +0 -19
- package/examples/react-host/package.json +0 -23
- package/examples/react-host/src/App.tsx +0 -66
- package/examples/react-host/src/federation/pages.data.ts +0 -21
- package/examples/react-host/src/main.tsx +0 -8
- package/examples/react-remote/fulgurjs.config.ts +0 -17
- package/examples/react-remote/package.json +0 -22
- package/examples/react-remote/src/Button.tsx +0 -15
- package/examples/react-remote/src/main.tsx +0 -6
- package/examples/react-remote/src/pages/Detail.tsx +0 -10
- package/examples/react-remote/src/pages/Home.tsx +0 -14
- package/examples/react-remote/src/utils.ts +0 -3
- package/examples/remote-a/fulgurjs.config.ts +0 -24
- package/examples/remote-a/src/views/Detail.vue +0 -3
- package/examples/remote-a/src/views/Home.vue +0 -3
package/dist/runtime.js
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
var de=/^v?(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:-((?:[0-9A-Za-z-]+)(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z.-]+)?$/;function L(a){let c=de.exec(String(a).trim());return c?{major:Number(c[1]),minor:Number(c[2]??0),patch:Number(c[3]??0),pre:c[4]?c[4].split("."):[]}:null}function ge(a,c){if(a.length===0&&c.length===0)return 0;if(a.length===0)return 1;if(c.length===0)return-1;let l=Math.max(a.length,c.length);for(let o=0;o<l;o++){let
|
|
1
|
+
var de=/^v?(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:-((?:[0-9A-Za-z-]+)(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z.-]+)?$/;function L(a){let c=de.exec(String(a).trim());return c?{major:Number(c[1]),minor:Number(c[2]??0),patch:Number(c[3]??0),pre:c[4]?c[4].split("."):[]}:null}function ge(a,c){if(a.length===0&&c.length===0)return 0;if(a.length===0)return 1;if(c.length===0)return-1;let l=Math.max(a.length,c.length);for(let o=0;o<l;o++){let d=a[o],y=c[o];if(d===void 0)return-1;if(y===void 0)return 1;let w=/^\d+$/.test(d),b=/^\d+$/.test(y);if(w&&b){let I=Number(d)-Number(y);if(I!==0)return I}else{if(w!==b)return w?-1:1;if(d!==y)return d<y?-1:1}}return 0}function O(a,c){let l=L(a),o=L(c);return!l||!o?a<c?-1:a>c?1:0:l.major!==o.major?l.major-o.major:l.minor!==o.minor?l.minor-o.minor:l.patch!==o.patch?l.patch-o.patch:ge(l.pre,o.pre)}var he=/^[a-z]+[+:-]/i;function j(a,c){if(c===!1||c==null||c==="")return!0;let l=String(c).trim();return!l||l==="*"||l==="latest"||he.test(l)?!0:l.split("||").some(o=>ye(a,o.trim()))}function ye(a,c){if(!c||c==="*")return!L(a)?.pre.length;let l=c.split(/\s+-\s+/);if(l.length===2){let y=l[0].trim(),w=l[1].trim();return!(!j(a,`>=${y}`)||!j(a,`<=${w}`))}let o=L(a);if(!o)return!1;let d=Se(c);if(d===null)return!0;for(let y of d)if(!Pe(o,a,y))return!1;return!(o.pre.length>0&&!d.some(y=>y.ver.pre.length>0)&&!d.some(w=>w.ver.major===o.major&&w.ver.minor===o.minor&&w.ver.patch===o.patch))}function Se(a){let c=[],l=a.trim().split(/\s+/).filter(Boolean);if(l.length===0)return null;for(let o of l){let d=/^(>=|<=|>|<|=|\^|~)?(.*)$/.exec(o);if(!d)return null;let y=d[1],w=d[2],b=Ee(y,w);if(b===null)return null;c.push(...b)}return c}function Ee(a,c){let l=we(c);if(!l)return null;let{ver:o,partial:d}=l;switch(a){case"^":{let y=Re(o);return y?[{op:">=",ver:o},{op:"<",ver:y}]:null}case"~":{let y=d>=2?{major:o.major,minor:o.minor+1,patch:0,pre:[]}:{major:o.major+1,minor:0,patch:0,pre:[]};return[{op:">=",ver:o},{op:"<",ver:y}]}case">=":return[{op:">=",ver:o}];case">":return d===1?[{op:">=",ver:{major:o.major+1,minor:0,patch:0,pre:[]}}]:d===2?[{op:">=",ver:{major:o.major,minor:o.minor+1,patch:0,pre:[]}}]:[{op:">",ver:o}];case"<":return d===1?[{op:"<",ver:{major:o.major,minor:0,patch:0,pre:[]}}]:d===2?[{op:"<",ver:{major:o.major,minor:o.minor,patch:0,pre:[]}}]:[{op:"<",ver:o}];case"<=":return[{op:"<=",ver:o}];case"=":case void 0:return d===1?[{op:">=",ver:o},{op:"<",ver:{major:o.major+1,minor:0,patch:0,pre:[]}}]:d===2?[{op:">=",ver:o},{op:"<",ver:{major:o.major,minor:o.minor+1,patch:0,pre:[]}}]:[{op:"=",ver:o}];default:return null}}function Re(a){return a.major>0?{major:a.major+1,minor:0,patch:0,pre:[]}:a.minor>0?{major:0,minor:a.minor+1,patch:0,pre:[]}:{major:0,minor:0,patch:a.patch+1,pre:[]}}function we(a){let c=a.replace(/^v/,"").trim();if(!c||c==="*"||c==="x"||c==="X")return{ver:{major:0,minor:0,patch:0,pre:[]},partial:0};let l=c.split("."),o=[],d=0;for(let b of l.slice(0,3))if(/^\d+$/.test(b))o.push(Number(b)),d++;else{if(b==="x"||b==="X"||b==="*")break;break}let y=c.split("-"),w=y.length>1?y.slice(1).join("-").split("+")[0].split("."):[];return d===0&&w.length===0?{ver:{major:0,minor:0,patch:0,pre:[]},partial:0}:{ver:{major:o[0]??0,minor:o[1]??0,patch:o[2]??0,pre:w},partial:d}}function be(a,c){switch(c){case">=":return a>=0;case">":return a>0;case"<":return a<0;case"<=":return a<=0;case"=":return a===0}}function Pe(a,c,l){let o=`${a.major}.${a.minor}.${a.patch}`+(a.pre.length?`-${a.pre.join(".")}`:"");if(l.upper)return!(!(O(o,`${l.ver.major}.${l.ver.minor}.${l.ver.patch}`+(l.ver.pre.length?`-${l.ver.pre.join(".")}`:""))>=0)||!(O(o,`${l.upper.major}.${l.upper.minor}.${l.upper.patch}`)<0));let d=O(o,`${l.ver.major}.${l.ver.minor}.${l.ver.patch}`+(l.ver.pre.length?`-${l.ver.pre.join(".")}`:"")),y=be(d,l.op);return l.ver.pre.length>0&&a.pre.length===0&&(l.op===">"||l.op==="<")?!1:y}var S=class extends Error{code;details;constructor(c,l,o,d){super(`[fulgurjs:${c}] ${l}`,d),this.name="FgError",this.code=c,this.details=o}},E={REMOTE_LOAD_FAILED:"MFU-001",REMOTE_NAME_MISMATCH:"MFU-002",SHARE_STRICT_VERSION:"MFU-003",SHARE_NOT_AVAILABLE:"MFU-004",CONTAINER_REINIT_CONFLICT:"MFU-005",MODULE_NOT_EXPOSED:"MFU-006",PRELOAD_FAILED:"MFU-007",REMOTE_UNKNOWN:"MFU-008",EMPTY_EXPORTS:"MFU-009",SINGLETON_SKEW:"MFU-010",SETUP_INVALID_EXPORT:"MFU-011",SETUP_RUN_FAILED:"MFU-012",SETUP_SESSION_KEY_MISSING:"MFU-013",SETUP_RECURSION:"MFU-014"};var W="5.2.0";var $e="__fulgurjsSetup",_e="__FULGURJS_APP_CONFIG__",D=15e3,z=2,Me=5,ve=3e4,Ie=4e3,Te=.2;function Oe(){let a=Object.create(null),c=new Map,l=[],o=new Set,d=new Map,y=new Map,w=new WeakMap,b=new WeakMap,I={},Z=()=>{for(let e of l)try{e.init?.(I)}catch(r){console.warn("[fulgurjs] \u8FD0\u884C\u65F6\u6269\u5C55\u521D\u59CB\u5316\u5931\u8D25\uFF0C\u8BE5\u6269\u5C55\u5C06\u4E0D\u53EF\u7528\uFF1A",e.name,r)}},U=new Map,k,Q=e=>{let r=U.get(e);return r||U.set(e,r={}),r},V=()=>globalThis[_e]??{};async function K(e,r,t,s){let i=u=>u instanceof S?u:new S(E.SETUP_RUN_FAILED,`\u73B0\u8C61\uFF1A\u8FDC\u7A0B\u5E94\u7528 "${e}" \u7684 ${s} \u521D\u59CB\u5316\u5931\u8D25\u3002
|
|
2
2
|
\u539F\u56E0\uFF1A${String(u?.message??u)}
|
|
3
|
-
\u4FEE\u6CD5\uFF1A\u68C0\u67E5\u5E76\u4FEE\u590D\u8BE5 ${s} \u51FD\u6570\u540E\u91CD\u65B0\u52A0\u8F7D\uFF1B\u5931\u8D25\u7F13\u5B58\u5DF2\u6E05\u9664\uFF0C\u53EF\u4EE5\u76F4\u63A5\u91CD\u8BD5\u3002`,{remote:e,phase:s});k=e;let n;try{n=r(t)}catch(u){throw i(u)}finally{k=void 0}try{await n}catch(u){throw i(u)}}async function ee(e,r,t,s){e.debug.setup="pending";try{if(e.manifestUrl)try{await F(`${e.name}/${t}`)}catch{}let i=await r.get(t),n=i?.default;if(typeof n!="function")throw new S(E.SETUP_INVALID_EXPORT,`\u73B0\u8C61\uFF1A\u8FDC\u7A0B\u5E94\u7528 "${e.name}" \u7684 setup \u6A21\u5757 "${t}" \u65E0\u6CD5\u521D\u59CB\u5316\u3002
|
|
3
|
+
\u4FEE\u6CD5\uFF1A\u68C0\u67E5\u5E76\u4FEE\u590D\u8BE5 ${s} \u51FD\u6570\u540E\u91CD\u65B0\u52A0\u8F7D\uFF1B\u5931\u8D25\u7F13\u5B58\u5DF2\u6E05\u9664\uFF0C\u53EF\u4EE5\u76F4\u63A5\u91CD\u8BD5\u3002`,{remote:e,phase:s},{cause:u});k=e;let n;try{n=r(t)}catch(u){throw i(u)}finally{k=void 0}try{await n}catch(u){throw i(u)}}async function ee(e,r,t,s){e.debug.setup="pending";try{if(e.manifestUrl)try{await F(`${e.name}/${t}`)}catch{}let i=await r.get(t),n=i?.default;if(typeof n!="function")throw new S(E.SETUP_INVALID_EXPORT,`\u73B0\u8C61\uFF1A\u8FDC\u7A0B\u5E94\u7528 "${e.name}" \u7684 setup \u6A21\u5757 "${t}" \u65E0\u6CD5\u521D\u59CB\u5316\u3002
|
|
4
4
|
\u539F\u56E0\uFF1A\u9ED8\u8BA4\u5BFC\u51FA\u7C7B\u578B\u4E3A ${i==null?String(i):typeof n}\uFF0C\u5E94\u4E3A\u51FD\u6570\u3002
|
|
5
5
|
\u4FEE\u6CD5\uFF1A\u5728 setup \u6307\u5411\u7684\u6587\u4EF6\u4E2D\u9ED8\u8BA4\u5BFC\u51FA\u51FD\u6570\uFF0C\u4F8B\u5982 export default async function setup(context) { ... }\uFF1B\u5177\u540D onSession \u53EF\u9009\u3002`,{remote:e.name,module:t});if(i.onSession!==void 0&&typeof i.onSession!="function")throw new S(E.SETUP_INVALID_EXPORT,`\u73B0\u8C61\uFF1A\u8FDC\u7A0B\u5E94\u7528 "${e.name}" \u7684 setup \u6A21\u5757 "${t}" \u65E0\u6CD5\u521D\u59CB\u5316\u3002
|
|
6
6
|
\u539F\u56E0\uFF1AonSession \u5BFC\u51FA\u7C7B\u578B\u4E3A ${typeof i.onSession}\uFF0C\u5E94\u4E3A\u51FD\u6570\u3002
|
|
7
7
|
\u4FEE\u6CD5\uFF1A\u5C06 onSession \u6539\u4E3A\u5177\u540D\u5BFC\u51FA\u7684\u51FD\u6570\uFF0C\u6216\u5220\u9664\u8BE5\u5BFC\u51FA\u3002`,{remote:e.name,module:t});s.setupExports=i,await K(e.name,n,{appContext:V(),signal:(s.controller??=new AbortController).signal},"setup"),e.debug.setup="ready"}catch(i){throw e.debug.setup="failed",s.setupExports=void 0,i}}async function re(e,r,t){let s=V(),i=s?.sessionKey;if(typeof i!="string"||i==="")throw new S(E.SETUP_SESSION_KEY_MISSING,`\u73B0\u8C61\uFF1A\u8FDC\u7A0B\u5E94\u7528 "${e.name}" \u58F0\u660E\u4E86 onSession\uFF0C\u4F46\u5BBF\u4E3B\u5C1A\u672A\u63D0\u4F9B\u6709\u6548\u7684 AppContext.sessionKey\u3002
|
|
8
8
|
\u539F\u56E0\uFF1A\u5F53\u524D\u503C\u4E3A ${i===void 0?"\u7F3A\u5931":JSON.stringify(i)}\u3002
|
|
9
|
-
\u4FEE\u6CD5\uFF1A\u5BBF\u4E3B\u6BCF\u6B21\u767B\u5F55\u6216\u91CD\u767B\u65F6\u751F\u6210\u65B0\u7684\u975E\u654F\u611F\u767B\u5F55\u4EE3\u6B21 ID\uFF0C\u5E76\u5728\u52A0\u8F7D\u8FDC\u7A0B\u9875\u9762\u524D\u8C03\u7528 provideAppContext({ ..., sessionKey: '\u767B\u5F55\u4EE3\u6B21 ID' })\uFF1B\u4E0D\u8981\u4F7F\u7528 token \u539F\u6587\u3002`,{remote:e.name});if(r.sessionPromise&&r.sessionKey===i)return r.sessionPromise;r.controller?.abort();let n=new AbortController;r.controller=n,r.sessionKey=i;let u=r.sessionPromise?r.sessionPromise.catch(()=>{}):Promise.resolve(),p=(async()=>{await u,!n.signal.aborted&&await K(e.name,t,{appContext:s,sessionKey:i,signal:n.signal},"onSession")})();return r.sessionPromise=p,p.catch(()=>{r.sessionKey===i&&(r.sessionKey=void 0,r.sessionPromise=void 0)}),p}async function te(e,r){let t=r?.[$e];if(typeof t!="string"||t==="")return;let s=Q(e.name);s.setupPromise||(s.setupPromise=ee(e,r,t,s).catch(n=>{throw s.setupPromise=void 0,n})),await s.setupPromise;let i=s.setupExports?.onSession;typeof i=="function"&&await re(e,s,i)}function ne(){for(let e of U.values()){try{e.controller?.abort()}catch{}e.sessionKey=void 0,e.sessionPromise=void 0}}let A=e=>a[e]??=Object.create(null);function $(e){try{I.onRemoteError?.(e)}catch{}typeof window<"u"&&window.dispatchEvent(new CustomEvent("fulgurjs:error",{detail:e}))}function oe(e="default"){return A(e),a}function se(e,r,t,s,i={}){let n=A(e||"default"),u=Object.hasOwn(n,r)?n[r]:void 0,p=u&&typeof u=="object"?u:void 0;p||(p=Object.create(null),n[r]=p),!(Object.hasOwn(p,t)&&p[t])&&(p[t]={version:t,get:s,from:i.from??"unknown",eager:!!i.eager,loaded:!!i.loaded})}function ie(e){let r=(t,s,i)=>{if(t===void 0)return;if(!(typeof t=="number"&&(i?Number.isInteger(t)&&t>=0&&t<=10:Number.isFinite(t)&&t>0)))throw new Error(`[fulgurjs] \u8FDC\u7A0B\u5E94\u7528 "${e.name}" \u7684 ${s} \u914D\u7F6E\u65E0\u6548\uFF1A\u5F53\u524D\u4E3A ${String(t)}\uFF0C\u5E94\u4E3A${i?" 0 \u5230 10 \u7684\u6574\u6570":"\u5927\u4E8E 0 \u7684\u6709\u9650\u6570\u5B57"}\u3002\u8BF7\u4FEE\u6B63 registerRemote \u914D\u7F6E\u3002`)};r(e.timeout,"timeout"),r(e.retries,"retries",!0),e.breaker&&(r(e.breaker.threshold,"breaker.threshold"),r(e.breaker.resetMs,"breaker.resetMs"))}function H(e){for(let r of e){ie(r);let t=c.get(r.name);c.set(r.name,{timeout:D,retries:z,...t,...r,breakerThreshold:r.breaker?.threshold??t?.breakerThreshold??Me,breakerResetMs:r.breaker?.resetMs??t?.breakerResetMs??ve,state:t?.state??"idle",breakerState:t?.breakerState??{fails:0,openUntil:0},entryInflight:t?.entryInflight??new Map,entryFailCounts:t?.entryFailCounts??new Map,debug:t?.debug??{entry:r.entry,status:"idle",setup:"none"}})}}function ae(e){H([e])}function ce(e){l.push(...e),Z()}async function le(e,r={}){let t=r.shareScope||"default",s=r.shareKey||e,n=A(t)[s]||{},u=Object.keys(n),p=r.requiredVersion,h=u.filter(f=>p===void 0||p===!1||j(f,p)),
|
|
10
|
-
\u539F\u56E0\uFF1A\u5E94\u7528\u8981\u6C42 ${p??"\u4EFB\u610F\u7248\u672C"}\uFF0C\u4F5C\u7528\u57DF\u4E2D\u6709 ${u.join("\u3001")}\uFF1B\u4E3A\u4FDD\u8BC1\u5168\u9875\u53EA\u4F7F\u7528\u4E00\u4E2A\u5B9E\u4F8B\uFF0C\u6700\u7EC8\u590D\u7528 ${m.from} \u63D0\u4F9B\u7684 ${
|
|
9
|
+
\u4FEE\u6CD5\uFF1A\u5BBF\u4E3B\u6BCF\u6B21\u767B\u5F55\u6216\u91CD\u767B\u65F6\u751F\u6210\u65B0\u7684\u975E\u654F\u611F\u767B\u5F55\u4EE3\u6B21 ID\uFF0C\u5E76\u5728\u52A0\u8F7D\u8FDC\u7A0B\u9875\u9762\u524D\u8C03\u7528 provideAppContext({ ..., sessionKey: '\u767B\u5F55\u4EE3\u6B21 ID' })\uFF1B\u4E0D\u8981\u4F7F\u7528 token \u539F\u6587\u3002`,{remote:e.name});if(r.sessionPromise&&r.sessionKey===i)return r.sessionPromise;r.controller?.abort();let n=new AbortController;r.controller=n,r.sessionKey=i;let u=r.sessionPromise?r.sessionPromise.catch(()=>{}):Promise.resolve(),p=(async()=>{await u,!n.signal.aborted&&await K(e.name,t,{appContext:s,sessionKey:i,signal:n.signal},"onSession")})();return r.sessionPromise=p,p.catch(()=>{r.sessionKey===i&&(r.sessionKey=void 0,r.sessionPromise=void 0)}),p}async function te(e,r){let t=r?.[$e];if(typeof t!="string"||t==="")return;let s=Q(e.name);s.setupPromise||(s.setupPromise=ee(e,r,t,s).catch(n=>{throw s.setupPromise=void 0,n})),await s.setupPromise;let i=s.setupExports?.onSession;typeof i=="function"&&await re(e,s,i)}function ne(){for(let e of U.values()){try{e.controller?.abort()}catch{}e.sessionKey=void 0,e.sessionPromise=void 0}}let A=e=>a[e]??=Object.create(null);function $(e){try{I.onRemoteError?.(e)}catch{}typeof window<"u"&&window.dispatchEvent(new CustomEvent("fulgurjs:error",{detail:e}))}function oe(e="default"){return A(e),a}function se(e,r,t,s,i={}){let n=A(e||"default"),u=Object.hasOwn(n,r)?n[r]:void 0,p=u&&typeof u=="object"?u:void 0;p||(p=Object.create(null),n[r]=p),!(Object.hasOwn(p,t)&&p[t])&&(p[t]={version:t,get:s,from:i.from??"unknown",eager:!!i.eager,loaded:!!i.loaded})}function ie(e){let r=(t,s,i)=>{if(t===void 0)return;if(!(typeof t=="number"&&(i?Number.isInteger(t)&&t>=0&&t<=10:Number.isFinite(t)&&t>0)))throw new Error(`[fulgurjs] \u8FDC\u7A0B\u5E94\u7528 "${e.name}" \u7684 ${s} \u914D\u7F6E\u65E0\u6548\uFF1A\u5F53\u524D\u4E3A ${String(t)}\uFF0C\u5E94\u4E3A${i?" 0 \u5230 10 \u7684\u6574\u6570":"\u5927\u4E8E 0 \u7684\u6709\u9650\u6570\u5B57"}\u3002\u8BF7\u4FEE\u6B63 registerRemote \u914D\u7F6E\u3002`)};r(e.timeout,"timeout"),r(e.retries,"retries",!0),e.breaker&&(r(e.breaker.threshold,"breaker.threshold"),r(e.breaker.resetMs,"breaker.resetMs"))}function H(e){for(let r of e){ie(r);let t=c.get(r.name);c.set(r.name,{timeout:D,retries:z,...t,...r,breakerThreshold:r.breaker?.threshold??t?.breakerThreshold??Me,breakerResetMs:r.breaker?.resetMs??t?.breakerResetMs??ve,state:t?.state??"idle",breakerState:t?.breakerState??{fails:0,openUntil:0},entryInflight:t?.entryInflight??new Map,entryFailCounts:t?.entryFailCounts??new Map,debug:t?.debug??{entry:r.entry,status:"idle",setup:"none"}})}}function ae(e){H([e])}function ce(e){l.push(...e),Z()}async function le(e,r={}){let t=r.shareScope||"default",s=r.shareKey||e,n=A(t)[s]||{},u=Object.keys(n),p=r.requiredVersion,h=u.filter(f=>p===void 0||p===!1||j(f,p)),g;if(r.singleton&&u.length>0){let f=u.filter(m=>n[m].loaded);if(g=[...f.length?f:u].sort(O).pop(),!h.includes(g)){let m=n[g],v=`\u73B0\u8C61\uFF1A\u5171\u4EAB\u5355\u4F8B "${s}" \u7684\u5B9E\u9645\u7248\u672C\u4E0D\u6EE1\u8DB3\u5F53\u524D\u5E94\u7528\u8981\u6C42\u3002
|
|
10
|
+
\u539F\u56E0\uFF1A\u5E94\u7528\u8981\u6C42 ${p??"\u4EFB\u610F\u7248\u672C"}\uFF0C\u4F5C\u7528\u57DF\u4E2D\u6709 ${u.join("\u3001")}\uFF1B\u4E3A\u4FDD\u8BC1\u5168\u9875\u53EA\u4F7F\u7528\u4E00\u4E2A\u5B9E\u4F8B\uFF0C\u6700\u7EC8\u590D\u7528 ${m.from} \u63D0\u4F9B\u7684 ${g}\u3002
|
|
11
11
|
\u5F71\u54CD\uFF1A\u53EF\u80FD\u51FA\u73B0\u72B6\u6001\u4E0D\u4E00\u81F4\u6216\u8FD0\u884C\u9519\u8BEF\uFF0C\u5177\u4F53\u53D6\u51B3\u4E8E\u4E24\u7AEF API \u662F\u5426\u517C\u5BB9\u3002
|
|
12
|
-
\u4FEE\u6CD5\uFF1A\u7EDF\u4E00\u5BBF\u4E3B\u4E0E\u8FDC\u7A0B\u7684\u4F9D\u8D56\u7248\u672C\uFF0C\u6216\u6838\u5BF9\u540E\u8C03\u6574 shared.requiredVersion\uFF1B\u82E5\u5FC5\u987B\u62D2\u7EDD\u4E0D\u517C\u5BB9\u7248\u672C\uFF0C\u8BF7\u542F\u7528 strictVersion\u3002`;if(r.strictVersion){let T=new S(E.SHARE_STRICT_VERSION,v,{shareKey:s,requiredVersion:p});throw $({remote:m.from,error:T}),T}let _=`${t}|${s}|${p??"*"}|${
|
|
12
|
+
\u4FEE\u6CD5\uFF1A\u7EDF\u4E00\u5BBF\u4E3B\u4E0E\u8FDC\u7A0B\u7684\u4F9D\u8D56\u7248\u672C\uFF0C\u6216\u6838\u5BF9\u540E\u8C03\u6574 shared.requiredVersion\uFF1B\u82E5\u5FC5\u987B\u62D2\u7EDD\u4E0D\u517C\u5BB9\u7248\u672C\uFF0C\u8BF7\u542F\u7528 strictVersion\u3002`;if(r.strictVersion){let T=new S(E.SHARE_STRICT_VERSION,v,{shareKey:s,requiredVersion:p});throw $({remote:m.from,error:T}),T}let _=`${t}|${s}|${p??"*"}|${g}|${u.join(",")}`;o.has(_)||(o.add(_),console.warn(`[fulgurjs:MFU-010] ${v}`))}}else if(g=[...h].sort(O).pop(),!g){if(r.strictVersion){let m=new S(E.SHARE_STRICT_VERSION,`\u73B0\u8C61\uFF1A\u5171\u4EAB\u4F5C\u7528\u57DF "${t}" \u4E2D\u627E\u4E0D\u5230\u7B26\u5408\u8981\u6C42\u7684 "${s}"\u3002
|
|
13
13
|
\u539F\u56E0\uFF1A\u8981\u6C42\u7248\u672C ${p}\uFF0C\u5F53\u524D\u53EF\u7528\u7248\u672C\u4E3A ${u.join("\u3001")||"\u65E0"}\u3002
|
|
14
14
|
\u4FEE\u6CD5\uFF1A\u7EDF\u4E00\u5BBF\u4E3B\u4E0E\u8FDC\u7A0B\u7684\u4F9D\u8D56\u7248\u672C\uFF0C\u6216\u4FEE\u6B63 shared.requiredVersion\u3002`);throw $({remote:s,error:m}),m}if(r.fallback)return r.fallback();let f=new S(E.SHARE_NOT_AVAILABLE,`\u73B0\u8C61\uFF1A\u65E0\u6CD5\u52A0\u8F7D\u5171\u4EAB\u4F9D\u8D56 "${s}"\u3002
|
|
15
15
|
\u539F\u56E0\uFF1A\u4F5C\u7528\u57DF "${t}" \u4E2D\u6CA1\u6709\u7B26\u5408 ${p??"\u4EFB\u610F\u7248\u672C"} \u8981\u6C42\u7684\u7248\u672C\uFF0C\u4E14\u672A\u914D\u7F6E\u672C\u5730\u526F\u672C\u3002
|
|
16
|
-
\u4FEE\u6CD5\uFF1A\u5728\u5BBF\u4E3B\u6216\u8FDC\u7A0B\u6CE8\u518C\u8BE5\u4F9D\u8D56\uFF0C\u6216\u4E3A shared \u914D\u7F6E\u53EF\u7528\u7684\u672C\u5730\u526F\u672C\u3002`,{shareKey:s,requiredVersion:p});throw $({remote:s,error:f}),f}let R=n[
|
|
16
|
+
\u4FEE\u6CD5\uFF1A\u5728\u5BBF\u4E3B\u6216\u8FDC\u7A0B\u6CE8\u518C\u8BE5\u4F9D\u8D56\uFF0C\u6216\u4E3A shared \u914D\u7F6E\u53EF\u7528\u7684\u672C\u5730\u526F\u672C\u3002`,{shareKey:s,requiredVersion:p});throw $({remote:s,error:f}),f}let R=n[g];if(I.resolveShare){let f=await I.resolveShare({shareKey:s,shareScope:t,requiredVersion:p,picked:R,available:Object.values(n)});f&&(R=f)}return R.loaded=!0,R.get()}function q(e){try{let r=new URL(e,typeof location<"u"?location.href:"http://f.invalid");return r.protocol+"//"+r.host+r.pathname}catch{return String(e).replace(/[?#].*$/,"")}}function G(e,r,t){return new Promise((s,i)=>{let n=setTimeout(()=>i(new Error(`\u7B49\u5F85\u8D85\u8FC7 ${r} \u6BEB\u79D2\uFF1A${t}`)),r);e.then(u=>{clearTimeout(n),s(u)},u=>{clearTimeout(n),i(u)})})}let ue=e=>new Promise(r=>setTimeout(r,e));function N(e,r){if(!e||typeof e.get!="function")throw new Error(`\u8FDC\u7A0B\u5E94\u7528 "${r.name}" \u7684 remoteEntry \u672A\u5BFC\u51FA\u5BB9\u5668\u63A5\u53E3\u3002\u8BF7\u786E\u8BA4\u5165\u53E3\u5BFC\u51FA\u4E86 get()\uFF0C\u5E76\u68C0\u67E5\u8BE5\u5730\u5740\u662F\u5426\u8FD4\u56DE\u6B63\u786E\u7684\u8054\u90A6\u5165\u53E3 JS\u3002`);if(e.name&&r.name&&e.name!==r.name){let t=`\u8FDC\u7A0B\u5165\u53E3\u81EA\u62A5\u540D\u79F0 "${e.name}" \u4E0E\u5BBF\u4E3B\u914D\u7F6E\u540D\u79F0 "${r.name}" \u4E0D\u4E00\u81F4\u3002\u8BF7\u7EDF\u4E00\u4E24\u4FA7 federation({ name }) \u4E0E remotes \u7684\u540D\u79F0\u3002`;if(r.promise)console.warn(`[fulgurjs] ${t} \u5F53\u524D\u662F\u52A8\u6001 Promise \u8FDC\u7A0B\uFF0C\u7EE7\u7EED\u52A0\u8F7D\u3002`);else throw Object.assign(new Error(t),{code:E.REMOTE_NAME_MISMATCH})}}async function J(e,r){let t=r.entryFailCounts.get(e)??0,s=t>0?`${e}${e.includes("?")?"&":"?"}fulgurjs_retry=${t}`:e,i=r.entryInflight.get(e),n=i??import(s);return i||(r.entryInflight.set(e,n),n.catch(()=>{r.entryInflight.delete(e),r.entryFailCounts.set(e,(r.entryFailCounts.get(e)??0)+1)})),G(n,r.timeout??D,`\u52A0\u8F7D\u8FDC\u7A0B\u5165\u53E3 ${q(e)}`)}async function X(e,r){let t=e.shareScope||"default";if(e.container){let n=b.get(e.container);if(n&&n!==t)throw new S(E.CONTAINER_REINIT_CONFLICT,`\u8FDC\u7A0B\u5BB9\u5668 "${e.name}" \u5DF2\u4F7F\u7528\u5171\u4EAB\u4F5C\u7528\u57DF "${n}" \u521D\u59CB\u5316\uFF0C\u4E0D\u80FD\u518D\u4EE5 "${t}" \u521D\u59CB\u5316\u3002\u8BF7\u7EDF\u4E00 shareScope \u914D\u7F6E\u3002`);return e.container}if(e.containerPromise)return e.containerPromise;let s=e.breakerState;if(s.openUntil>Date.now()){let n=new S(E.REMOTE_LOAD_FAILED,`\u8FDC\u7A0B\u5E94\u7528 "${e.name}" \u8FDE\u7EED\u52A0\u8F7D\u5931\u8D25\uFF0C\u7194\u65AD\u5668\u5DF2\u5F00\u542F\uFF1B\u5C06\u5728 ${new Date(s.openUntil).toISOString()} \u540E\u5141\u8BB8\u91CD\u8BD5\u3002\u8BF7\u5148\u68C0\u67E5\u8FDC\u7A0B\u5165\u53E3\u670D\u52A1\u548C\u7F51\u7EDC\u3002`,{remote:e.name});throw $({remote:e.name,error:n}),n}e.state="loading",e.debug.status="loading";let i=(async()=>{let n=[];if(e.promise)n.push(async()=>{let f=await G(e.promise(),e.timeout??D,`\u89E3\u6790\u52A8\u6001\u8FDC\u7A0B\u5E94\u7528 "${e.name}"`),m=typeof f=="string"?await J(f,e):f;return N(m,e),m});else for(let f of[e.entry,...e.fallback??[]])n.push(async()=>{let m=await J(f,e);return N(m,e),m});let u,p,h=!1,g=r?.retries??e.retries??z;for(let f of n){for(let m=0;m<=g;m++){let v=performance.now();try{u=await f(),e.lastLoadMs=Math.round(performance.now()-v),e.debug.lastLoadMs=e.lastLoadMs,h=!0;break}catch(_){if(p=_,_?.code)throw _;m<g&&await ue(Math.min(Ie,200*2**m)*(1-Te*(1-2*Math.random())))}}if(h)break}if(!h||!u){let f=q(e.entry),m=[];throw/^https?:\/\//.test(e.entry)&&typeof location<"u"?(m.push(`1. \u5728\u6D4F\u89C8\u5668\u6253\u5F00 ${f}\uFF0C\u786E\u8BA4\u8FDC\u7A0B\u5F00\u53D1\u670D\u52A1\u5DF2\u542F\u52A8\uFF0C\u5E76\u8FD4\u56DE JS \u800C\u975E HTML\u3002`),m.push("2. \u6838\u5BF9 federation({ remotes }) \u4E2D\u7684\u5730\u5740\uFF1B\u5F00\u53D1\u548C\u751F\u4EA7\u5730\u5740\u53EF\u4EE5\u4E0D\u540C\u3002"),m.push("3. \u82E5\u8DE8\u57DF\uFF0C\u68C0\u67E5\u8FDC\u7A0B\u5F00\u53D1\u670D\u52A1\u7684 server.cors \u914D\u7F6E\u3002")):(m.push(`1. \u5728\u6D4F\u89C8\u5668\u6253\u5F00 ${f}\uFF0C\u786E\u8BA4\u8FDC\u7A0B\u5E94\u7528\u5DF2\u90E8\u7F72\uFF0C\u4E14\u5165\u53E3\u8FD4\u56DE JS\u3002`),m.push("2. \u68C0\u67E5 Nginx/CDN \u7684\u5165\u53E3\u8DEF\u5F84\u6620\u5C04\uFF1B\u8BE5\u5730\u5740\u4E0D\u80FD\u56DE\u9000\u5230 index.html\u3002")),new S(E.REMOTE_LOAD_FAILED,`\u73B0\u8C61\uFF1A\u65E0\u6CD5\u4ECE ${f} \u52A0\u8F7D\u8FDC\u7A0B\u5E94\u7528 "${e.name}"\u3002
|
|
17
17
|
\u539F\u56E0\uFF1A${String(p?.message??p)}
|
|
18
18
|
\u4FEE\u6CD5\uFF1A
|
|
19
19
|
${m.join(`
|
|
20
20
|
`)}`,{remote:e.name})}N(u,e);let R=b.get(u);if(R&&R!==t)throw new S(E.CONTAINER_REINIT_CONFLICT,`\u8FDC\u7A0B\u5BB9\u5668 "${e.name}" \u5DF2\u4F7F\u7528\u5171\u4EAB\u4F5C\u7528\u57DF "${R}" \u521D\u59CB\u5316\uFF0C\u4E0D\u80FD\u518D\u4EE5 "${t}" \u521D\u59CB\u5316\u3002\u8BF7\u7EDF\u4E00 shareScope \u914D\u7F6E\u3002`);return typeof u.init=="function"&&await u.init(a),b.set(u,t),e.container=u,e.state="loaded",e.debug.status="loaded",s.fails=0,u})();e.containerPromise=i;try{return await i}catch(n){if(e.containerPromise=void 0,e.state="failed",e.debug.status="failed",e.debug.error=String(n?.message??n),s.fails+=1,s.fails>=e.breakerThreshold&&(s.openUntil=Date.now()+e.breakerResetMs,s.fails=0),n instanceof S)throw $({remote:e.name,error:n}),n;if(n?.code)throw $({remote:e.name,error:n}),n;let u=new S(E.REMOTE_LOAD_FAILED,`\u8FDC\u7A0B\u5E94\u7528 "${e.name}" \u52A0\u8F7D\u5931\u8D25\u3002\u5E95\u5C42\u539F\u56E0\uFF1A${String(n?.message??n)}\u3002\u8BF7\u68C0\u67E5\u8FDC\u7A0B\u5165\u53E3\u3001\u7F51\u7EDC\u53CA\u5171\u4EAB\u4F9D\u8D56\u3002`,{remote:e.name});throw $({remote:e.name,error:u}),u}}function C(e){let r=e.indexOf("/");return r===-1?{remote:e,module:""}:{remote:e.slice(0,r),module:B(e.slice(r+1))}}function B(e){return e?e.startsWith(".")?e:`./${e}`:""}async function fe(e,r){let{remote:t,module:s}=C(e);if(s&&k===t)throw new S(E.SETUP_RECURSION,`\u73B0\u8C61\uFF1A\u52A0\u8F7D "${e}" \u65F6\uFF0C\u8FDC\u7A0B\u5E94\u7528 "${t}" \u7684 setup/onSession \u53C8\u540C\u6B65\u52A0\u8F7D\u4E86\u81EA\u8EAB\u6A21\u5757\uFF0C\u5F62\u6210\u5FAA\u73AF\u7B49\u5F85\u3002
|
|
21
21
|
\u539F\u56E0\uFF1A\u521D\u59CB\u5316\u5C1A\u672A\u5B8C\u6210\uFF0C\u4E0D\u80FD\u7B49\u5F85\u81EA\u8EAB\u7684\u521D\u59CB\u5316\u7ED3\u679C\u3002
|
|
22
|
-
\u4FEE\u6CD5\uFF1A\u4E0D\u8981\u5728 setup/onSession \u4E2D\u52A0\u8F7D\u540C\u4E00\u8FDC\u7A0B\u7684\u6A21\u5757\uFF1B\u8BF7\u5728\u9875\u9762\u7EC4\u4EF6\u4E2D\u52A0\u8F7D\uFF0C\u6216\u901A\u8FC7 context \u89E3\u8026\u3002`,{remote:t});try{I.beforeLoadRemote?.({remote:t,module:s})}catch(h){console.warn("[fulgurjs] beforeLoadRemote \u89C2\u6D4B\u94A9\u5B50\u6267\u884C\u5931\u8D25\uFF1B\u6A21\u5757\u52A0\u8F7D\u5C06\u7EE7\u7EED\u3002\u8BF7\u68C0\u67E5\u8BE5\u94A9\u5B50\uFF1A",h)}let i=c.get(t);if(!i)throw new S(E.REMOTE_UNKNOWN,`\u672A\u77E5\u8FDC\u7A0B\u5E94\u7528 "${t}"\u3002\u8BF7\u5728 federation({ remotes }) \u4E2D\u914D\u7F6E\uFF0C\u6216\u5728\u52A0\u8F7D\u524D\u8C03\u7528 registerRemote()\u3002`,{remote:t});let n;try{let h=s&&i.manifestUrl?F(e):Promise.resolve();[n]=await Promise.all([X(i,{retries:r?.retries}),h])}catch(h){if(r?.fallbackModule)return console.error(`[fulgurjs] \u8FDC\u7A0B\u6A21\u5757 "${e}" \u52A0\u8F7D\u5931\u8D25\uFF0C\u6B63\u5728\u4F7F\u7528\u663E\u5F0F\u914D\u7F6E\u7684 fallbackModule\uFF1B\u539F\u59CB\u9519\u8BEF\uFF1A`,h),$({remote:t,error:h}),await r.fallbackModule();throw h}if(!s)return n;await te(i,n);let u=`${t}@${i.shareScope||"default"}#${s}`;
|
|
22
|
+
\u4FEE\u6CD5\uFF1A\u4E0D\u8981\u5728 setup/onSession \u4E2D\u52A0\u8F7D\u540C\u4E00\u8FDC\u7A0B\u7684\u6A21\u5757\uFF1B\u8BF7\u5728\u9875\u9762\u7EC4\u4EF6\u4E2D\u52A0\u8F7D\uFF0C\u6216\u901A\u8FC7 context \u89E3\u8026\u3002`,{remote:t});try{I.beforeLoadRemote?.({remote:t,module:s})}catch(h){console.warn("[fulgurjs] beforeLoadRemote \u89C2\u6D4B\u94A9\u5B50\u6267\u884C\u5931\u8D25\uFF1B\u6A21\u5757\u52A0\u8F7D\u5C06\u7EE7\u7EED\u3002\u8BF7\u68C0\u67E5\u8BE5\u94A9\u5B50\uFF1A",h)}let i=c.get(t);if(!i)throw new S(E.REMOTE_UNKNOWN,`\u672A\u77E5\u8FDC\u7A0B\u5E94\u7528 "${t}"\u3002\u8BF7\u5728 federation({ remotes }) \u4E2D\u914D\u7F6E\uFF0C\u6216\u5728\u52A0\u8F7D\u524D\u8C03\u7528 registerRemote()\u3002`,{remote:t});let n;try{let h=s&&i.manifestUrl?F(e):Promise.resolve();[n]=await Promise.all([X(i,{retries:r?.retries}),h])}catch(h){if(r?.fallbackModule)return console.error(`[fulgurjs] \u8FDC\u7A0B\u6A21\u5757 "${e}" \u52A0\u8F7D\u5931\u8D25\uFF0C\u6B63\u5728\u4F7F\u7528\u663E\u5F0F\u914D\u7F6E\u7684 fallbackModule\uFF1B\u539F\u59CB\u9519\u8BEF\uFF1A`,h),$({remote:t,error:h}),await r.fallbackModule();throw h}if(!s)return n;await te(i,n);let u=`${t}@${i.shareScope||"default"}#${s}`;d.has(u)||d.set(u,n.get(s).catch(h=>{throw d.delete(u),h instanceof S||h?.code?h:new S(E.REMOTE_LOAD_FAILED,`\u65E0\u6CD5\u4ECE\u8FDC\u7A0B\u5E94\u7528 "${t}" \u52A0\u8F7D\u6A21\u5757 "${s}"\u3002\u5E95\u5C42\u539F\u56E0\uFF1A${String(h?.message??h)}\u3002\u8BF7\u6838\u5BF9 exposes \u952E\u548C\u8FDC\u7A0B\u6784\u5EFA\u4EA7\u7269\u3002`,{remote:t,module:s})}));let p;try{p=await d.get(u)}catch(h){if(r?.fallbackModule)return console.error(`[fulgurjs] \u8FDC\u7A0B\u6A21\u5757 "${e}" \u52A0\u8F7D\u5931\u8D25\uFF0C\u6B63\u5728\u4F7F\u7528\u663E\u5F0F\u914D\u7F6E\u7684 fallbackModule\uFF1B\u539F\u59CB\u9519\u8BEF\uFF1A`,h),$({remote:t,error:h}),await r.fallbackModule();throw h}try{I.afterLoadRemote?.({remote:t,module:s,module_ns:p})}catch(h){console.warn("[fulgurjs] afterLoadRemote \u89C2\u6D4B\u94A9\u5B50\u6267\u884C\u5931\u8D25\uFF1B\u5DF2\u52A0\u8F7D\u6A21\u5757\u4ECD\u53EF\u4F7F\u7528\u3002\u8BF7\u68C0\u67E5\u8BE5\u94A9\u5B50\uFF1A",h)}if(p&&typeof p=="object"&&Object.keys(p).length===0){let h=new S(E.EMPTY_EXPORTS,`\u8FDC\u7A0B\u5E94\u7528 "${t}" \u7684\u6A21\u5757 "${s}" \u6CA1\u6709\u4EFB\u4F55\u5BFC\u51FA\u3002\u8BF7\u68C0\u67E5 exposes \u6307\u5411\u7684\u6587\u4EF6\u53CA\u5176 export \u58F0\u660E\u3002`,{remote:t,module:s});$({remote:t,error:h}),console.error(h.message)}return p}function me(e){let r=c.get(e);if(!r)throw new S(E.REMOTE_UNKNOWN,`\u672A\u77E5\u8FDC\u7A0B\u5E94\u7528 "${e}"\u3002\u8BF7\u5148\u6CE8\u518C\u8BE5\u8FDC\u7A0B\u5E94\u7528\u3002`,{remote:e});return X(r)}async function F(e,r={}){let{remote:t,module:s}=C(e),i=c.get(t);if(!i)throw new S(E.REMOTE_UNKNOWN,`\u672A\u77E5\u8FDC\u7A0B\u5E94\u7528 "${t}"\u3002\u8BF7\u5148\u6CE8\u518C\u8BE5\u8FDC\u7A0B\u5E94\u7528\u3002`,{remote:t});let n=r.mode??"preload",u=(g,R)=>{if(g.sheet)return Promise.resolve();let f=w.get(g);if(f)return f;let m=new Promise(v=>{let _=()=>{g.removeEventListener("load",_),g.removeEventListener("error",T),v()},T=()=>{$({remote:t,error:new S(E.PRELOAD_FAILED,`\u8FDC\u7A0B\u5E94\u7528 "${t}" \u7684\u6837\u5F0F\u8D44\u6E90\u52A0\u8F7D\u5931\u8D25\uFF1A${R}\u3002\u8BF7\u68C0\u67E5\u6587\u4EF6\u662F\u5426\u5B58\u5728\u4EE5\u53CA\u8DE8\u57DF\u548C\u7F13\u5B58\u914D\u7F6E\u3002`,{remote:t})}),_()};g.addEventListener("load",_,{once:!0}),g.addEventListener("error",T,{once:!0}),g.sheet&&_()});return w.set(g,m),m},p=(g,R)=>{if(typeof document>"u")return Promise.resolve();let f=document.querySelector(`link[href="${g}"]`);if(f)return R==="style"&&n==="preload"?w.get(f)??Promise.resolve():Promise.resolve();let m=document.createElement("link");m.rel=R==="style"?"stylesheet":"modulepreload",m.href=g,n==="prefetch"&&(m.fetchPriority="low");let v=R==="style"?u(m,g):Promise.resolve();return document.head.appendChild(m),R==="style"&&n==="preload"?v:Promise.resolve()},h=g=>{let R=typeof document<"u"?document.baseURI:void 0,f=new URL(i.entry,R||"http://fulgurjs.invalid/");return!f.pathname.endsWith("/")&&!f.pathname.split("/").pop().includes(".")&&(f.pathname+="/"),new URL(g,f).href};try{if(i.manifestUrl){let g=y.get(i.manifestUrl);g||(g=fetch(i.manifestUrl,{cache:"no-cache",signal:AbortSignal.timeout(8e3)}).then(f=>f.ok?f.json():void 0),y.set(i.manifestUrl,g),g.then(f=>{f||y.delete(i.manifestUrl)},()=>y.delete(i.manifestUrl)));let R=await g;if(R){let f=R.schemaVersion;if(typeof f=="number"&&(!Number.isInteger(f)||f>1)){$({remote:t,error:new S(E.PRELOAD_FAILED,`\u8FDC\u7A0B\u5E94\u7528 "${t}" \u7684 manifest \u534F\u8BAE\u7248\u672C\u4E3A ${String(f)}\uFF0C\u5F53\u524D\u4EC5\u652F\u6301\u7248\u672C 1\u3002\u8BF7\u7EDF\u4E00\u5BBF\u4E3B\u548C\u8FDC\u7A0B\u7684\u63D2\u4EF6\u7248\u672C\u3002`,{remote:t})}),await p(i.entry,"modulepreload");return}await p(i.entry,"modulepreload");let m=R.exposes,v=Array.isArray(m)?m.filter(M=>M&&typeof M=="object").map(M=>[String(M.name??""),M]):m&&typeof m=="object"?Object.entries(m):[],_=s?v.filter(([M,x])=>B(String(x?.name??M))===s):v,T=[];for(let[,M]of _)if(typeof M?.file=="string"&&await p(h(M.file),"modulepreload"),Array.isArray(M?.css))for(let x of M.css){if(typeof x!="string")continue;let pe=p(h(x),"style");n==="preload"&&T.push(pe)}await Promise.all(T);return}}await p(i.entry,"modulepreload")}catch(g){$({remote:t,error:new S(E.PRELOAD_FAILED,`\u8FDC\u7A0B\u5E94\u7528 "${t}" \u9884\u52A0\u8F7D\u5931\u8D25\u3002\u5E95\u5C42\u539F\u56E0\uFF1A${String(g?.message??g)}\u3002\u8BF7\u68C0\u67E5 manifest \u548C\u8D44\u6E90\u5730\u5740\u3002`,{remote:t})})}}return typeof window>"u"||(window.__FULGURJS_SCOPE__=a,window.__FULGURJS_INFO__={get remotes(){let e={};for(let[r,t]of c)e[r]={...t.debug,entry:t.entry};return e},errors:[]}),{shareScopeMap:a,initSharing:oe,registerShare:se,registerRemotes:H,registerRemote:ae,registerPlugins:ce,loadShare:le,loadRemote:fe,getContainer:me,preloadRemote:F,parseSpec:C,clearSessionState:ne}}var Y=globalThis,P=Y.__FULGURJS_RUNTIME__??Oe();Y.__FULGURJS_RUNTIME__=P;try{Object.freeze(P)}catch{}var Ce=W;function Fe(){return P}var De=P.initSharing,Ve=P.registerShare,Ke=P.registerRemotes,He=P.registerRemote,qe=P.registerPlugins,Ge=P.loadShare,Je=P.loadRemote,Xe=P.getContainer,Be=P.preloadRemote,We=P.parseSpec,ze=P.clearSessionState,Ye=P.shareScopeMap;function Ze(a){if(a&&typeof a=="object"&&"default"in a){let c=a.default;return c!==void 0?c:a}return a}var Qe=P;export{ze as clearSessionState,Qe as default,Xe as getContainer,Fe as getRuntime,De as initSharing,Je as loadRemote,Ge as loadShare,We as parseSpec,Be as preloadRemote,qe as registerPlugins,He as registerRemote,Ke as registerRemotes,Ve as registerShare,P as runtime,Ye as shareScopeMap,Ze as unwrapDefault,Ce as version};
|
package/dist/vue-adapter.cjs
CHANGED
|
@@ -249,28 +249,111 @@ var ERROR_STYLE = {
|
|
|
249
249
|
fontSize: "13px",
|
|
250
250
|
lineHeight: "1.6"
|
|
251
251
|
};
|
|
252
|
+
var BUTTON_STYLE = {
|
|
253
|
+
padding: "4px 14px",
|
|
254
|
+
marginRight: "8px",
|
|
255
|
+
border: "1px solid #c45656",
|
|
256
|
+
borderRadius: "4px",
|
|
257
|
+
background: "#c45656",
|
|
258
|
+
color: "#fff",
|
|
259
|
+
fontSize: "13px",
|
|
260
|
+
cursor: "pointer"
|
|
261
|
+
};
|
|
262
|
+
var SECONDARY_BUTTON_STYLE = {
|
|
263
|
+
padding: "4px 14px",
|
|
264
|
+
border: "1px solid #c45656",
|
|
265
|
+
borderRadius: "4px",
|
|
266
|
+
background: "#fff",
|
|
267
|
+
color: "#c45656",
|
|
268
|
+
fontSize: "13px",
|
|
269
|
+
cursor: "pointer"
|
|
270
|
+
};
|
|
252
271
|
var RemoteErrorPlaceholder = (0, import_vue.defineComponent)({
|
|
253
272
|
name: "FulgurjsRemoteError",
|
|
254
|
-
props: {
|
|
273
|
+
props: {
|
|
274
|
+
error: { type: Object, default: void 0 },
|
|
275
|
+
retry: { type: Function, required: false, default: void 0 },
|
|
276
|
+
retrying: { type: Boolean, default: false }
|
|
277
|
+
},
|
|
255
278
|
setup(props) {
|
|
279
|
+
const reloadPage = () => {
|
|
280
|
+
window.location.reload();
|
|
281
|
+
};
|
|
256
282
|
return () => {
|
|
257
283
|
const err = props.error;
|
|
258
284
|
const code = err?.code ?? "UNKNOWN";
|
|
259
285
|
const message = err?.message ?? String(props.error ?? "unknown error");
|
|
260
|
-
|
|
286
|
+
const buttons = [
|
|
287
|
+
props.retry ? (0, import_vue.h)("button", {
|
|
288
|
+
key: "retry",
|
|
289
|
+
style: BUTTON_STYLE,
|
|
290
|
+
type: "button",
|
|
291
|
+
"data-fulgurjs-retry": "",
|
|
292
|
+
disabled: props.retrying,
|
|
293
|
+
onClick: () => props.retry?.()
|
|
294
|
+
}, props.retrying ? "\u52A0\u8F7D\u4E2D\u2026" : "\u91CD\u8BD5\u52A0\u8F7D") : null,
|
|
295
|
+
(0, import_vue.h)("button", {
|
|
296
|
+
key: "reload",
|
|
297
|
+
style: SECONDARY_BUTTON_STYLE,
|
|
298
|
+
type: "button",
|
|
299
|
+
"data-fulgurjs-reload": "",
|
|
300
|
+
disabled: props.retrying,
|
|
301
|
+
onClick: reloadPage
|
|
302
|
+
}, "\u5237\u65B0\u9875\u9762\u91CD\u8BD5")
|
|
303
|
+
].filter(Boolean);
|
|
304
|
+
return (0, import_vue.h)("div", { style: ERROR_STYLE, "data-fulgurjs-error": code }, [
|
|
261
305
|
(0, import_vue.h)("p", { style: "margin:0 0 4px;font-weight:600" }, `\u8FDC\u7A0B\u7EC4\u4EF6\u52A0\u8F7D\u5931\u8D25\uFF08\u9519\u8BEF\u7801 ${code}\uFF09`),
|
|
262
306
|
(0, import_vue.h)("p", { style: "margin:0 0 8px;word-break:break-all" }, message),
|
|
263
|
-
(0, import_vue.h)("p", { style: "margin:0" }, "\u4FEE\u6CD5\uFF1A\u2460 \u6838\u5BF9 spec \u7684\u300C\u8FDC\u7A0B\u540D/expose \u540D\u300D\u4E0E\u8FDC\u7A0B\u5E94\u7528 exposes \u662F\u5426\u4E00\u81F4\uFF08MFU-006/008\uFF09\uFF1B\u2461 \u6838\u5BF9 remotes \u5730\u5740\u7AEF\u53E3\u4E0E\u8FDC\u7A0B\u670D\u52A1\u53EF\u8FBE\u6027\u3001remoteEntry \u662F\u5426\u53EF\u8BBF\u95EE\uFF08MFU-001\uFF09\uFF1B\u2462 \u67E5\u770B window \u7684 fulgurjs:error \u4E8B\u4EF6\u4E0E console \u540C\u6E90\u9519\u8BEF\u5B9A\u4F4D\u6839\u56E0\u3002")
|
|
307
|
+
(0, import_vue.h)("p", { style: "margin:0 0 8px" }, "\u4FEE\u6CD5\uFF1A\u2460 \u6838\u5BF9 spec \u7684\u300C\u8FDC\u7A0B\u540D/expose \u540D\u300D\u4E0E\u8FDC\u7A0B\u5E94\u7528 exposes \u662F\u5426\u4E00\u81F4\uFF08MFU-006/008\uFF09\uFF1B\u2461 \u6838\u5BF9 remotes \u5730\u5740\u7AEF\u53E3\u4E0E\u8FDC\u7A0B\u670D\u52A1\u53EF\u8FBE\u6027\u3001remoteEntry \u662F\u5426\u53EF\u8BBF\u95EE\uFF08MFU-001\uFF09\uFF1B\u2462 \u67E5\u770B window \u7684 fulgurjs:error \u4E8B\u4EF6\u4E0E console \u540C\u6E90\u9519\u8BEF\u5B9A\u4F4D\u6839\u56E0\u3002"),
|
|
308
|
+
(0, import_vue.h)("p", { style: "margin:0 0 10px" }, "\u300C\u91CD\u8BD5\u52A0\u8F7D\u300D\u5728\u5F53\u524D\u9875\u9762\u91CD\u5EFA\u52A0\u8F7D\uFF1B\u82E5\u6D4F\u89C8\u5668\u5DF2\u7F13\u5B58\u5931\u8D25\u7684\u6A21\u5757\uFF08\u5982\u8FDC\u7A0B\u9759\u6001\u5B50\u4F9D\u8D56\u66FE\u52A0\u8F7D\u5931\u8D25\uFF09\uFF0C\u8BF7\u7528\u300C\u5237\u65B0\u9875\u9762\u91CD\u8BD5\u300D\u2014\u2014\u5B83\u4F1A\u6574\u9875\u5237\u65B0\uFF08\u4FDD\u7559\u5F53\u524D\u5730\u5740\uFF09\uFF0C\u672A\u4FDD\u5B58\u7684\u9875\u9762\u72B6\u6001\u4F1A\u4E22\u5931\u3002"),
|
|
309
|
+
(0, import_vue.h)("div", { style: "margin:0" }, buttons)
|
|
264
310
|
]);
|
|
265
311
|
};
|
|
266
312
|
}
|
|
267
313
|
});
|
|
314
|
+
function createRecoverableErrorPlaceholder(loader, spec, userErrorComponent) {
|
|
315
|
+
if (userErrorComponent) return userErrorComponent;
|
|
316
|
+
return (0, import_vue.defineComponent)({
|
|
317
|
+
name: "FulgurjsRemoteErrorWithRetry",
|
|
318
|
+
props: { error: { type: Object, default: void 0 } },
|
|
319
|
+
setup(props, { attrs }) {
|
|
320
|
+
const recovered = (0, import_vue.ref)(null);
|
|
321
|
+
const retrying = (0, import_vue.ref)(false);
|
|
322
|
+
const retryError = (0, import_vue.ref)(void 0);
|
|
323
|
+
const retry = async () => {
|
|
324
|
+
if (retrying.value) return;
|
|
325
|
+
retrying.value = true;
|
|
326
|
+
retryError.value = void 0;
|
|
327
|
+
try {
|
|
328
|
+
const mod = await loader();
|
|
329
|
+
const inner = mod?.default ?? mod;
|
|
330
|
+
if (!inner) throw noRenderableExportError(spec, inner);
|
|
331
|
+
recovered.value = inner;
|
|
332
|
+
} catch (e) {
|
|
333
|
+
retryError.value = e;
|
|
334
|
+
} finally {
|
|
335
|
+
retrying.value = false;
|
|
336
|
+
}
|
|
337
|
+
};
|
|
338
|
+
return () => {
|
|
339
|
+
const inner = recovered.value;
|
|
340
|
+
if (inner) return (0, import_vue.h)(inner, attrs);
|
|
341
|
+
return (0, import_vue.h)(RemoteErrorPlaceholder, {
|
|
342
|
+
error: retryError.value ?? props.error,
|
|
343
|
+
retry,
|
|
344
|
+
retrying: retrying.value
|
|
345
|
+
});
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
});
|
|
349
|
+
}
|
|
268
350
|
function createRemoteComponent(loadRemote) {
|
|
269
351
|
return function remoteComponent(spec, opts = {}) {
|
|
352
|
+
const loader = () => loadRemote(spec, { retries: opts.retries }).then((m) => m.default ?? m);
|
|
270
353
|
return (0, import_vue.defineAsyncComponent)({
|
|
271
|
-
loader
|
|
354
|
+
loader,
|
|
272
355
|
loadingComponent: opts.loadingComponent,
|
|
273
|
-
errorComponent: opts.errorComponent
|
|
356
|
+
errorComponent: createRecoverableErrorPlaceholder(loader, spec, opts.errorComponent),
|
|
274
357
|
delay: opts.delay,
|
|
275
358
|
timeout: opts.timeout
|
|
276
359
|
});
|
|
@@ -290,18 +373,19 @@ function createHostPages(options, load) {
|
|
|
290
373
|
let comp = compCache.get(spec);
|
|
291
374
|
if (!comp) {
|
|
292
375
|
const name = cleanCompName(spec);
|
|
376
|
+
const pageLoader = async () => {
|
|
377
|
+
await beforeLoad?.();
|
|
378
|
+
const mod = await load(spec);
|
|
379
|
+
const inner = mod?.default ?? mod;
|
|
380
|
+
if (!inner) {
|
|
381
|
+
throw noRenderableExportError(spec, inner);
|
|
382
|
+
}
|
|
383
|
+
return inner;
|
|
384
|
+
};
|
|
293
385
|
const asyncComp = (0, import_vue.defineAsyncComponent)({
|
|
294
|
-
loader:
|
|
295
|
-
await beforeLoad?.();
|
|
296
|
-
const mod = await load(spec);
|
|
297
|
-
const inner = mod?.default ?? mod;
|
|
298
|
-
if (!inner) {
|
|
299
|
-
throw noRenderableExportError(spec, inner);
|
|
300
|
-
}
|
|
301
|
-
return inner;
|
|
302
|
-
},
|
|
386
|
+
loader: pageLoader,
|
|
303
387
|
loadingComponent,
|
|
304
|
-
errorComponent:
|
|
388
|
+
errorComponent: createRecoverableErrorPlaceholder(pageLoader, spec, errorComponent),
|
|
305
389
|
delay
|
|
306
390
|
});
|
|
307
391
|
asyncComp.name = name;
|
package/dist/vue-adapter.d.cts
CHANGED
|
@@ -19,7 +19,7 @@ interface HostPagesOptions extends HostPagesCoreOptions {
|
|
|
19
19
|
beforeLoad?: () => void | Promise<void>;
|
|
20
20
|
/** 加载期占位组件(骨架屏) */
|
|
21
21
|
loadingComponent?: Component;
|
|
22
|
-
/** 错误占位组件(缺省 =
|
|
22
|
+
/** 错误占位组件(缺省 = 内置错误占位:错误码+根因+修法+重试加载/刷新页面重试;自定义时完全接管) */
|
|
23
23
|
errorComponent?: Component;
|
|
24
24
|
/** 骨架屏延迟 ms(默认 200,防闪) */
|
|
25
25
|
delay?: number;
|
package/dist/vue-adapter.d.ts
CHANGED
|
@@ -19,7 +19,7 @@ interface HostPagesOptions extends HostPagesCoreOptions {
|
|
|
19
19
|
beforeLoad?: () => void | Promise<void>;
|
|
20
20
|
/** 加载期占位组件(骨架屏) */
|
|
21
21
|
loadingComponent?: Component;
|
|
22
|
-
/** 错误占位组件(缺省 =
|
|
22
|
+
/** 错误占位组件(缺省 = 内置错误占位:错误码+根因+修法+重试加载/刷新页面重试;自定义时完全接管) */
|
|
23
23
|
errorComponent?: Component;
|
|
24
24
|
/** 骨架屏延迟 ms(默认 200,防闪) */
|
|
25
25
|
delay?: number;
|
package/dist/vue-adapter.js
CHANGED
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
import "./chunk-TSXZ7TWA.js";
|
|
9
9
|
|
|
10
10
|
// src/vue-adapter.ts
|
|
11
|
-
import { defineAsyncComponent, defineComponent, h } from "vue";
|
|
11
|
+
import { defineAsyncComponent, defineComponent, h, ref } from "vue";
|
|
12
12
|
var ERROR_STYLE = {
|
|
13
13
|
padding: "16px",
|
|
14
14
|
border: "1px solid #fde2e2",
|
|
@@ -18,28 +18,111 @@ var ERROR_STYLE = {
|
|
|
18
18
|
fontSize: "13px",
|
|
19
19
|
lineHeight: "1.6"
|
|
20
20
|
};
|
|
21
|
+
var BUTTON_STYLE = {
|
|
22
|
+
padding: "4px 14px",
|
|
23
|
+
marginRight: "8px",
|
|
24
|
+
border: "1px solid #c45656",
|
|
25
|
+
borderRadius: "4px",
|
|
26
|
+
background: "#c45656",
|
|
27
|
+
color: "#fff",
|
|
28
|
+
fontSize: "13px",
|
|
29
|
+
cursor: "pointer"
|
|
30
|
+
};
|
|
31
|
+
var SECONDARY_BUTTON_STYLE = {
|
|
32
|
+
padding: "4px 14px",
|
|
33
|
+
border: "1px solid #c45656",
|
|
34
|
+
borderRadius: "4px",
|
|
35
|
+
background: "#fff",
|
|
36
|
+
color: "#c45656",
|
|
37
|
+
fontSize: "13px",
|
|
38
|
+
cursor: "pointer"
|
|
39
|
+
};
|
|
21
40
|
var RemoteErrorPlaceholder = defineComponent({
|
|
22
41
|
name: "FulgurjsRemoteError",
|
|
23
|
-
props: {
|
|
42
|
+
props: {
|
|
43
|
+
error: { type: Object, default: void 0 },
|
|
44
|
+
retry: { type: Function, required: false, default: void 0 },
|
|
45
|
+
retrying: { type: Boolean, default: false }
|
|
46
|
+
},
|
|
24
47
|
setup(props) {
|
|
48
|
+
const reloadPage = () => {
|
|
49
|
+
window.location.reload();
|
|
50
|
+
};
|
|
25
51
|
return () => {
|
|
26
52
|
const err = props.error;
|
|
27
53
|
const code = err?.code ?? "UNKNOWN";
|
|
28
54
|
const message = err?.message ?? String(props.error ?? "unknown error");
|
|
29
|
-
|
|
55
|
+
const buttons = [
|
|
56
|
+
props.retry ? h("button", {
|
|
57
|
+
key: "retry",
|
|
58
|
+
style: BUTTON_STYLE,
|
|
59
|
+
type: "button",
|
|
60
|
+
"data-fulgurjs-retry": "",
|
|
61
|
+
disabled: props.retrying,
|
|
62
|
+
onClick: () => props.retry?.()
|
|
63
|
+
}, props.retrying ? "\u52A0\u8F7D\u4E2D\u2026" : "\u91CD\u8BD5\u52A0\u8F7D") : null,
|
|
64
|
+
h("button", {
|
|
65
|
+
key: "reload",
|
|
66
|
+
style: SECONDARY_BUTTON_STYLE,
|
|
67
|
+
type: "button",
|
|
68
|
+
"data-fulgurjs-reload": "",
|
|
69
|
+
disabled: props.retrying,
|
|
70
|
+
onClick: reloadPage
|
|
71
|
+
}, "\u5237\u65B0\u9875\u9762\u91CD\u8BD5")
|
|
72
|
+
].filter(Boolean);
|
|
73
|
+
return h("div", { style: ERROR_STYLE, "data-fulgurjs-error": code }, [
|
|
30
74
|
h("p", { style: "margin:0 0 4px;font-weight:600" }, `\u8FDC\u7A0B\u7EC4\u4EF6\u52A0\u8F7D\u5931\u8D25\uFF08\u9519\u8BEF\u7801 ${code}\uFF09`),
|
|
31
75
|
h("p", { style: "margin:0 0 8px;word-break:break-all" }, message),
|
|
32
|
-
h("p", { style: "margin:0" }, "\u4FEE\u6CD5\uFF1A\u2460 \u6838\u5BF9 spec \u7684\u300C\u8FDC\u7A0B\u540D/expose \u540D\u300D\u4E0E\u8FDC\u7A0B\u5E94\u7528 exposes \u662F\u5426\u4E00\u81F4\uFF08MFU-006/008\uFF09\uFF1B\u2461 \u6838\u5BF9 remotes \u5730\u5740\u7AEF\u53E3\u4E0E\u8FDC\u7A0B\u670D\u52A1\u53EF\u8FBE\u6027\u3001remoteEntry \u662F\u5426\u53EF\u8BBF\u95EE\uFF08MFU-001\uFF09\uFF1B\u2462 \u67E5\u770B window \u7684 fulgurjs:error \u4E8B\u4EF6\u4E0E console \u540C\u6E90\u9519\u8BEF\u5B9A\u4F4D\u6839\u56E0\u3002")
|
|
76
|
+
h("p", { style: "margin:0 0 8px" }, "\u4FEE\u6CD5\uFF1A\u2460 \u6838\u5BF9 spec \u7684\u300C\u8FDC\u7A0B\u540D/expose \u540D\u300D\u4E0E\u8FDC\u7A0B\u5E94\u7528 exposes \u662F\u5426\u4E00\u81F4\uFF08MFU-006/008\uFF09\uFF1B\u2461 \u6838\u5BF9 remotes \u5730\u5740\u7AEF\u53E3\u4E0E\u8FDC\u7A0B\u670D\u52A1\u53EF\u8FBE\u6027\u3001remoteEntry \u662F\u5426\u53EF\u8BBF\u95EE\uFF08MFU-001\uFF09\uFF1B\u2462 \u67E5\u770B window \u7684 fulgurjs:error \u4E8B\u4EF6\u4E0E console \u540C\u6E90\u9519\u8BEF\u5B9A\u4F4D\u6839\u56E0\u3002"),
|
|
77
|
+
h("p", { style: "margin:0 0 10px" }, "\u300C\u91CD\u8BD5\u52A0\u8F7D\u300D\u5728\u5F53\u524D\u9875\u9762\u91CD\u5EFA\u52A0\u8F7D\uFF1B\u82E5\u6D4F\u89C8\u5668\u5DF2\u7F13\u5B58\u5931\u8D25\u7684\u6A21\u5757\uFF08\u5982\u8FDC\u7A0B\u9759\u6001\u5B50\u4F9D\u8D56\u66FE\u52A0\u8F7D\u5931\u8D25\uFF09\uFF0C\u8BF7\u7528\u300C\u5237\u65B0\u9875\u9762\u91CD\u8BD5\u300D\u2014\u2014\u5B83\u4F1A\u6574\u9875\u5237\u65B0\uFF08\u4FDD\u7559\u5F53\u524D\u5730\u5740\uFF09\uFF0C\u672A\u4FDD\u5B58\u7684\u9875\u9762\u72B6\u6001\u4F1A\u4E22\u5931\u3002"),
|
|
78
|
+
h("div", { style: "margin:0" }, buttons)
|
|
33
79
|
]);
|
|
34
80
|
};
|
|
35
81
|
}
|
|
36
82
|
});
|
|
83
|
+
function createRecoverableErrorPlaceholder(loader, spec, userErrorComponent) {
|
|
84
|
+
if (userErrorComponent) return userErrorComponent;
|
|
85
|
+
return defineComponent({
|
|
86
|
+
name: "FulgurjsRemoteErrorWithRetry",
|
|
87
|
+
props: { error: { type: Object, default: void 0 } },
|
|
88
|
+
setup(props, { attrs }) {
|
|
89
|
+
const recovered = ref(null);
|
|
90
|
+
const retrying = ref(false);
|
|
91
|
+
const retryError = ref(void 0);
|
|
92
|
+
const retry = async () => {
|
|
93
|
+
if (retrying.value) return;
|
|
94
|
+
retrying.value = true;
|
|
95
|
+
retryError.value = void 0;
|
|
96
|
+
try {
|
|
97
|
+
const mod = await loader();
|
|
98
|
+
const inner = mod?.default ?? mod;
|
|
99
|
+
if (!inner) throw noRenderableExportError(spec, inner);
|
|
100
|
+
recovered.value = inner;
|
|
101
|
+
} catch (e) {
|
|
102
|
+
retryError.value = e;
|
|
103
|
+
} finally {
|
|
104
|
+
retrying.value = false;
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
return () => {
|
|
108
|
+
const inner = recovered.value;
|
|
109
|
+
if (inner) return h(inner, attrs);
|
|
110
|
+
return h(RemoteErrorPlaceholder, {
|
|
111
|
+
error: retryError.value ?? props.error,
|
|
112
|
+
retry,
|
|
113
|
+
retrying: retrying.value
|
|
114
|
+
});
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
}
|
|
37
119
|
function createRemoteComponent(loadRemote) {
|
|
38
120
|
return function remoteComponent(spec, opts = {}) {
|
|
121
|
+
const loader = () => loadRemote(spec, { retries: opts.retries }).then((m) => m.default ?? m);
|
|
39
122
|
return defineAsyncComponent({
|
|
40
|
-
loader
|
|
123
|
+
loader,
|
|
41
124
|
loadingComponent: opts.loadingComponent,
|
|
42
|
-
errorComponent: opts.errorComponent
|
|
125
|
+
errorComponent: createRecoverableErrorPlaceholder(loader, spec, opts.errorComponent),
|
|
43
126
|
delay: opts.delay,
|
|
44
127
|
timeout: opts.timeout
|
|
45
128
|
});
|
|
@@ -59,18 +142,19 @@ function createHostPages(options, load) {
|
|
|
59
142
|
let comp = compCache.get(spec);
|
|
60
143
|
if (!comp) {
|
|
61
144
|
const name = cleanCompName(spec);
|
|
145
|
+
const pageLoader = async () => {
|
|
146
|
+
await beforeLoad?.();
|
|
147
|
+
const mod = await load(spec);
|
|
148
|
+
const inner = mod?.default ?? mod;
|
|
149
|
+
if (!inner) {
|
|
150
|
+
throw noRenderableExportError(spec, inner);
|
|
151
|
+
}
|
|
152
|
+
return inner;
|
|
153
|
+
};
|
|
62
154
|
const asyncComp = defineAsyncComponent({
|
|
63
|
-
loader:
|
|
64
|
-
await beforeLoad?.();
|
|
65
|
-
const mod = await load(spec);
|
|
66
|
-
const inner = mod?.default ?? mod;
|
|
67
|
-
if (!inner) {
|
|
68
|
-
throw noRenderableExportError(spec, inner);
|
|
69
|
-
}
|
|
70
|
-
return inner;
|
|
71
|
-
},
|
|
155
|
+
loader: pageLoader,
|
|
72
156
|
loadingComponent,
|
|
73
|
-
errorComponent:
|
|
157
|
+
errorComponent: createRecoverableErrorPlaceholder(pageLoader, spec, errorComponent),
|
|
74
158
|
delay
|
|
75
159
|
});
|
|
76
160
|
asyncComp.name = name;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# fulgurjs-federation Examples
|
|
2
|
+
|
|
3
|
+
Pick your framework, copy the host and remote directories, run `npm install`, and you get a full module federation demo. All four projects are standalone: no dependency on this repo's source, the monorepo workspace, or any parent `node_modules` — the plugin dependency is an exact published version from the npm registry.
|
|
4
|
+
|
|
5
|
+
## Vue (host 5214 / remote 5213)
|
|
6
|
+
|
|
7
|
+
Full walkthrough: **[vue/README.md](./vue/README.md)** (Chinese).
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
cd examples/vue/remote && npm install && npm run dev # terminal 1: vue-remote, http://localhost:5213
|
|
11
|
+
cd examples/vue/host && npm install && npm run dev # terminal 2: vue-host, http://localhost:5214
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## React (host 5204 / remote 5203)
|
|
15
|
+
|
|
16
|
+
Full walkthrough: **[react/README.md](./react/README.md)** (Chinese).
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
cd examples/react/remote && npm install && npm run dev # terminal 1: react-remote, http://localhost:5203
|
|
20
|
+
cd examples/react/host && npm install && npm run dev # terminal 2: react-host, http://localhost:5204
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## What each pair demonstrates
|
|
24
|
+
|
|
25
|
+
- A clickable remote counter component (local state lives inside the remote component; operated on the host page)
|
|
26
|
+
- Cross-application plain TS module calls (the host renders real return values)
|
|
27
|
+
- A remote home page plus a parameterized detail page (deep links survive refresh)
|
|
28
|
+
- Host navigation with route-level lazy loading (the home page never bulk-prefetches unvisited remote pages)
|
|
29
|
+
- The plugin's built-in loading/error placeholders and recovery actions (**Retry load** recovers in-page; **Refresh page to retry** recovers via a user-initiated full reload)
|
|
30
|
+
- Production build with a minimal Nginx deployment (including SPA fallback)
|
|
31
|
+
|
|
32
|
+
## Layout
|
|
33
|
+
|
|
34
|
+
```text
|
|
35
|
+
examples/
|
|
36
|
+
├── README.md / README.en.md # this entry (CN/EN)
|
|
37
|
+
├── vue/
|
|
38
|
+
│ ├── README.md # guide for the Vue pair
|
|
39
|
+
│ ├── host/ # Vue host (vue-host, 5214)
|
|
40
|
+
│ └── remote/ # Vue remote (vue-remote, 5213)
|
|
41
|
+
└── react/
|
|
42
|
+
├── README.md # guide for the React pair
|
|
43
|
+
├── host/ # React host (react-host, 5204)
|
|
44
|
+
└── remote/ # React remote (react-remote, 5203)
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
> `examples/` is for users to copy and run. The repository-root `fixtures/` are internal regression harnesses (source-linked to the plugin workspace) — do not treat them as usage templates.
|
package/examples/README.md
CHANGED
|
@@ -1,27 +1,49 @@
|
|
|
1
|
-
#
|
|
1
|
+
# fulgurjs-federation 示例总入口
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
选择你的框架,复制对应宿主与远程两个目录,`npm install` 后即可看到完整的模块联邦演示。四个工程互相独立:不依赖本仓库源码、monorepo workspace 或父目录 node_modules,插件依赖为 npm registry 精确正式包。
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
- [`host/fulgurjs.config.ts`](./host/fulgurjs.config.ts) — 宿主应用:remotes 消费地址 + 可选 `hostPages` 页面核对数据(仅供 CLI)
|
|
5
|
+
## Vue(宿主 5214 / 远程 5213)
|
|
7
6
|
|
|
8
|
-
|
|
7
|
+
完整操作步骤见 **[vue/README.md](./vue/README.md)**。
|
|
9
8
|
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
```bash
|
|
10
|
+
cd examples/vue/remote && npm install && npm run dev # 终端 1:vue-remote,http://localhost:5213
|
|
11
|
+
cd examples/vue/host && npm install && npm run dev # 终端 2:vue-host,http://localhost:5214
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## React(宿主 5204 / 远程 5203)
|
|
12
15
|
|
|
13
|
-
|
|
16
|
+
完整操作步骤见 **[react/README.md](./react/README.md)**。
|
|
14
17
|
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
|
|
18
|
+
```bash
|
|
19
|
+
cd examples/react/remote && npm install && npm run dev # 终端 1:react-remote,http://localhost:5203
|
|
20
|
+
cd examples/react/host && npm install && npm run dev # 终端 2:react-host,http://localhost:5204
|
|
21
|
+
```
|
|
18
22
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
## 每对示例演示什么
|
|
24
|
+
|
|
25
|
+
- 远程可点击计数组件(本地状态在远程组件内,宿主页面直接操作)
|
|
26
|
+
- 普通 TS 模块跨应用调用(宿主展示真实返回值)
|
|
27
|
+
- 远程首页 + 带真实路由参数的详情页(深链刷新可恢复)
|
|
28
|
+
- 宿主导航、路由级懒加载(首页不批量预取未访问的远程页面)
|
|
29
|
+
- 插件默认加载/错误占位与恢复操作(**重试加载** 同页恢复;**刷新页面重试** 整页恢复)
|
|
30
|
+
- 生产构建 + 最小 Nginx 部署(含 SPA fallback)
|
|
31
|
+
|
|
32
|
+
## 目录
|
|
33
|
+
|
|
34
|
+
```text
|
|
35
|
+
examples/
|
|
36
|
+
├── README.md / README.en.md # 本入口(中/英)
|
|
37
|
+
├── vue/
|
|
38
|
+
│ ├── README.md # Vue 一对示例的组合说明
|
|
39
|
+
│ ├── host/ # Vue 宿主(vue-host,5214)
|
|
40
|
+
│ └── remote/ # Vue 远程(vue-remote,5213)
|
|
41
|
+
└── react/
|
|
42
|
+
├── README.md # React 一对示例的组合说明
|
|
43
|
+
├── host/ # React 宿主(react-host,5204)
|
|
44
|
+
└── remote/ # React 远程(react-remote,5203)
|
|
25
45
|
```
|
|
26
46
|
|
|
27
|
-
|
|
47
|
+
> `examples/` 面向使用者拷贝运行;仓库根的 `fixtures/` 是插件内部回归夹具(源码 link 到插件工作区),请勿当作使用模板。
|
|
48
|
+
|
|
49
|
+
> 提示:复制后可在项目根目录运行 `npx fulgurjs explain`(纯本地、无网络)核对联邦配置摘要。
|