@fulgurjs/federation 5.0.4 → 5.1.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 +9 -0
- package/DESIGN.md +11 -0
- package/README.en.md +441 -0
- package/README.md +116 -3
- package/dist/chunk-4PLNAYZX.js +84 -0
- package/dist/cli.js +4 -1
- package/dist/host-pages-core-BFxp-IOj.d.cts +37 -0
- package/dist/host-pages-core-DLfMeDrO.d.ts +37 -0
- package/dist/index.cjs +132 -22
- package/dist/index.js +132 -22
- package/dist/react-adapter.cjs +518 -0
- package/dist/react-adapter.d.cts +117 -0
- package/dist/react-adapter.d.ts +117 -0
- package/dist/react-adapter.js +292 -0
- package/dist/react.d.ts +442 -0
- package/dist/react.js +10 -0
- package/dist/runtime-entry.d.ts +29 -17
- package/dist/runtime.js +13 -13
- package/dist/vue-adapter.cjs +66 -50
- package/dist/vue-adapter.d.cts +4 -25
- package/dist/vue-adapter.d.ts +4 -25
- package/dist/vue-adapter.js +14 -66
- package/examples/README.md +5 -0
- package/examples/react-host/README.md +28 -0
- package/examples/react-host/fulgurjs.config.ts +19 -0
- package/examples/react-host/index.html +11 -0
- package/examples/react-host/package.json +23 -0
- package/examples/react-host/src/App.tsx +66 -0
- package/examples/react-host/src/federation/pages.data.ts +19 -0
- package/examples/react-host/src/main.tsx +8 -0
- package/examples/react-host/tsconfig.json +14 -0
- package/examples/react-host/vite.config.ts +8 -0
- package/examples/react-remote/fulgurjs.config.ts +17 -0
- package/examples/react-remote/index.html +11 -0
- package/examples/react-remote/package.json +22 -0
- package/examples/react-remote/src/Button.tsx +15 -0
- package/examples/react-remote/src/main.tsx +6 -0
- package/examples/react-remote/src/pages/Detail.tsx +10 -0
- package/examples/react-remote/src/pages/Home.tsx +14 -0
- package/examples/react-remote/src/utils.ts +3 -0
- package/examples/react-remote/tsconfig.json +14 -0
- package/examples/react-remote/vite.config.ts +8 -0
- package/package.json +30 -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(
|
|
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 g=a[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(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 g=Se(c);if(g===null)return!0;for(let y of g)if(!Pe(o,a,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(a){let c=[],l=a.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(a,c){let l=we(c);if(!l)return null;let{ver:o,partial:g}=l;switch(a){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(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=[],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(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 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&&a.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.1.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,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)}},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 ${
|
|
4
|
-
\u539F\u56E0\uFF1A\u9ED8\u8BA4\u5BFC\u51FA\u7C7B\u578B\u4E3A ${
|
|
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(
|
|
6
|
-
\u539F\u56E0\uFF1AonSession \u5BFC\u51FA\u7C7B\u578B\u4E3A ${typeof
|
|
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});
|
|
8
|
-
\u539F\u56E0\uFF1A\u5F53\u524D\u503C\u4E3A ${
|
|
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===
|
|
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
|
|
4
|
+
\u539F\u56E0\uFF1A\u9ED8\u8BA4\u5BFC\u51FA\u7C7B\u578B\u4E3A ${i==null?String(i):typeof n}\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(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
|
+
\u539F\u56E0\uFF1AonSession \u5BFC\u51FA\u7C7B\u578B\u4E3A ${typeof i.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});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
|
+
\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)),d;if(r.singleton&&u.length>0){let f=u.filter(m=>n[m].loaded);if(d=[...f.length?f:u].sort(O).pop(),!h.includes(d)){let m=n[d],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
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
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:
|
|
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??"*"}|${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 "${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
|
-
\u4FEE\u6CD5\uFF1A\u7EDF\u4E00\u5BBF\u4E3B\u4E0E\u8FDC\u7A0B\u7684\u4F9D\u8D56\u7248\u672C\uFF0C\u6216\u4FEE\u6B63 shared.requiredVersion\u3002`);throw
|
|
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:
|
|
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[d];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,d=r?.retries??e.retries??z;for(let f of n){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
17
|
\u539F\u56E0\uFF1A${String(p?.message??p)}
|
|
18
18
|
\u4FEE\u6CD5\uFF1A
|
|
19
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(
|
|
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:
|
|
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}`;g.has(u)||g.set(u,n.get(s).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 "${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 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: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=(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"&&n==="preload"?w.get(f)??Promise.resolve():Promise.resolve();let m=document.createElement("link");m.rel=R==="style"?"stylesheet":"modulepreload",m.href=d,n==="prefetch"&&(m.fetchPriority="low");let v=R==="style"?u(m,d):Promise.resolve();return document.head.appendChild(m),R==="style"&&n==="preload"?v:Promise.resolve()},h=d=>{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(d,f).href};try{if(i.manifestUrl){let d=y.get(i.manifestUrl);d||(d=fetch(i.manifestUrl,{cache:"no-cache",signal:AbortSignal.timeout(8e3)}).then(f=>f.ok?f.json():void 0),y.set(i.manifestUrl,d),d.then(f=>{f||y.delete(i.manifestUrl)},()=>y.delete(i.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(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(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__=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
|
@@ -166,49 +166,26 @@ function definePages(pages, options = {}) {
|
|
|
166
166
|
return pages;
|
|
167
167
|
}
|
|
168
168
|
|
|
169
|
-
// src/
|
|
170
|
-
var ERROR_STYLE = {
|
|
171
|
-
padding: "16px",
|
|
172
|
-
border: "1px solid #fde2e2",
|
|
173
|
-
borderRadius: "4px",
|
|
174
|
-
background: "#fef0f0",
|
|
175
|
-
color: "#c45656",
|
|
176
|
-
fontSize: "13px",
|
|
177
|
-
lineHeight: "1.6"
|
|
178
|
-
};
|
|
179
|
-
var RemoteErrorPlaceholder = (0, import_vue.defineComponent)({
|
|
180
|
-
name: "FulgurjsRemoteError",
|
|
181
|
-
props: { error: { type: Object, default: void 0 } },
|
|
182
|
-
setup(props) {
|
|
183
|
-
return () => {
|
|
184
|
-
const err = props.error;
|
|
185
|
-
const code = err?.code ?? "UNKNOWN";
|
|
186
|
-
const message = err?.message ?? String(props.error ?? "unknown error");
|
|
187
|
-
return (0, import_vue.h)("div", { style: ERROR_STYLE }, [
|
|
188
|
-
(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`),
|
|
189
|
-
(0, import_vue.h)("p", { style: "margin:0 0 8px;word-break:break-all" }, message),
|
|
190
|
-
(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")
|
|
191
|
-
]);
|
|
192
|
-
};
|
|
193
|
-
}
|
|
194
|
-
});
|
|
195
|
-
function createRemoteComponent(loadRemote) {
|
|
196
|
-
return function remoteComponent(spec, opts = {}) {
|
|
197
|
-
return (0, import_vue.defineAsyncComponent)({
|
|
198
|
-
loader: () => loadRemote(spec, { retries: opts.retries }).then((m) => m.default ?? m),
|
|
199
|
-
loadingComponent: opts.loadingComponent,
|
|
200
|
-
errorComponent: opts.errorComponent ?? RemoteErrorPlaceholder,
|
|
201
|
-
delay: opts.delay,
|
|
202
|
-
timeout: opts.timeout
|
|
203
|
-
});
|
|
204
|
-
};
|
|
205
|
-
}
|
|
169
|
+
// src/host-pages-core.ts
|
|
206
170
|
var cleanCompName = (spec) => "Fulgurjs_" + spec.replace(/[^A-Za-z0-9_-]/g, "_");
|
|
207
171
|
function defaultDeriveSpec2(route) {
|
|
208
172
|
return route.split("/").filter(Boolean).slice(1).filter((seg) => !seg.startsWith(":")).join("/");
|
|
209
173
|
}
|
|
210
|
-
function
|
|
211
|
-
const
|
|
174
|
+
function readSessionKey() {
|
|
175
|
+
const sk = (globalThis.__FULGURJS_APP_CONFIG__ ?? {}).sessionKey;
|
|
176
|
+
return typeof sk === "string" && sk !== "" ? sk : void 0;
|
|
177
|
+
}
|
|
178
|
+
function shouldResetSessionCache(sessionKey, cached) {
|
|
179
|
+
return sessionKey !== void 0 && sessionKey !== cached;
|
|
180
|
+
}
|
|
181
|
+
function noRenderableExportError(spec, inner) {
|
|
182
|
+
return new Error(
|
|
183
|
+
`[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
|
|
184
|
+
\u4FEE\u6CD5: \u6838\u5BF9\u8FDC\u7A0B exposes \u952E\u540D\u4E0E\u9875\u9762\u8868 spec \u662F\u5426\u4E00\u81F4\uFF08MFU-006 \u8BED\u4E49\uFF09`
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
function createHostPagesCore(options) {
|
|
188
|
+
const { pages, remotePrefixes, deriveSpec, schema, strict, base } = options;
|
|
212
189
|
definePages(pages, { deriveSpec, remotes: remotePrefixes, schema, strict });
|
|
213
190
|
const prefixes = Object.entries(remotePrefixes).map(([p, name]) => [p.endsWith("/") ? p : `${p}/`, name]).sort((a, b) => b[0].length - a[0].length);
|
|
214
191
|
const remoteOf = (route) => {
|
|
@@ -246,8 +223,6 @@ function createHostPages(options, load) {
|
|
|
246
223
|
}
|
|
247
224
|
return params;
|
|
248
225
|
};
|
|
249
|
-
let cacheSession;
|
|
250
|
-
const compCache = /* @__PURE__ */ new Map();
|
|
251
226
|
const resolve = (rawPath) => {
|
|
252
227
|
let clean = String(rawPath ?? "");
|
|
253
228
|
if (baseNorm) {
|
|
@@ -261,10 +236,54 @@ function createHostPages(options, load) {
|
|
|
261
236
|
}
|
|
262
237
|
return null;
|
|
263
238
|
};
|
|
239
|
+
return { pages, resolve, remoteOf, specOf };
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// src/vue-adapter.ts
|
|
243
|
+
var ERROR_STYLE = {
|
|
244
|
+
padding: "16px",
|
|
245
|
+
border: "1px solid #fde2e2",
|
|
246
|
+
borderRadius: "4px",
|
|
247
|
+
background: "#fef0f0",
|
|
248
|
+
color: "#c45656",
|
|
249
|
+
fontSize: "13px",
|
|
250
|
+
lineHeight: "1.6"
|
|
251
|
+
};
|
|
252
|
+
var RemoteErrorPlaceholder = (0, import_vue.defineComponent)({
|
|
253
|
+
name: "FulgurjsRemoteError",
|
|
254
|
+
props: { error: { type: Object, default: void 0 } },
|
|
255
|
+
setup(props) {
|
|
256
|
+
return () => {
|
|
257
|
+
const err = props.error;
|
|
258
|
+
const code = err?.code ?? "UNKNOWN";
|
|
259
|
+
const message = err?.message ?? String(props.error ?? "unknown error");
|
|
260
|
+
return (0, import_vue.h)("div", { style: ERROR_STYLE }, [
|
|
261
|
+
(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
|
+
(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")
|
|
264
|
+
]);
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
});
|
|
268
|
+
function createRemoteComponent(loadRemote) {
|
|
269
|
+
return function remoteComponent(spec, opts = {}) {
|
|
270
|
+
return (0, import_vue.defineAsyncComponent)({
|
|
271
|
+
loader: () => loadRemote(spec, { retries: opts.retries }).then((m) => m.default ?? m),
|
|
272
|
+
loadingComponent: opts.loadingComponent,
|
|
273
|
+
errorComponent: opts.errorComponent ?? RemoteErrorPlaceholder,
|
|
274
|
+
delay: opts.delay,
|
|
275
|
+
timeout: opts.timeout
|
|
276
|
+
});
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
function createHostPages(options, load) {
|
|
280
|
+
const { beforeLoad, loadingComponent, errorComponent, delay } = options;
|
|
281
|
+
const core = createHostPagesCore(options);
|
|
282
|
+
let cacheSession;
|
|
283
|
+
const compCache = /* @__PURE__ */ new Map();
|
|
264
284
|
const component = (spec) => {
|
|
265
|
-
const
|
|
266
|
-
|
|
267
|
-
if (sessionKey !== void 0 && sessionKey !== cacheSession) {
|
|
285
|
+
const sessionKey = readSessionKey();
|
|
286
|
+
if (shouldResetSessionCache(sessionKey, cacheSession)) {
|
|
268
287
|
compCache.clear();
|
|
269
288
|
cacheSession = sessionKey;
|
|
270
289
|
}
|
|
@@ -277,10 +296,7 @@ function createHostPages(options, load) {
|
|
|
277
296
|
const mod = await load(spec);
|
|
278
297
|
const inner = mod?.default ?? mod;
|
|
279
298
|
if (!inner) {
|
|
280
|
-
throw
|
|
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
|
-
\u4FEE\u6CD5: \u6838\u5BF9\u8FDC\u7A0B exposes \u952E\u540D\u4E0E\u9875\u9762\u8868 spec \u662F\u5426\u4E00\u81F4\uFF08MFU-006 \u8BED\u4E49\uFF09`
|
|
283
|
-
);
|
|
299
|
+
throw noRenderableExportError(spec, inner);
|
|
284
300
|
}
|
|
285
301
|
return inner;
|
|
286
302
|
},
|
|
@@ -294,8 +310,8 @@ function createHostPages(options, load) {
|
|
|
294
310
|
}
|
|
295
311
|
return comp;
|
|
296
312
|
};
|
|
297
|
-
const keepAliveNames = pages.filter((p) => p.keepAlive).map((p) => cleanCompName(specOf(p)));
|
|
298
|
-
return { pages, resolve, component, keepAliveNames };
|
|
313
|
+
const keepAliveNames = core.pages.filter((p) => p.keepAlive).map((p) => cleanCompName(core.specOf(p)));
|
|
314
|
+
return { pages: core.pages, resolve: core.resolve, component, keepAliveNames };
|
|
299
315
|
}
|
|
300
316
|
// Annotate the CommonJS export names for ESM import in node:
|
|
301
317
|
0 && (module.exports = {
|
package/dist/vue-adapter.d.cts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Component } from 'vue';
|
|
2
|
-
import { PageRouteLike
|
|
2
|
+
import { PageRouteLike } from './pages.cjs';
|
|
3
|
+
import { R as ResolvedHostPage, H as HostPagesCoreOptions } from './host-pages-core-BFxp-IOj.cjs';
|
|
3
4
|
|
|
4
5
|
/** Vue 适配层只接收加载函数,不静态引用运行时内核。 */
|
|
5
6
|
|
|
@@ -13,19 +14,7 @@ interface RemoteComponentOptions {
|
|
|
13
14
|
declare function createRemoteComponent(loadRemote: (spec: string, opts?: {
|
|
14
15
|
retries?: number;
|
|
15
16
|
}) => Promise<any>): (spec: string, opts?: RemoteComponentOptions) => Component;
|
|
16
|
-
interface HostPagesOptions {
|
|
17
|
-
/** 页面表(宿主路由与布局共用的唯一数据源;definePages R1–R5 校验照常执行) */
|
|
18
|
-
pages: PageRouteLike[];
|
|
19
|
-
/** 路由前缀 → remote 名(最长前缀匹配;页面路由无匹配前缀时创建期即报错) */
|
|
20
|
-
remotePrefixes: Record<string, string>;
|
|
21
|
-
/** 缺省 spec 推导(缺省 = 去首段前缀 + 剥 :参数 段,同 definePages 默认) */
|
|
22
|
-
deriveSpec?: (route: string) => string;
|
|
23
|
-
/** 远程 exposes 清单(dev 由 remoteSchema 提供;build 为空表时按语义诚实降级) */
|
|
24
|
-
schema?: Record<string, RemoteSchemaEntry>;
|
|
25
|
-
/** ERROR 级校验失败是否 throw(默认 true) */
|
|
26
|
-
strict?: boolean;
|
|
27
|
-
/** 站点 base 前缀(如 '/main'):resolve 时先剥离再匹配路由空间 */
|
|
28
|
-
base?: string;
|
|
17
|
+
interface HostPagesOptions extends HostPagesCoreOptions {
|
|
29
18
|
/** 每次页面模块实际加载前执行(同步或异步);宿主在此提供最新 context */
|
|
30
19
|
beforeLoad?: () => void | Promise<void>;
|
|
31
20
|
/** 加载期占位组件(骨架屏) */
|
|
@@ -35,16 +24,6 @@ interface HostPagesOptions {
|
|
|
35
24
|
/** 骨架屏延迟 ms(默认 200,防闪) */
|
|
36
25
|
delay?: number;
|
|
37
26
|
}
|
|
38
|
-
interface ResolvedHostPage {
|
|
39
|
-
/** 原页面记录(含宿主自由扩展字段 name/title/keepAlive/...) */
|
|
40
|
-
page: PageRouteLike;
|
|
41
|
-
/** 命中的 remote 名 */
|
|
42
|
-
remote: string;
|
|
43
|
-
/** 完整加载 spec(`<remote>/<exposes 键>`,loadRemote 直用) */
|
|
44
|
-
spec: string;
|
|
45
|
-
/** 路径参数(解码失败只让该次匹配失败,不让页面初始化崩溃) */
|
|
46
|
-
params: Record<string, string>;
|
|
47
|
-
}
|
|
48
27
|
interface HostPages {
|
|
49
28
|
/** 原页面记录 */
|
|
50
29
|
pages: PageRouteLike[];
|
|
@@ -59,4 +38,4 @@ declare function createHostPages(options: HostPagesOptions, load: (spec: string,
|
|
|
59
38
|
retries?: number;
|
|
60
39
|
}) => Promise<any>): HostPages;
|
|
61
40
|
|
|
62
|
-
export { type HostPages, type HostPagesOptions, type RemoteComponentOptions,
|
|
41
|
+
export { type HostPages, type HostPagesOptions, type RemoteComponentOptions, ResolvedHostPage, createHostPages, createRemoteComponent };
|
package/dist/vue-adapter.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Component } from 'vue';
|
|
2
|
-
import { PageRouteLike
|
|
2
|
+
import { PageRouteLike } from './pages.js';
|
|
3
|
+
import { R as ResolvedHostPage, H as HostPagesCoreOptions } from './host-pages-core-DLfMeDrO.js';
|
|
3
4
|
|
|
4
5
|
/** Vue 适配层只接收加载函数,不静态引用运行时内核。 */
|
|
5
6
|
|
|
@@ -13,19 +14,7 @@ interface RemoteComponentOptions {
|
|
|
13
14
|
declare function createRemoteComponent(loadRemote: (spec: string, opts?: {
|
|
14
15
|
retries?: number;
|
|
15
16
|
}) => Promise<any>): (spec: string, opts?: RemoteComponentOptions) => Component;
|
|
16
|
-
interface HostPagesOptions {
|
|
17
|
-
/** 页面表(宿主路由与布局共用的唯一数据源;definePages R1–R5 校验照常执行) */
|
|
18
|
-
pages: PageRouteLike[];
|
|
19
|
-
/** 路由前缀 → remote 名(最长前缀匹配;页面路由无匹配前缀时创建期即报错) */
|
|
20
|
-
remotePrefixes: Record<string, string>;
|
|
21
|
-
/** 缺省 spec 推导(缺省 = 去首段前缀 + 剥 :参数 段,同 definePages 默认) */
|
|
22
|
-
deriveSpec?: (route: string) => string;
|
|
23
|
-
/** 远程 exposes 清单(dev 由 remoteSchema 提供;build 为空表时按语义诚实降级) */
|
|
24
|
-
schema?: Record<string, RemoteSchemaEntry>;
|
|
25
|
-
/** ERROR 级校验失败是否 throw(默认 true) */
|
|
26
|
-
strict?: boolean;
|
|
27
|
-
/** 站点 base 前缀(如 '/main'):resolve 时先剥离再匹配路由空间 */
|
|
28
|
-
base?: string;
|
|
17
|
+
interface HostPagesOptions extends HostPagesCoreOptions {
|
|
29
18
|
/** 每次页面模块实际加载前执行(同步或异步);宿主在此提供最新 context */
|
|
30
19
|
beforeLoad?: () => void | Promise<void>;
|
|
31
20
|
/** 加载期占位组件(骨架屏) */
|
|
@@ -35,16 +24,6 @@ interface HostPagesOptions {
|
|
|
35
24
|
/** 骨架屏延迟 ms(默认 200,防闪) */
|
|
36
25
|
delay?: number;
|
|
37
26
|
}
|
|
38
|
-
interface ResolvedHostPage {
|
|
39
|
-
/** 原页面记录(含宿主自由扩展字段 name/title/keepAlive/...) */
|
|
40
|
-
page: PageRouteLike;
|
|
41
|
-
/** 命中的 remote 名 */
|
|
42
|
-
remote: string;
|
|
43
|
-
/** 完整加载 spec(`<remote>/<exposes 键>`,loadRemote 直用) */
|
|
44
|
-
spec: string;
|
|
45
|
-
/** 路径参数(解码失败只让该次匹配失败,不让页面初始化崩溃) */
|
|
46
|
-
params: Record<string, string>;
|
|
47
|
-
}
|
|
48
27
|
interface HostPages {
|
|
49
28
|
/** 原页面记录 */
|
|
50
29
|
pages: PageRouteLike[];
|
|
@@ -59,4 +38,4 @@ declare function createHostPages(options: HostPagesOptions, load: (spec: string,
|
|
|
59
38
|
retries?: number;
|
|
60
39
|
}) => Promise<any>): HostPages;
|
|
61
40
|
|
|
62
|
-
export { type HostPages, type HostPagesOptions, type RemoteComponentOptions,
|
|
41
|
+
export { type HostPages, type HostPagesOptions, type RemoteComponentOptions, ResolvedHostPage, createHostPages, createRemoteComponent };
|
package/dist/vue-adapter.js
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
cleanCompName,
|
|
3
|
+
createHostPagesCore,
|
|
4
|
+
noRenderableExportError,
|
|
5
|
+
readSessionKey,
|
|
6
|
+
shouldResetSessionCache
|
|
7
|
+
} from "./chunk-4PLNAYZX.js";
|
|
8
|
+
import "./chunk-TSXZ7TWA.js";
|
|
4
9
|
|
|
5
10
|
// src/vue-adapter.ts
|
|
6
11
|
import { defineAsyncComponent, defineComponent, h } from "vue";
|
|
@@ -40,68 +45,14 @@ function createRemoteComponent(loadRemote) {
|
|
|
40
45
|
});
|
|
41
46
|
};
|
|
42
47
|
}
|
|
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
48
|
function createHostPages(options, load) {
|
|
48
|
-
const {
|
|
49
|
-
|
|
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
|
-
};
|
|
49
|
+
const { beforeLoad, loadingComponent, errorComponent, delay } = options;
|
|
50
|
+
const core = createHostPagesCore(options);
|
|
86
51
|
let cacheSession;
|
|
87
52
|
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
53
|
const component = (spec) => {
|
|
102
|
-
const
|
|
103
|
-
|
|
104
|
-
if (sessionKey !== void 0 && sessionKey !== cacheSession) {
|
|
54
|
+
const sessionKey = readSessionKey();
|
|
55
|
+
if (shouldResetSessionCache(sessionKey, cacheSession)) {
|
|
105
56
|
compCache.clear();
|
|
106
57
|
cacheSession = sessionKey;
|
|
107
58
|
}
|
|
@@ -114,10 +65,7 @@ function createHostPages(options, load) {
|
|
|
114
65
|
const mod = await load(spec);
|
|
115
66
|
const inner = mod?.default ?? mod;
|
|
116
67
|
if (!inner) {
|
|
117
|
-
throw
|
|
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
|
-
);
|
|
68
|
+
throw noRenderableExportError(spec, inner);
|
|
121
69
|
}
|
|
122
70
|
return inner;
|
|
123
71
|
},
|
|
@@ -131,8 +79,8 @@ function createHostPages(options, load) {
|
|
|
131
79
|
}
|
|
132
80
|
return comp;
|
|
133
81
|
};
|
|
134
|
-
const keepAliveNames = pages.filter((p) => p.keepAlive).map((p) => cleanCompName(specOf(p)));
|
|
135
|
-
return { pages, resolve, component, keepAliveNames };
|
|
82
|
+
const keepAliveNames = core.pages.filter((p) => p.keepAlive).map((p) => cleanCompName(core.specOf(p)));
|
|
83
|
+
return { pages: core.pages, resolve: core.resolve, component, keepAliveNames };
|
|
136
84
|
}
|
|
137
85
|
export {
|
|
138
86
|
createHostPages,
|
package/examples/README.md
CHANGED
|
@@ -5,6 +5,11 @@
|
|
|
5
5
|
- [`remote-a/fulgurjs.config.ts`](./remote-a/fulgurjs.config.ts) — 远程应用:exposes / setup / shared
|
|
6
6
|
- [`host/fulgurjs.config.ts`](./host/fulgurjs.config.ts) — 宿主应用:remotes 消费地址 + 可选 `hostPages` 页面核对数据(仅供 CLI)
|
|
7
7
|
|
|
8
|
+
React 完整可运行工程(5.1.0 起,npm registry 安装即跑,区别于上面两个「配置样例」目录):
|
|
9
|
+
|
|
10
|
+
- [`react-remote/`](./react-remote) — React 远程(5203):Button/utils/pages expose + shared react/react-dom singleton
|
|
11
|
+
- [`react-host/`](./react-host) — React 宿主(5204):`@fulgurjs/federation/react` 导入 + 页面表 + React Router;运行说明见其 README
|
|
12
|
+
|
|
8
13
|
复制方式:把对应文件整份复制到**你自己的项目根目录**(两个项目不共享配置文件、不共享父目录配置),再在各自 `vite.config.ts` 的 plugins 里加一次 `federation(fulgurjsConfig)`:
|
|
9
14
|
|
|
10
15
|
```ts
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# react-host / react-remote(React 宿主与远程示例)
|
|
2
|
+
|
|
3
|
+
独立可运行的 React 联邦工程:从 npm registry 安装正式版 `@fulgurjs/federation`(无 link:/workspace:/绝对路径依赖)。
|
|
4
|
+
|
|
5
|
+
## 运行
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# 终端 1:远程(5203)
|
|
9
|
+
cd react-remote && npm install && npm run dev
|
|
10
|
+
|
|
11
|
+
# 终端 2:宿主(5204)
|
|
12
|
+
cd react-host && npm install && npm run dev
|
|
13
|
+
# 打开 http://localhost:5204 —— 首页有远程按钮与 utils 模块,/remote-react/home 与 /remote-react/detail/42?tab=basic 是远程页面
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## 配置形态(每个应用两份文件)
|
|
17
|
+
|
|
18
|
+
- `fulgurjs.config.ts`:纯数据(FederationOptions)——`vite.config.ts` 调 `federation(fulgurjsConfig)`,`react()` 照常放 plugins。
|
|
19
|
+
- React 应用统一从 `@fulgurjs/federation/react` 导入(`remoteComponent` / `useLoadRemote` / `RemoteErrorBoundary` / `createReactHostPages` 与通用运行时 API)。
|
|
20
|
+
|
|
21
|
+
## CLI
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
npx fulgurjs explain # 解析联邦配置
|
|
25
|
+
npx fulgurjs check-pages # 校验页面表与线上 manifest(远程 dev server 启动时)
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
与 `fixtures/`(仓库内 e2e 回归夹具,用 `link:` 依赖本地插件)的区别:examples 面向使用者复制,依赖来自 registry。
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { FederationOptions } from '@fulgurjs/federation'
|
|
2
|
+
import { pages, remotePrefixes } from './src/federation/pages.data'
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
name: 'host-react',
|
|
6
|
+
remotes: {
|
|
7
|
+
'remote-react': {
|
|
8
|
+
dev: 'http://localhost:5203',
|
|
9
|
+
prod: '/remote-react/',
|
|
10
|
+
},
|
|
11
|
+
},
|
|
12
|
+
shared: {
|
|
13
|
+
react: { singleton: true },
|
|
14
|
+
'react-dom': { singleton: true },
|
|
15
|
+
},
|
|
16
|
+
} satisfies FederationOptions
|
|
17
|
+
|
|
18
|
+
/** 仅 CLI 读取(fulgurjs explain/check-pages);同一纯数据模块也供浏览器页面适配器使用 */
|
|
19
|
+
export const hostPages = { pages, remotePrefixes }
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "fulgurjs-example-react-host",
|
|
3
|
+
"private": true,
|
|
4
|
+
"type": "module",
|
|
5
|
+
"scripts": {
|
|
6
|
+
"dev": "vite --port 5204 --strictPort",
|
|
7
|
+
"build": "vite build",
|
|
8
|
+
"preview": "vite preview --port 5204 --strictPort"
|
|
9
|
+
},
|
|
10
|
+
"dependencies": {
|
|
11
|
+
"react": "^19.3.0",
|
|
12
|
+
"react-dom": "^19.3.0",
|
|
13
|
+
"react-router-dom": "^7.18.4"
|
|
14
|
+
},
|
|
15
|
+
"devDependencies": {
|
|
16
|
+
"@fulgurjs/federation": "^5.1.0",
|
|
17
|
+
"@types/react": "^19.3.0",
|
|
18
|
+
"@types/react-dom": "^19.3.0",
|
|
19
|
+
"@vitejs/plugin-react": "^5.2.0",
|
|
20
|
+
"typescript": "^5.8.0",
|
|
21
|
+
"vite": "^6.3.5"
|
|
22
|
+
}
|
|
23
|
+
}
|