@fulgurjs/federation 4.3.0 → 5.0.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 +29 -0
- package/DESIGN.md +1 -0
- package/README.md +35 -42
- package/dist/cli.js +59 -468
- package/dist/context.cjs +5 -5
- package/dist/context.js +16 -8
- package/dist/index.cjs +97 -110
- package/dist/index.d.cts +87 -2
- package/dist/index.d.ts +87 -2
- package/dist/index.js +99 -113
- package/dist/runtime.js +22 -10
- package/dist/vue-adapter.cjs +2 -2
- package/dist/vue-adapter.js +135 -4
- package/docs//350/277/201/347/247/273/346/214/207/345/215/227.md +14 -2
- package/package.json +2 -15
- package/dist/chunk-AD2XIMBJ.js +0 -141
- package/dist/chunk-FMV5BXGS.js +0 -6
- package/dist/chunk-WBCXLR2N.js +0 -46
- package/dist/config.cjs +0 -174
- package/dist/config.d.cts +0 -106
- package/dist/config.d.ts +0 -106
- package/dist/config.js +0 -136
- package/dist/options-CRGpSmVj.d.cts +0 -100
- package/dist/options-CRGpSmVj.d.ts +0 -100
- package/dist/vue.cjs +0 -1293
- package/dist/vue.d.cts +0 -10
- package/dist/vue.d.ts +0 -10
package/dist/runtime.js
CHANGED
|
@@ -1,10 +1,22 @@
|
|
|
1
|
-
var
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
var de=/^v?(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:-((?:[0-9A-Za-z-]+)(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z.-]+)?$/;function L(i){let c=de.exec(String(i).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(i,c){if(i.length===0&&c.length===0)return 0;if(i.length===0)return 1;if(c.length===0)return-1;let l=Math.max(i.length,c.length);for(let o=0;o<l;o++){let g=i[o],y=c[o];if(g===void 0)return-1;if(y===void 0)return 1;let w=/^\d+$/.test(g),b=/^\d+$/.test(y);if(w&&b){let I=Number(g)-Number(y);if(I!==0)return I}else{if(w!==b)return w?-1:1;if(g!==y)return g<y?-1:1}}return 0}function O(i,c){let l=L(i),o=L(c);return!l||!o?i<c?-1:i>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(i,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(i,o.trim()))}function ye(i,c){if(!c||c==="*")return!L(i)?.pre.length;let l=c.split(/\s+-\s+/);if(l.length===2){let y=l[0].trim(),w=l[1].trim();return!(!j(i,`>=${y}`)||!j(i,`<=${w}`))}let o=L(i);if(!o)return!1;let g=Se(c);if(g===null)return!0;for(let y of g)if(!Pe(o,i,y))return!1;return!(o.pre.length>0&&!g.some(y=>y.ver.pre.length>0)&&!g.some(w=>w.ver.major===o.major&&w.ver.minor===o.minor&&w.ver.patch===o.patch))}function Se(i){let c=[],l=i.trim().split(/\s+/).filter(Boolean);if(l.length===0)return null;for(let o of l){let g=/^(>=|<=|>|<|=|\^|~)?(.*)$/.exec(o);if(!g)return null;let y=g[1],w=g[2],b=Ee(y,w);if(b===null)return null;c.push(...b)}return c}function Ee(i,c){let l=we(c);if(!l)return null;let{ver:o,partial:g}=l;switch(i){case"^":{let y=Re(o);return y?[{op:">=",ver:o},{op:"<",ver:y}]:null}case"~":{let y=g>=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 g===1?[{op:">=",ver:{major:o.major+1,minor:0,patch:0,pre:[]}}]:g===2?[{op:">=",ver:{major:o.major,minor:o.minor+1,patch:0,pre:[]}}]:[{op:">",ver:o}];case"<":return g===1?[{op:"<",ver:{major:o.major,minor:0,patch:0,pre:[]}}]:g===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 g===1?[{op:">=",ver:o},{op:"<",ver:{major:o.major+1,minor:0,patch:0,pre:[]}}]:g===2?[{op:">=",ver:o},{op:"<",ver:{major:o.major,minor:o.minor+1,patch:0,pre:[]}}]:[{op:"=",ver:o}];default:return null}}function Re(i){return i.major>0?{major:i.major+1,minor:0,patch:0,pre:[]}:i.minor>0?{major:0,minor:i.minor+1,patch:0,pre:[]}:{major:0,minor:0,patch:i.patch+1,pre:[]}}function we(i){let c=i.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=[],g=0;for(let b of l.slice(0,3))if(/^\d+$/.test(b))o.push(Number(b)),g++;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 g===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:g}}function be(i,c){switch(c){case">=":return i>=0;case">":return i>0;case"<":return i<0;case"<=":return i<=0;case"=":return i===0}}function Pe(i,c,l){let o=`${i.major}.${i.minor}.${i.patch}`+(i.pre.length?`-${i.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 g=O(o,`${l.ver.major}.${l.ver.minor}.${l.ver.patch}`+(l.ver.pre.length?`-${l.ver.pre.join(".")}`:"")),y=be(g,l.op);return l.ver.pre.length>0&&i.pre.length===0&&(l.op===">"||l.op==="<")?!1:y}var S=class extends Error{code;details;constructor(c,l,o){super(`[fulgurjs:${c}] ${l}`),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.0.0";var _e="__fulgurjsSetup",$e="__FULGURJS_APP_CONFIG__",D=15e3,z=2,Me=5,ve=3e4,Ie=4e3,Te=.2;function Oe(){let i=Object.create(null),c=new Map,l=[],o=new Set,g=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)}},k=new Map,A,Q=e=>{let r=k.get(e);return r||k.set(e,r={}),r},V=()=>globalThis[$e]??{};async function K(e,r,t,n){let a=u=>u instanceof S?u:new S(E.SETUP_RUN_FAILED,`\u73B0\u8C61\uFF1A\u8FDC\u7A0B\u5E94\u7528 "${e}" \u7684 ${n} \u521D\u59CB\u5316\u5931\u8D25\u3002
|
|
2
|
+
\u539F\u56E0\uFF1A${String(u?.message??u)}
|
|
3
|
+
\u4FEE\u6CD5\uFF1A\u68C0\u67E5\u5E76\u4FEE\u590D\u8BE5 ${n} \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:n});A=e;let s;try{s=r(t)}catch(u){throw a(u)}finally{A=void 0}try{await s}catch(u){throw a(u)}}async function ee(e,r,t,n){e.debug.setup="pending";try{if(e.manifestUrl)try{await F(`${e.name}/${t}`)}catch{}let a=await r.get(t),s=a?.default;if(typeof s!="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
|
+
\u539F\u56E0\uFF1A\u9ED8\u8BA4\u5BFC\u51FA\u7C7B\u578B\u4E3A ${a==null?String(a):typeof s}\uFF0C\u5E94\u4E3A\u51FD\u6570\u3002
|
|
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(a.onSession!==void 0&&typeof a.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
|
+
\u539F\u56E0\uFF1AonSession \u5BFC\u51FA\u7C7B\u578B\u4E3A ${typeof a.onSession}\uFF0C\u5E94\u4E3A\u51FD\u6570\u3002
|
|
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});n.setupExports=a,await K(e.name,s,{appContext:V(),signal:(n.controller??=new AbortController).signal},"setup"),e.debug.setup="ready"}catch(a){throw e.debug.setup="failed",n.setupExports=void 0,a}}async function re(e,r,t){let n=V(),a=n?.sessionKey;if(typeof a!="string"||a==="")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
|
+
\u539F\u56E0\uFF1A\u5F53\u524D\u503C\u4E3A ${a===void 0?"\u7F3A\u5931":JSON.stringify(a)}\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===a)return r.sessionPromise;r.controller?.abort();let s=new AbortController;r.controller=s,r.sessionKey=a;let u=r.sessionPromise?r.sessionPromise.catch(()=>{}):Promise.resolve(),p=(async()=>{await u,!s.signal.aborted&&await K(e.name,t,{appContext:n,sessionKey:a,signal:s.signal},"onSession")})();return r.sessionPromise=p,p.catch(()=>{r.sessionKey===a&&(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 n=Q(e.name);n.setupPromise||(n.setupPromise=ee(e,r,t,n).catch(s=>{throw n.setupPromise=void 0,s})),await n.setupPromise;let a=n.setupExports?.onSession;typeof a=="function"&&await re(e,n,a)}function ne(){for(let e of k.values()){try{e.controller?.abort()}catch{}e.sessionKey=void 0,e.sessionPromise=void 0}}let U=e=>i[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 U(e),i}function se(e,r,t,n,a={}){let s=U(e||"default"),u=Object.hasOwn(s,r)?s[r]:void 0,p=u&&typeof u=="object"?u:void 0;p||(p=Object.create(null),s[r]=p),!(Object.hasOwn(p,t)&&p[t])&&(p[t]={version:t,get:n,from:a.from??"unknown",eager:!!a.eager,loaded:!!a.loaded})}function ie(e){let r=(t,n,a)=>{if(t===void 0)return;if(!(typeof t=="number"&&(a?Number.isInteger(t)&&t>=0&&t<=10:Number.isFinite(t)&&t>0)))throw new Error(`[fulgurjs] \u8FDC\u7A0B\u5E94\u7528 "${e.name}" \u7684 ${n} \u914D\u7F6E\u65E0\u6548\uFF1A\u5F53\u524D\u4E3A ${String(t)}\uFF0C\u5E94\u4E3A${a?" 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,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",n=r.shareKey||e,s=U(t)[n]||{},u=Object.keys(s),p=r.requiredVersion,h=u.filter(f=>p===void 0||p===!1||j(f,p)),d;if(r.singleton&&u.length>0){let f=u.filter(m=>s[m].loaded);if(d=[...f.length?f:u].sort(O).pop(),!h.includes(d)){let m=s[d],v=`\u73B0\u8C61\uFF1A\u5171\u4EAB\u5355\u4F8B "${n}" \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 ${d}\u3002
|
|
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:n,requiredVersion:p});throw _({remote:m.from,error:T}),T}let $=`${t}|${n}|${p??"*"}|${d}|${u.join(",")}`;o.has($)||(o.add($),console.warn(`[fulgurjs:MFU-010] ${v}`))}}else if(d=[...h].sort(O).pop(),!d){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 "${n}"\u3002
|
|
13
|
+
\u539F\u56E0\uFF1A\u8981\u6C42\u7248\u672C ${p}\uFF0C\u5F53\u524D\u53EF\u7528\u7248\u672C\u4E3A ${u.join("\u3001")||"\u65E0"}\u3002
|
|
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:n,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 "${n}"\u3002
|
|
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:n,requiredVersion:p});throw _({remote:n,error:f}),f}let R=s[d];if(I.resolveShare){let f=await I.resolveShare({shareKey:n,shareScope:t,requiredVersion:p,picked:R,available:Object.values(s)});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((n,a)=>{let s=setTimeout(()=>a(new Error(`\u7B49\u5F85\u8D85\u8FC7 ${r} \u6BEB\u79D2\uFF1A${t}`)),r);e.then(u=>{clearTimeout(s),n(u)},u=>{clearTimeout(s),a(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.entryInflight.get(e),n=t??import(e);return t||(r.entryInflight.set(e,n),n.catch(()=>r.entryInflight.delete(e))),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 s=b.get(e.container);if(s&&s!==t)throw new S(E.CONTAINER_REINIT_CONFLICT,`\u8FDC\u7A0B\u5BB9\u5668 "${e.name}" \u5DF2\u4F7F\u7528\u5171\u4EAB\u4F5C\u7528\u57DF "${s}" \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 n=e.breakerState;if(n.openUntil>Date.now()){let s=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(n.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:s}),s}e.state="loading",e.debug.status="loading";let a=(async()=>{let s=[];if(e.promise)s.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??[]])s.push(async()=>{let m=await J(f,e);return N(m,e),m});let u,p,h=!1,d=r?.retries??e.retries??z;for(let f of s){for(let m=0;m<=d;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<d&&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
|
+
\u539F\u56E0\uFF1A${String(p?.message??p)}
|
|
18
|
+
\u4FEE\u6CD5\uFF1A
|
|
19
|
+
${m.join(`
|
|
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(i),b.set(u,t),e.container=u,e.state="loaded",e.debug.status="loaded",n.fails=0,u})();e.containerPromise=a;try{return await a}catch(s){if(e.containerPromise=void 0,e.state="failed",e.debug.status="failed",e.debug.error=String(s?.message??s),n.fails+=1,n.fails>=e.breakerThreshold&&(n.openUntil=Date.now()+e.breakerResetMs,n.fails=0),s instanceof S)throw _({remote:e.name,error:s}),s;if(s?.code)throw _({remote:e.name,error:s}),s;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(s?.message??s)}\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:n}=C(e);if(n&&A===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
|
+
\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:n})}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 a=c.get(t);if(!a)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 s;try{let h=n&&a.manifestUrl?F(e):Promise.resolve();[s]=await Promise.all([X(a,{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(!n)return s;await te(a,s);let u=`${t}@${a.shareScope||"default"}#${n}`;g.has(u)||g.set(u,s.get(n).catch(h=>{throw g.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 "${n}"\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:n})}));let p;try{p=await g.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:n,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 "${n}" \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:n});_({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:n}=C(e),a=c.get(t);if(!a)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 s=r.mode??"preload",u=(d,R)=>{if(d.sheet)return Promise.resolve();let f=w.get(d);if(f)return f;let m=new Promise(v=>{let $=()=>{d.removeEventListener("load",$),d.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})}),$()};d.addEventListener("load",$,{once:!0}),d.addEventListener("error",T,{once:!0}),d.sheet&&$()});return w.set(d,m),m},p=(d,R)=>{if(typeof document>"u")return Promise.resolve();let f=document.querySelector(`link[href="${d}"]`);if(f)return R==="style"&&s==="preload"?w.get(f)??Promise.resolve():Promise.resolve();let m=document.createElement("link");m.rel=R==="style"?"stylesheet":"modulepreload",m.href=d,s==="prefetch"&&(m.fetchPriority="low");let v=R==="style"?u(m,d):Promise.resolve();return document.head.appendChild(m),R==="style"&&s==="preload"?v:Promise.resolve()},h=d=>{let R=typeof document<"u"?document.baseURI:void 0,f=new URL(a.entry,R||"http://fulgurjs.invalid/");return!f.pathname.endsWith("/")&&!f.pathname.split("/").pop().includes(".")&&(f.pathname+="/"),new URL(d,f).href};try{if(a.manifestUrl){let d=y.get(a.manifestUrl);d||(d=fetch(a.manifestUrl,{cache:"no-cache",signal:AbortSignal.timeout(8e3)}).then(f=>f.ok?f.json():void 0),y.set(a.manifestUrl,d),d.then(f=>{f||y.delete(a.manifestUrl)},()=>y.delete(a.manifestUrl)));let R=await d;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(a.entry,"modulepreload");return}await p(a.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):[],$=n?v.filter(([M,x])=>B(String(x?.name??M))===n):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");s==="preload"&&T.push(pe)}await Promise.all(T);return}}await p(a.entry,"modulepreload")}catch(d){_({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(d?.message??d)}\u3002\u8BF7\u68C0\u67E5 manifest \u548C\u8D44\u6E90\u5730\u5740\u3002`,{remote:t})})}}return typeof window>"u"||(window.__FULGURJS_SCOPE__=i,window.__FULGURJS_INFO__={get remotes(){let e={};for(let[r,t]of c)e[r]={...t.debug,entry:t.entry};return e},errors:[]}),{shareScopeMap:i,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(i){if(i&&typeof i=="object"&&"default"in i){let c=i.default;return c!==void 0?c:i}return i}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
|
@@ -216,7 +216,7 @@ function createHostPages(options, load) {
|
|
|
216
216
|
if (route.startsWith(prefix) || `${route}/` === prefix) return name;
|
|
217
217
|
}
|
|
218
218
|
throw new Error(
|
|
219
|
-
`[fulgurjs]
|
|
219
|
+
`[fulgurjs] \u9875\u9762\u8DEF\u7531 "${route}" \u672A\u5339\u914D\u4EFB\u4F55 remotePrefixes\uFF1A{ ${Object.entries(remotePrefixes).map(([k, v]) => `'${k}': '${v}'`).join(", ")} }
|
|
220
220
|
\u6839\u56E0: \u9875\u9762\u8868\u6761\u76EE\u7684\u8DEF\u7531\u4E0D\u5728\u4EFB\u4F55\u5DF2\u58F0\u660E\u7684\u8FDC\u7A0B\u524D\u7F00\u4E0B\u3002
|
|
221
221
|
\u4FEE\u6CD5: \u5728 remotePrefixes \u8865\u5145\u8BE5\u8DEF\u7531\u524D\u7F00 \u2192 \u8FDC\u7A0B\u540D\u7684\u6620\u5C04\uFF0C\u6216\u4FEE\u6B63\u9875\u9762\u8868 route\u3002`
|
|
222
222
|
);
|
|
@@ -278,7 +278,7 @@ function createHostPages(options, load) {
|
|
|
278
278
|
const inner = mod?.default ?? mod;
|
|
279
279
|
if (!inner) {
|
|
280
280
|
throw new Error(
|
|
281
|
-
`[fulgurjs]
|
|
281
|
+
`[fulgurjs] \u8FDC\u7A0B\u6A21\u5757 "${spec}" \u6CA1\u6709\u5BFC\u51FA\u53EF\u6E32\u67D3\u7EC4\u4EF6\uFF1B\u5F53\u524D\u503C\u7C7B\u578B\u4E3A ${inner === null ? "null" : typeof inner}\u3002
|
|
282
282
|
\u4FEE\u6CD5: \u6838\u5BF9\u8FDC\u7A0B exposes \u952E\u540D\u4E0E\u9875\u9762\u8868 spec \u662F\u5426\u4E00\u81F4\uFF08MFU-006 \u8BED\u4E49\uFF09`
|
|
283
283
|
);
|
|
284
284
|
}
|
package/dist/vue-adapter.js
CHANGED
|
@@ -1,8 +1,139 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
definePages
|
|
3
|
+
} from "./chunk-TSXZ7TWA.js";
|
|
4
|
+
|
|
5
|
+
// src/vue-adapter.ts
|
|
6
|
+
import { defineAsyncComponent, defineComponent, h } from "vue";
|
|
7
|
+
var ERROR_STYLE = {
|
|
8
|
+
padding: "16px",
|
|
9
|
+
border: "1px solid #fde2e2",
|
|
10
|
+
borderRadius: "4px",
|
|
11
|
+
background: "#fef0f0",
|
|
12
|
+
color: "#c45656",
|
|
13
|
+
fontSize: "13px",
|
|
14
|
+
lineHeight: "1.6"
|
|
15
|
+
};
|
|
16
|
+
var RemoteErrorPlaceholder = defineComponent({
|
|
17
|
+
name: "FulgurjsRemoteError",
|
|
18
|
+
props: { error: { type: Object, default: void 0 } },
|
|
19
|
+
setup(props) {
|
|
20
|
+
return () => {
|
|
21
|
+
const err = props.error;
|
|
22
|
+
const code = err?.code ?? "UNKNOWN";
|
|
23
|
+
const message = err?.message ?? String(props.error ?? "unknown error");
|
|
24
|
+
return h("div", { style: ERROR_STYLE }, [
|
|
25
|
+
h("p", { style: "margin:0 0 4px;font-weight:600" }, `\u8FDC\u7A0B\u7EC4\u4EF6\u52A0\u8F7D\u5931\u8D25\uFF08\u9519\u8BEF\u7801 ${code}\uFF09`),
|
|
26
|
+
h("p", { style: "margin:0 0 8px;word-break:break-all" }, message),
|
|
27
|
+
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")
|
|
28
|
+
]);
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
function createRemoteComponent(loadRemote) {
|
|
33
|
+
return function remoteComponent(spec, opts = {}) {
|
|
34
|
+
return defineAsyncComponent({
|
|
35
|
+
loader: () => loadRemote(spec, { retries: opts.retries }).then((m) => m.default ?? m),
|
|
36
|
+
loadingComponent: opts.loadingComponent,
|
|
37
|
+
errorComponent: opts.errorComponent ?? RemoteErrorPlaceholder,
|
|
38
|
+
delay: opts.delay,
|
|
39
|
+
timeout: opts.timeout
|
|
40
|
+
});
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
var cleanCompName = (spec) => "Fulgurjs_" + spec.replace(/[^A-Za-z0-9_-]/g, "_");
|
|
44
|
+
function defaultDeriveSpec(route) {
|
|
45
|
+
return route.split("/").filter(Boolean).slice(1).filter((seg) => !seg.startsWith(":")).join("/");
|
|
46
|
+
}
|
|
47
|
+
function createHostPages(options, load) {
|
|
48
|
+
const { pages, remotePrefixes, deriveSpec, schema, strict, base, beforeLoad, loadingComponent, errorComponent, delay } = options;
|
|
49
|
+
definePages(pages, { deriveSpec, remotes: remotePrefixes, schema, strict });
|
|
50
|
+
const prefixes = Object.entries(remotePrefixes).map(([p, name]) => [p.endsWith("/") ? p : `${p}/`, name]).sort((a, b) => b[0].length - a[0].length);
|
|
51
|
+
const remoteOf = (route) => {
|
|
52
|
+
for (const [prefix, name] of prefixes) {
|
|
53
|
+
if (route.startsWith(prefix) || `${route}/` === prefix) return name;
|
|
54
|
+
}
|
|
55
|
+
throw new Error(
|
|
56
|
+
`[fulgurjs] \u9875\u9762\u8DEF\u7531 "${route}" \u672A\u5339\u914D\u4EFB\u4F55 remotePrefixes\uFF1A{ ${Object.entries(remotePrefixes).map(([k, v]) => `'${k}': '${v}'`).join(", ")} }
|
|
57
|
+
\u6839\u56E0: \u9875\u9762\u8868\u6761\u76EE\u7684\u8DEF\u7531\u4E0D\u5728\u4EFB\u4F55\u5DF2\u58F0\u660E\u7684\u8FDC\u7A0B\u524D\u7F00\u4E0B\u3002
|
|
58
|
+
\u4FEE\u6CD5: \u5728 remotePrefixes \u8865\u5145\u8BE5\u8DEF\u7531\u524D\u7F00 \u2192 \u8FDC\u7A0B\u540D\u7684\u6620\u5C04\uFF0C\u6216\u4FEE\u6B63\u9875\u9762\u8868 route\u3002`
|
|
59
|
+
);
|
|
60
|
+
};
|
|
61
|
+
for (const page of pages) remoteOf(page.route);
|
|
62
|
+
const specOf = (page) => {
|
|
63
|
+
const s = page.spec ?? (deriveSpec ? deriveSpec(page.route) : defaultDeriveSpec(page.route));
|
|
64
|
+
return `${remoteOf(page.route)}/${String(s).replace(/^[./]+/, "")}`;
|
|
65
|
+
};
|
|
66
|
+
const baseNorm = base && base !== "/" ? base.endsWith("/") ? base : `${base}/` : "";
|
|
67
|
+
const matchSegments = (pattern, path) => {
|
|
68
|
+
const patSegs = pattern.split("/").filter(Boolean);
|
|
69
|
+
const pathSegs = path.split("/").filter(Boolean);
|
|
70
|
+
if (patSegs.length !== pathSegs.length) return null;
|
|
71
|
+
const params = {};
|
|
72
|
+
for (let i = 0; i < patSegs.length; i++) {
|
|
73
|
+
const seg = patSegs[i];
|
|
74
|
+
if (seg.startsWith(":")) {
|
|
75
|
+
try {
|
|
76
|
+
params[seg.slice(1)] = decodeURIComponent(pathSegs[i]);
|
|
77
|
+
} catch {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
} else if (seg !== pathSegs[i]) {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return params;
|
|
85
|
+
};
|
|
86
|
+
let cacheSession;
|
|
87
|
+
const compCache = /* @__PURE__ */ new Map();
|
|
88
|
+
const resolve = (rawPath) => {
|
|
89
|
+
let clean = String(rawPath ?? "");
|
|
90
|
+
if (baseNorm) {
|
|
91
|
+
if (clean === baseNorm.replace(/\/$/, "")) clean = "/";
|
|
92
|
+
else if (clean.startsWith(baseNorm)) clean = `/${clean.slice(baseNorm.length)}`;
|
|
93
|
+
}
|
|
94
|
+
clean = (clean.replace(/\/+$/, "") || "/").split("?")[0].split("#")[0];
|
|
95
|
+
for (const page of pages) {
|
|
96
|
+
const params = matchSegments(page.route, clean);
|
|
97
|
+
if (params) return { page, remote: remoteOf(page.route), spec: specOf(page), params };
|
|
98
|
+
}
|
|
99
|
+
return null;
|
|
100
|
+
};
|
|
101
|
+
const component = (spec) => {
|
|
102
|
+
const sk = (globalThis.__FULGURJS_APP_CONFIG__ ?? {}).sessionKey;
|
|
103
|
+
const sessionKey = typeof sk === "string" && sk !== "" ? sk : void 0;
|
|
104
|
+
if (sessionKey !== void 0 && sessionKey !== cacheSession) {
|
|
105
|
+
compCache.clear();
|
|
106
|
+
cacheSession = sessionKey;
|
|
107
|
+
}
|
|
108
|
+
let comp = compCache.get(spec);
|
|
109
|
+
if (!comp) {
|
|
110
|
+
const name = cleanCompName(spec);
|
|
111
|
+
const asyncComp = defineAsyncComponent({
|
|
112
|
+
loader: async () => {
|
|
113
|
+
await beforeLoad?.();
|
|
114
|
+
const mod = await load(spec);
|
|
115
|
+
const inner = mod?.default ?? mod;
|
|
116
|
+
if (!inner) {
|
|
117
|
+
throw new Error(
|
|
118
|
+
`[fulgurjs] \u8FDC\u7A0B\u6A21\u5757 "${spec}" \u6CA1\u6709\u5BFC\u51FA\u53EF\u6E32\u67D3\u7EC4\u4EF6\uFF1B\u5F53\u524D\u503C\u7C7B\u578B\u4E3A ${inner === null ? "null" : typeof inner}\u3002
|
|
119
|
+
\u4FEE\u6CD5: \u6838\u5BF9\u8FDC\u7A0B exposes \u952E\u540D\u4E0E\u9875\u9762\u8868 spec \u662F\u5426\u4E00\u81F4\uFF08MFU-006 \u8BED\u4E49\uFF09`
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
return inner;
|
|
123
|
+
},
|
|
124
|
+
loadingComponent,
|
|
125
|
+
errorComponent: errorComponent ?? RemoteErrorPlaceholder,
|
|
126
|
+
delay
|
|
127
|
+
});
|
|
128
|
+
asyncComp.name = name;
|
|
129
|
+
comp = asyncComp;
|
|
130
|
+
compCache.set(spec, comp);
|
|
131
|
+
}
|
|
132
|
+
return comp;
|
|
133
|
+
};
|
|
134
|
+
const keepAliveNames = pages.filter((p) => p.keepAlive).map((p) => cleanCompName(specOf(p)));
|
|
135
|
+
return { pages, resolve, component, keepAliveNames };
|
|
136
|
+
}
|
|
6
137
|
export {
|
|
7
138
|
createHostPages,
|
|
8
139
|
createRemoteComponent
|
|
@@ -18,11 +18,11 @@
|
|
|
18
18
|
|
|
19
19
|
## 二、迁移步骤(真实案例顺序)
|
|
20
20
|
|
|
21
|
-
1. **子应用装插件 + 每项目一份 fulgurjs.config.ts + exposes**:项目根新建 `fulgurjs.config.ts`(默认导出 `satisfies FederationOptions`),把原菜单路由表逐页映射为 `exposes`(`./pages/bpm/task/todo` 对应路由 `bpm/task/todo`);vite.config.ts 删除一切 `loadRepoConfig/federationOptionsForApp/父目录配置` 写法,改为导入本项目配置并 `federation(fulgurjsConfig)` 注册一次(4.1.0
|
|
21
|
+
1. **子应用装插件 + 每项目一份 fulgurjs.config.ts + exposes**:项目根新建 `fulgurjs.config.ts`(默认导出 `satisfies FederationOptions`),把原菜单路由表逐页映射为 `exposes`(`./pages/bpm/task/todo` 对应路由 `bpm/task/todo`);vite.config.ts 删除一切 `loadRepoConfig/federationOptionsForApp/父目录配置` 写法,改为导入本项目配置并 `federation(fulgurjsConfig)` 注册一次(4.1.0 聚合配置已在 5.0.0 删除,传入旧形状会得到中文迁移错误)。
|
|
22
22
|
2. **shared 声明**:vue/pinia/vue-router 设 singleton;**不要**把业务库(element-plus/avue/dayjs 等)放 shared——插件会在预构建与构建期自动处理其内部对 shared 键的引用(UMD/CJS-only 依赖支持)。
|
|
23
23
|
3. **宿主装插件 + remotes + 页面数据唯一源**:宿主自己的 `fulgurjs.config.ts` 声明 `remotes` 与 `exposes`,并以具名导出 `hostPages` 提供页面核对数据(与运行时页面真源 `src/fulgurjs/host/pages.data.ts` 同一份数据模块,供 `fulgurjs explain/check-pages`);菜单 URL 通道由 `resolveFulgurjsPageFromPath` 按路由表解析 spec(`admin/src/fulgurjs/host/pages.ts`)。
|
|
24
24
|
4. **全局环境迁移**:子应用依赖宿主的全局(用户/字典 store、i18n、全局组件、全局样式)→ 在子应用 `federation({ setup })` 声明初始化入口文件:默认导出 `setup(context)` 应用级执行一次(全局组件/样式/locale),可选具名导出 `onSession(context)` 按宿主 sessionKey 去重同步用户/权限/字典(换账号自动重跑);宿主正常 `loadRemote` 页面即可,**无需手写「loadRemote 启动器并调用」**;失败必须显式报错(H3,MFU-011~014)。
|
|
25
|
-
>
|
|
25
|
+
> 「expose 一个普通 TS 启动器 + 宿主手动 loadRemote 调用」只是普通 expose 的通用用法(不是插件 API,无去重/重试语义);初始化请一律用 `setup`/`onSession`。
|
|
26
26
|
5. **路由参数**:页面组件用 `defineProps` 声明参数(id/taskId 等);宿主路由通道把 params+query 作为 props 传入。
|
|
27
27
|
6. **跨应用弹窗**:原 iframe 嵌子应用页 → `fulgurjsPageComponent(spec)` 直渲染 + props(见 FormDetailsModal);真外链(数据驱动 URL、AMIS 站点)保留 iframe。
|
|
28
28
|
7. **公共依赖坑**:
|
|
@@ -165,3 +165,15 @@ const PREFETCH_REMOTES: string[] = ['mes-bpm'] // 显式预热整
|
|
|
165
165
|
2. `QIANKUN_OPEN=false` 固化,保留一个版本周期回滚能力
|
|
166
166
|
3. 删除 qiankun 注册层(admin/src/qiankun/apps.ts 等)与 single-spa 依赖
|
|
167
167
|
4. 子应用可独立部署 ⇄ 宿主消费双形态长期保留
|
|
168
|
+
|
|
169
|
+
## 五、5.0.0 删除的旧 API 与替代写法
|
|
170
|
+
|
|
171
|
+
5.0.0 是有意的破坏性清理(插件尚无外部用户时收敛公开面)。旧 API 传入时一律得到中文的「当前值 → 原因 → 迁移写法」错误,不会被静默接受:
|
|
172
|
+
|
|
173
|
+
| 已删除(5.0.0) | 替代写法 |
|
|
174
|
+
|---|---|
|
|
175
|
+
| `@fulgurjs/federation/config` 子路径(`defineRepoConfig` / `loadRepoConfig` / `federationOptionsForApp` / `RepoConfig` 等聚合类型) | 每个应用根目录一份 `fulgurjs.config.ts`,默认导出直接 `satisfies FederationOptions`;`host.pages`/`remotePrefixes`/`deriveSpec` 改具名导出 `hostPages` |
|
|
176
|
+
| CLI `--app <应用名>`(聚合配置选择器) | 在各应用根目录直接运行 `fulgurjs explain` / `fulgurjs check-pages`;传 `--app` 会报中文错误 |
|
|
177
|
+
| check-pages 旧聚合形态的本地 dist 回退 | `--manifest <远程>=<路径\|URL>` 或 `--site <URL>`(显式来源失败如实报「无法验证」,不假装通过) |
|
|
178
|
+
| `federation()` 选项:`remoteType`、`library`、`automaticAsyncBoundary`、`dataPrefetch`、`usedExports`、`ignoreUnusedSharedExports` | 直接删除该字段:remoteEntry 恒为 ESM、TLA 异步边界恒开、tree-shaking 由打包器原生完成;需要预载时运行时调用 `preloadRemote()`(`/runtime` 导出)。传入任何值(含历史合法值)报 `CFG-011` |
|
|
179
|
+
| 旧「expose 启动器 + 宿主手动调用」初始化范式 | `federation({ setup })`:默认导出 `setup(context)` 应用级一次 + 具名导出 `onSession(context)` 会话级去重 |
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fulgurjs/federation",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "5.0.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Vite Module Federation with full Webpack MF parity. Dev & production, no compromise.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -13,11 +13,6 @@
|
|
|
13
13
|
"import": "./dist/index.js",
|
|
14
14
|
"require": "./dist/index.cjs"
|
|
15
15
|
},
|
|
16
|
-
"./config": {
|
|
17
|
-
"types": "./dist/config.d.ts",
|
|
18
|
-
"import": "./dist/config.js",
|
|
19
|
-
"require": "./dist/config.cjs"
|
|
20
|
-
},
|
|
21
16
|
"./runtime": {
|
|
22
17
|
"types": "./dist/runtime-entry.d.ts",
|
|
23
18
|
"import": "./dist/runtime-entry.js"
|
|
@@ -33,11 +28,6 @@
|
|
|
33
28
|
"import": "./dist/pages.js",
|
|
34
29
|
"require": "./dist/pages.cjs"
|
|
35
30
|
},
|
|
36
|
-
"./internal/vue.js": {
|
|
37
|
-
"types": "./dist/vue.d.ts",
|
|
38
|
-
"import": "./dist/vue.js",
|
|
39
|
-
"require": "./dist/vue.cjs"
|
|
40
|
-
},
|
|
41
31
|
"./internal/vue-adapter.js": {
|
|
42
32
|
"types": "./dist/vue-adapter.d.ts",
|
|
43
33
|
"import": "./dist/vue-adapter.js",
|
|
@@ -46,9 +36,6 @@
|
|
|
46
36
|
},
|
|
47
37
|
"typesVersions": {
|
|
48
38
|
"*": {
|
|
49
|
-
"config": [
|
|
50
|
-
"dist/config.d.ts"
|
|
51
|
-
],
|
|
52
39
|
"runtime": [
|
|
53
40
|
"dist/runtime-entry.d.ts"
|
|
54
41
|
]
|
|
@@ -67,7 +54,7 @@
|
|
|
67
54
|
"docs/P5-vite7-8兼容矩阵.md"
|
|
68
55
|
],
|
|
69
56
|
"scripts": {
|
|
70
|
-
"build": "cp ../../README.md README.md && mkdir -p docs && cp ../../docs/迁移指南.md ../../docs/webpack-mf-对照与缺口.md ../../docs/沙箱边界审计.md ../../docs/P5-vite7-8兼容矩阵.md docs/ && cp ../../CHANGELOG.md CHANGELOG.md && cp ../../DESIGN.md DESIGN.md && rm -rf examples && cp -r ../../examples examples && esbuild src/runtime/index.ts --bundle --format=esm --target=es2022 --minify --outfile=dist/runtime.js && node scripts/gen-runtime.mjs && tsup src/index.ts src/pages.ts src/
|
|
57
|
+
"build": "cp ../../README.md README.md && mkdir -p docs && cp ../../docs/迁移指南.md ../../docs/webpack-mf-对照与缺口.md ../../docs/沙箱边界审计.md ../../docs/P5-vite7-8兼容矩阵.md docs/ && cp ../../CHANGELOG.md CHANGELOG.md && cp ../../DESIGN.md DESIGN.md && rm -rf examples && cp -r ../../examples examples && esbuild src/runtime/index.ts --bundle --format=esm --target=es2022 --minify --outfile=dist/runtime.js && node scripts/gen-runtime.mjs && tsup src/index.ts src/pages.ts src/vue-adapter.ts src/context.ts --format esm,cjs --dts --external vite --target node18 --clean && tsup src/runtime-entry.ts --format esm --dts --external vite,vue --target node18 && esbuild src/cli.ts --bundle --format=esm --target=node18 --platform=node --outfile=dist/cli.js && esbuild src/runtime/index.ts --bundle --format=esm --target=es2022 --minify --outfile=dist/runtime.js && node scripts/gen-runtime-entry.mjs && node scripts/check-gzip.mjs && node scripts/check-manual-codes.mjs",
|
|
71
58
|
"dev": "tsup --watch",
|
|
72
59
|
"test": "vitest run",
|
|
73
60
|
"typecheck": "tsc --noEmit",
|
package/dist/chunk-AD2XIMBJ.js
DELETED
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
definePages
|
|
3
|
-
} from "./chunk-TSXZ7TWA.js";
|
|
4
|
-
|
|
5
|
-
// src/vue-adapter.ts
|
|
6
|
-
import { defineAsyncComponent, defineComponent, h } from "vue";
|
|
7
|
-
var ERROR_STYLE = {
|
|
8
|
-
padding: "16px",
|
|
9
|
-
border: "1px solid #fde2e2",
|
|
10
|
-
borderRadius: "4px",
|
|
11
|
-
background: "#fef0f0",
|
|
12
|
-
color: "#c45656",
|
|
13
|
-
fontSize: "13px",
|
|
14
|
-
lineHeight: "1.6"
|
|
15
|
-
};
|
|
16
|
-
var RemoteErrorPlaceholder = defineComponent({
|
|
17
|
-
name: "FulgurjsRemoteError",
|
|
18
|
-
props: { error: { type: Object, default: void 0 } },
|
|
19
|
-
setup(props) {
|
|
20
|
-
return () => {
|
|
21
|
-
const err = props.error;
|
|
22
|
-
const code = err?.code ?? "UNKNOWN";
|
|
23
|
-
const message = err?.message ?? String(props.error ?? "unknown error");
|
|
24
|
-
return h("div", { style: ERROR_STYLE }, [
|
|
25
|
-
h("p", { style: "margin:0 0 4px;font-weight:600" }, `\u8FDC\u7A0B\u7EC4\u4EF6\u52A0\u8F7D\u5931\u8D25\uFF08\u9519\u8BEF\u7801 ${code}\uFF09`),
|
|
26
|
-
h("p", { style: "margin:0 0 8px;word-break:break-all" }, message),
|
|
27
|
-
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")
|
|
28
|
-
]);
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
});
|
|
32
|
-
function createRemoteComponent(loadRemote) {
|
|
33
|
-
return function remoteComponent(spec, opts = {}) {
|
|
34
|
-
return defineAsyncComponent({
|
|
35
|
-
loader: () => loadRemote(spec, { retries: opts.retries }).then((m) => m.default ?? m),
|
|
36
|
-
loadingComponent: opts.loadingComponent,
|
|
37
|
-
errorComponent: opts.errorComponent ?? RemoteErrorPlaceholder,
|
|
38
|
-
delay: opts.delay,
|
|
39
|
-
timeout: opts.timeout
|
|
40
|
-
});
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
var cleanCompName = (spec) => "Fulgurjs_" + spec.replace(/[^A-Za-z0-9_-]/g, "_");
|
|
44
|
-
function defaultDeriveSpec(route) {
|
|
45
|
-
return route.split("/").filter(Boolean).slice(1).filter((seg) => !seg.startsWith(":")).join("/");
|
|
46
|
-
}
|
|
47
|
-
function createHostPages(options, load) {
|
|
48
|
-
const { pages, remotePrefixes, deriveSpec, schema, strict, base, beforeLoad, loadingComponent, errorComponent, delay } = options;
|
|
49
|
-
definePages(pages, { deriveSpec, remotes: remotePrefixes, schema, strict });
|
|
50
|
-
const prefixes = Object.entries(remotePrefixes).map(([p, name]) => [p.endsWith("/") ? p : `${p}/`, name]).sort((a, b) => b[0].length - a[0].length);
|
|
51
|
-
const remoteOf = (route) => {
|
|
52
|
-
for (const [prefix, name] of prefixes) {
|
|
53
|
-
if (route.startsWith(prefix) || `${route}/` === prefix) return name;
|
|
54
|
-
}
|
|
55
|
-
throw new Error(
|
|
56
|
-
`[fulgurjs] page route "${route}" matches none of remotePrefixes { ${Object.entries(remotePrefixes).map(([k, v]) => `'${k}': '${v}'`).join(", ")} }
|
|
57
|
-
\u6839\u56E0: \u9875\u9762\u8868\u6761\u76EE\u7684\u8DEF\u7531\u4E0D\u5728\u4EFB\u4F55\u5DF2\u58F0\u660E\u7684\u8FDC\u7A0B\u524D\u7F00\u4E0B\u3002
|
|
58
|
-
\u4FEE\u6CD5: \u5728 remotePrefixes \u8865\u5145\u8BE5\u8DEF\u7531\u524D\u7F00 \u2192 \u8FDC\u7A0B\u540D\u7684\u6620\u5C04\uFF0C\u6216\u4FEE\u6B63\u9875\u9762\u8868 route\u3002`
|
|
59
|
-
);
|
|
60
|
-
};
|
|
61
|
-
for (const page of pages) remoteOf(page.route);
|
|
62
|
-
const specOf = (page) => {
|
|
63
|
-
const s = page.spec ?? (deriveSpec ? deriveSpec(page.route) : defaultDeriveSpec(page.route));
|
|
64
|
-
return `${remoteOf(page.route)}/${String(s).replace(/^[./]+/, "")}`;
|
|
65
|
-
};
|
|
66
|
-
const baseNorm = base && base !== "/" ? base.endsWith("/") ? base : `${base}/` : "";
|
|
67
|
-
const matchSegments = (pattern, path) => {
|
|
68
|
-
const patSegs = pattern.split("/").filter(Boolean);
|
|
69
|
-
const pathSegs = path.split("/").filter(Boolean);
|
|
70
|
-
if (patSegs.length !== pathSegs.length) return null;
|
|
71
|
-
const params = {};
|
|
72
|
-
for (let i = 0; i < patSegs.length; i++) {
|
|
73
|
-
const seg = patSegs[i];
|
|
74
|
-
if (seg.startsWith(":")) {
|
|
75
|
-
try {
|
|
76
|
-
params[seg.slice(1)] = decodeURIComponent(pathSegs[i]);
|
|
77
|
-
} catch {
|
|
78
|
-
return null;
|
|
79
|
-
}
|
|
80
|
-
} else if (seg !== pathSegs[i]) {
|
|
81
|
-
return null;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
return params;
|
|
85
|
-
};
|
|
86
|
-
let cacheSession;
|
|
87
|
-
const compCache = /* @__PURE__ */ new Map();
|
|
88
|
-
const resolve = (rawPath) => {
|
|
89
|
-
let clean = String(rawPath ?? "");
|
|
90
|
-
if (baseNorm) {
|
|
91
|
-
if (clean === baseNorm.replace(/\/$/, "")) clean = "/";
|
|
92
|
-
else if (clean.startsWith(baseNorm)) clean = `/${clean.slice(baseNorm.length)}`;
|
|
93
|
-
}
|
|
94
|
-
clean = (clean.replace(/\/+$/, "") || "/").split("?")[0].split("#")[0];
|
|
95
|
-
for (const page of pages) {
|
|
96
|
-
const params = matchSegments(page.route, clean);
|
|
97
|
-
if (params) return { page, remote: remoteOf(page.route), spec: specOf(page), params };
|
|
98
|
-
}
|
|
99
|
-
return null;
|
|
100
|
-
};
|
|
101
|
-
const component = (spec) => {
|
|
102
|
-
const sk = (globalThis.__FULGURJS_APP_CONFIG__ ?? {}).sessionKey;
|
|
103
|
-
const sessionKey = typeof sk === "string" && sk !== "" ? sk : void 0;
|
|
104
|
-
if (sessionKey !== void 0 && sessionKey !== cacheSession) {
|
|
105
|
-
compCache.clear();
|
|
106
|
-
cacheSession = sessionKey;
|
|
107
|
-
}
|
|
108
|
-
let comp = compCache.get(spec);
|
|
109
|
-
if (!comp) {
|
|
110
|
-
const name = cleanCompName(spec);
|
|
111
|
-
const asyncComp = defineAsyncComponent({
|
|
112
|
-
loader: async () => {
|
|
113
|
-
await beforeLoad?.();
|
|
114
|
-
const mod = await load(spec);
|
|
115
|
-
const inner = mod?.default ?? mod;
|
|
116
|
-
if (!inner) {
|
|
117
|
-
throw new Error(
|
|
118
|
-
`[fulgurjs] remote module "${spec}" did not export a component (got ${inner === null ? "null" : typeof inner})\u3002
|
|
119
|
-
\u4FEE\u6CD5: \u6838\u5BF9\u8FDC\u7A0B exposes \u952E\u540D\u4E0E\u9875\u9762\u8868 spec \u662F\u5426\u4E00\u81F4\uFF08MFU-006 \u8BED\u4E49\uFF09`
|
|
120
|
-
);
|
|
121
|
-
}
|
|
122
|
-
return inner;
|
|
123
|
-
},
|
|
124
|
-
loadingComponent,
|
|
125
|
-
errorComponent: errorComponent ?? RemoteErrorPlaceholder,
|
|
126
|
-
delay
|
|
127
|
-
});
|
|
128
|
-
asyncComp.name = name;
|
|
129
|
-
comp = asyncComp;
|
|
130
|
-
compCache.set(spec, comp);
|
|
131
|
-
}
|
|
132
|
-
return comp;
|
|
133
|
-
};
|
|
134
|
-
const keepAliveNames = pages.filter((p) => p.keepAlive).map((p) => cleanCompName(specOf(p)));
|
|
135
|
-
return { pages, resolve, component, keepAliveNames };
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
export {
|
|
139
|
-
createRemoteComponent,
|
|
140
|
-
createHostPages
|
|
141
|
-
};
|
package/dist/chunk-FMV5BXGS.js
DELETED
package/dist/chunk-WBCXLR2N.js
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
// src/runtime/errors.ts
|
|
2
|
-
var FgError = class extends Error {
|
|
3
|
-
code;
|
|
4
|
-
details;
|
|
5
|
-
constructor(code, message, details) {
|
|
6
|
-
super(`[fulgurjs:${code}] ${message}`);
|
|
7
|
-
this.name = "FgError";
|
|
8
|
-
this.code = code;
|
|
9
|
-
this.details = details;
|
|
10
|
-
}
|
|
11
|
-
};
|
|
12
|
-
var ErrorCodes = {
|
|
13
|
-
/** 远程容器加载失败(网络/超时/重试耗尽/熔断) */
|
|
14
|
-
REMOTE_LOAD_FAILED: "MFU-001",
|
|
15
|
-
/** remoteEntry 自报名与 remotes 配置的名称不匹配 */
|
|
16
|
-
REMOTE_NAME_MISMATCH: "MFU-002",
|
|
17
|
-
/** strictVersion 开启且共享版本不满足 */
|
|
18
|
-
SHARE_STRICT_VERSION: "MFU-003",
|
|
19
|
-
/** 共享模块缺失且无本地 fallback(import: false) */
|
|
20
|
-
SHARE_NOT_AVAILABLE: "MFU-004",
|
|
21
|
-
/** 同一容器用不同 share scope 重复 init */
|
|
22
|
-
CONTAINER_REINIT_CONFLICT: "MFU-005",
|
|
23
|
-
/** 请求的模块未被该远程 exposes */
|
|
24
|
-
MODULE_NOT_EXPOSED: "MFU-006",
|
|
25
|
-
/** 预加载失败 */
|
|
26
|
-
PRELOAD_FAILED: "MFU-007",
|
|
27
|
-
/** 未知远程 */
|
|
28
|
-
REMOTE_UNKNOWN: "MFU-008",
|
|
29
|
-
/** 加载到的模块没有任何导出(常见:exposes 指向了不导出内容的文件) */
|
|
30
|
-
EMPTY_EXPORTS: "MFU-009",
|
|
31
|
-
/** singleton 共享协商版本与消费方 requiredVersion 不一致(使用作用域版本,仅告警) */
|
|
32
|
-
SINGLETON_SKEW: "MFU-010",
|
|
33
|
-
/** setup 生命周期入口导出形态非法(默认导出不是函数,或具名 onSession 不是函数) */
|
|
34
|
-
SETUP_INVALID_EXPORT: "MFU-011",
|
|
35
|
-
/** setup/onSession 执行抛错(该次 loadRemote 拒绝;仅清失败阶段缓存,允许重试) */
|
|
36
|
-
SETUP_RUN_FAILED: "MFU-012",
|
|
37
|
-
/** 远程声明了 onSession 但宿主 AppContext 未提供 sessionKey(登录代次) */
|
|
38
|
-
SETUP_SESSION_KEY_MISSING: "MFU-013",
|
|
39
|
-
/** setup/onSession 执行的同步段内递归 loadRemote 同一远程 */
|
|
40
|
-
SETUP_RECURSION: "MFU-014"
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
export {
|
|
44
|
-
FgError,
|
|
45
|
-
ErrorCodes
|
|
46
|
-
};
|