@fulgurjs/federation 6.11.6 → 6.12.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 +13 -0
- package/README.en.md +2 -0
- package/README.md +3 -3
- package/dist/{application-core-DWI3eKme.d.ts → application-core-C72tVRT7.d.ts} +1 -1
- package/dist/{application-core-BuhXQmLF.d.cts → application-core-Coa0CIre.d.cts} +1 -1
- package/dist/bridge-app-react.d.cts +2 -2
- package/dist/bridge-app-react.d.ts +2 -2
- package/dist/bridge-app-react.js +1 -1
- package/dist/bridge-app-vue.d.cts +2 -2
- package/dist/bridge-app-vue.d.ts +2 -2
- package/dist/bridge-app-vue.js +1 -1
- package/dist/{bridge-core-77BT1__I.d.cts → bridge-core-CGFET9Qi.d.cts} +2 -1
- package/dist/{bridge-core-CoQRVgnZ.d.ts → bridge-core-Dm6ABUxQ.d.ts} +2 -1
- package/dist/bridge-core.cjs +4 -1
- package/dist/bridge-core.d.cts +1 -1
- package/dist/bridge-core.d.ts +1 -1
- package/dist/bridge-core.js +1 -1
- package/dist/bridge-host-react.cjs +4 -1
- package/dist/bridge-host-react.d.cts +2 -2
- package/dist/bridge-host-react.d.ts +2 -2
- package/dist/bridge-host-react.js +1 -1
- package/dist/bridge-host-vue.cjs +42 -5
- package/dist/bridge-host-vue.d.cts +12 -4
- package/dist/bridge-host-vue.d.ts +12 -4
- package/dist/bridge-host-vue.js +40 -5
- package/dist/bridge-session-auto.cjs +121 -0
- package/dist/bridge-session-auto.d.cts +21 -0
- package/dist/bridge-session-auto.d.ts +21 -0
- package/dist/bridge-session-auto.js +88 -0
- package/dist/{chunk-HDRZBSND.js → chunk-2MWIIRQZ.js} +4 -1
- package/dist/cli.js +67 -16
- package/dist/index.cjs +4 -3
- package/dist/index.js +4 -3
- package/dist/react-adapter.d.cts +2 -2
- package/dist/react-adapter.d.ts +2 -2
- package/dist/react.d.ts +2 -2
- package/dist/{remote-types-COmBhjRc.d.ts → remote-types-CMtfvLcH.d.ts} +1 -1
- package/dist/{remote-types-CStGOJwu.d.cts → remote-types-Cf4SSzus.d.cts} +1 -1
- package/dist/runtime-entry.d.ts +2 -2
- package/dist/runtime.js +13 -13
- package/dist/vue-adapter.d.cts +2 -2
- package/dist/vue-adapter.d.ts +2 -2
- package/dist/vue.d.ts +10 -3
- package/dist/vue.js +2 -1
- package/docs/en/reference/api.md +15 -4
- package/docs/en/reference/errors.md +1 -1
- package/docs/en/reference/types.md +4 -2
- package/docs/zh/reference/api.md +16 -6
- package/docs/zh/reference/errors.md +1 -1
- package/docs/zh/reference/types.md +4 -2
- package/examples/templates/README.md +5 -1
- package/examples/templates/react-host-vue-remote/README.md +2 -2
- package/examples/templates/react-host-vue-remote/react-host/src/{application.tsx → fulgurjs/host/application.tsx} +2 -1
- package/examples/templates/react-host-vue-remote/react-host/src/{host-session.ts → fulgurjs/host/session.ts} +1 -1
- package/examples/templates/react-host-vue-remote/react-host/src/main.tsx +1 -1
- package/examples/templates/react-host-vue-remote/vue-remote/README.md +2 -2
- package/examples/templates/react-host-vue-remote/vue-remote/fulgurjs.config.ts +1 -1
- package/examples/templates/react-host-vue-remote/vue-remote/src/App.vue +1 -1
- package/examples/templates/react-host-vue-remote/vue-remote/src/{application.ts → fulgurjs/exposes/application.ts} +4 -3
- package/examples/templates/react-host-vue-remote/vue-remote/src/main.ts +1 -1
- package/examples/templates/react-react/README.md +5 -5
- package/examples/templates/react-react/host/README.md +1 -1
- package/examples/templates/react-react/host/src/{application.tsx → fulgurjs/host/application.tsx} +3 -2
- package/examples/templates/react-react/host/src/{remotePages.tsx → fulgurjs/host/remotePages.tsx} +1 -1
- package/examples/templates/react-react/host/src/main.tsx +1 -1
- package/examples/templates/react-react/remote/README.md +4 -4
- package/examples/templates/react-react/remote/fulgurjs.config.ts +4 -4
- package/examples/templates/react-react/remote/src/App.tsx +1 -1
- package/examples/templates/react-react/remote/src/{application.tsx → fulgurjs/exposes/application.tsx} +2 -1
- package/examples/templates/react-react/remote/src/main.tsx +1 -1
- package/examples/templates/showcase/README.md +13 -13
- package/examples/templates/showcase/react-host/src/GuardBanner.tsx +2 -2
- package/examples/templates/showcase/react-host/src/Layout.tsx +1 -1
- package/examples/templates/showcase/react-host/src/ObsPanel.tsx +2 -2
- package/examples/templates/showcase/react-host/src/{pages → fulgurjs/host}/BridgeVuePage.tsx +4 -4
- package/examples/templates/showcase/react-host/src/{application.tsx → fulgurjs/host/application.tsx} +5 -4
- package/examples/templates/showcase/react-host/src/{demo-log.ts → fulgurjs/host/demo-log.ts} +1 -1
- package/examples/templates/showcase/react-host/src/{routing.ts → fulgurjs/host/routing.ts} +1 -1
- package/examples/templates/showcase/react-host/src/main.tsx +1 -1
- package/examples/templates/showcase/react-remote/fulgurjs.config.ts +1 -1
- package/examples/templates/showcase/react-remote/src/{application.tsx → fulgurjs/exposes/application.tsx} +7 -6
- package/examples/templates/showcase/react-remote/src/main.tsx +1 -1
- package/examples/templates/showcase/vue-host/src/App.vue +1 -1
- package/examples/templates/showcase/vue-host/src/GuardBanner.vue +1 -1
- package/examples/templates/showcase/vue-host/src/ObsPanel.vue +2 -2
- package/examples/templates/showcase/vue-host/src/{pages → fulgurjs/host}/BridgeReactPage.vue +4 -4
- package/examples/templates/showcase/vue-host/src/{application.ts → fulgurjs/host/application.ts} +5 -4
- package/examples/templates/showcase/vue-host/src/{demo-log.ts → fulgurjs/host/demo-log.ts} +1 -1
- package/examples/templates/showcase/vue-host/src/{guard.ts → fulgurjs/host/guard.ts} +1 -1
- package/examples/templates/showcase/vue-host/src/{routing.ts → fulgurjs/host/routing.ts} +1 -1
- package/examples/templates/showcase/vue-host/src/main.ts +1 -1
- package/examples/templates/showcase/vue-remote/fulgurjs.config.ts +1 -1
- package/examples/templates/showcase/vue-remote/src/{application.ts → fulgurjs/exposes/application.ts} +7 -6
- package/examples/templates/showcase/vue-remote/src/main.ts +1 -1
- package/examples/templates/vue-host-react-remote/README.md +2 -2
- package/examples/templates/vue-host-react-remote/react-remote/README.md +2 -2
- package/examples/templates/vue-host-react-remote/react-remote/fulgurjs.config.ts +1 -1
- package/examples/templates/vue-host-react-remote/react-remote/src/{application.tsx → fulgurjs/exposes/application.tsx} +1 -0
- package/examples/templates/vue-host-react-remote/react-remote/src/main.tsx +1 -1
- package/examples/templates/vue-host-react-remote/vue-host/README.md +1 -1
- package/examples/templates/vue-host-react-remote/vue-host/src/App.vue +1 -1
- package/examples/templates/vue-host-react-remote/vue-host/src/fulgurjs/host/application.ts +6 -0
- package/examples/templates/vue-host-react-remote/vue-host/src/main.ts +1 -1
- package/examples/templates/vue-vue/README.md +6 -6
- package/examples/templates/vue-vue/host/src/{application.ts → fulgurjs/host/application.ts} +5 -4
- package/examples/templates/vue-vue/host/src/main.ts +1 -1
- package/examples/templates/vue-vue/host/src/pages/UtilsDemo.vue +1 -1
- package/examples/templates/vue-vue/remote/README.md +4 -4
- package/examples/templates/vue-vue/remote/fulgurjs.config.ts +4 -4
- package/examples/templates/vue-vue/remote/src/App.vue +1 -1
- package/examples/templates/vue-vue/remote/src/{application.ts → fulgurjs/exposes/application.ts} +2 -1
- package/examples/templates/vue-vue/remote/src/main.ts +1 -1
- package/package.json +6 -2
- package/examples/templates/vue-host-react-remote/vue-host/src/application.ts +0 -5
- /package/examples/templates/react-react/remote/src/{exposes → fulgurjs/exposes}/ClickButton.tsx +0 -0
- /package/examples/templates/react-react/remote/src/{exposes → fulgurjs/exposes}/pages/DetailPage.tsx +0 -0
- /package/examples/templates/react-react/remote/src/{exposes → fulgurjs/exposes}/pages/HomePage.tsx +0 -0
- /package/examples/templates/react-react/remote/src/{exposes → fulgurjs/exposes}/utils.ts +0 -0
- /package/examples/templates/vue-host-react-remote/vue-host/src/{host-session.ts → fulgurjs/host/session.ts} +0 -0
- /package/examples/templates/vue-vue/host/src/{type-demo.ts → fulgurjs/host/type-demo.ts} +0 -0
- /package/examples/templates/vue-vue/remote/src/{exposes → fulgurjs/exposes}/ClickButton.vue +0 -0
- /package/examples/templates/vue-vue/remote/src/{exposes → fulgurjs/exposes}/pages/DetailPage.vue +0 -0
- /package/examples/templates/vue-vue/remote/src/{exposes → fulgurjs/exposes}/pages/HomePage.vue +0 -0
- /package/examples/templates/vue-vue/remote/src/{exposes → fulgurjs/exposes}/utils.ts +0 -0
package/dist/runtime.js
CHANGED
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
var ve=/^v?(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:-((?:[0-9A-Za-z-]+)(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z.-]+)?$/;function
|
|
1
|
+
var ve=/^v?(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:-((?:[0-9A-Za-z-]+)(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z.-]+)?$/;function C(l){let d=ve.exec(String(l).trim());return d?{major:Number(d[1]),minor:Number(d[2]??0),patch:Number(d[3]??0),pre:d[4]?d[4].split("."):[]}:null}function Pe(l,d){if(l.length===0&&d.length===0)return 0;if(l.length===0)return 1;if(d.length===0)return-1;let f=Math.max(l.length,d.length);for(let c=0;c<f;c++){let m=l[c],y=d[c];if(m===void 0)return-1;if(y===void 0)return 1;let b=/^\d+$/.test(m),v=/^\d+$/.test(y);if(b&&v){let M=Number(m)-Number(y);if(M!==0)return M}else{if(b!==v)return b?-1:1;if(m!==y)return m<y?-1:1}}return 0}function I(l,d){let f=C(l),c=C(d);return!f||!c?l<d?-1:l>d?1:0:f.major!==c.major?f.major-c.major:f.minor!==c.minor?f.minor-c.minor:f.patch!==c.patch?f.patch-c.patch:Pe(f.pre,c.pre)}var $e=/^[a-z]+[+:-]/i;function j(l,d){if(d===!1||d==null||d==="")return!0;let f=String(d).trim();return!f||f==="*"||f==="latest"||$e.test(f)?!0:f.split("||").some(c=>_e(l,c.trim()))}function _e(l,d){if(!d||d==="*")return!C(l)?.pre.length;let f=d.split(/\s+-\s+/);if(f.length===2){let y=f[0].trim(),b=f[1].trim();return!(!j(l,`>=${y}`)||!j(l,`<=${b}`))}let c=C(l);if(!c)return!1;let m=ke(d);if(m===null)return!0;for(let y of m)if(!Te(c,l,y))return!1;return!(c.pre.length>0&&!m.some(y=>y.ver.pre.length>0)&&!m.some(b=>b.ver.major===c.major&&b.ver.minor===c.minor&&b.ver.patch===c.patch))}function ke(l){let d=[],f=l.trim().split(/\s+/).filter(Boolean);if(f.length===0)return null;for(let c of f){let m=/^(>=|<=|>|<|=|\^|~)?(.*)$/.exec(c);if(!m)return null;let y=m[1],b=m[2],v=Le(y,b);if(v===null)return null;d.push(...v)}return d}function Le(l,d){let f=Ae(d);if(!f)return null;let{ver:c,partial:m}=f;switch(l){case"^":{let y=Oe(c);return y?[{op:">=",ver:c},{op:"<",ver:y}]:null}case"~":{let y=m>=2?{major:c.major,minor:c.minor+1,patch:0,pre:[]}:{major:c.major+1,minor:0,patch:0,pre:[]};return[{op:">=",ver:c},{op:"<",ver:y}]}case">=":return[{op:">=",ver:c}];case">":return m===1?[{op:">=",ver:{major:c.major+1,minor:0,patch:0,pre:[]}}]:m===2?[{op:">=",ver:{major:c.major,minor:c.minor+1,patch:0,pre:[]}}]:[{op:">",ver:c}];case"<":return m===1?[{op:"<",ver:{major:c.major,minor:0,patch:0,pre:[]}}]:m===2?[{op:"<",ver:{major:c.major,minor:c.minor,patch:0,pre:[]}}]:[{op:"<",ver:c}];case"<=":return[{op:"<=",ver:c}];case"=":case void 0:return m===1?[{op:">=",ver:c},{op:"<",ver:{major:c.major+1,minor:0,patch:0,pre:[]}}]:m===2?[{op:">=",ver:c},{op:"<",ver:{major:c.major,minor:c.minor+1,patch:0,pre:[]}}]:[{op:"=",ver:c}];default:return null}}function Oe(l){return l.major>0?{major:l.major+1,minor:0,patch:0,pre:[]}:l.minor>0?{major:0,minor:l.minor+1,patch:0,pre:[]}:{major:0,minor:0,patch:l.patch+1,pre:[]}}function Ae(l){let d=l.replace(/^v/,"").trim();if(!d||d==="*"||d==="x"||d==="X")return{ver:{major:0,minor:0,patch:0,pre:[]},partial:0};let f=d.split("."),c=[],m=0;for(let v of f.slice(0,3))if(/^\d+$/.test(v))c.push(Number(v)),m++;else{if(v==="x"||v==="X"||v==="*")break;break}let y=d.split("-"),b=y.length>1?y.slice(1).join("-").split("+")[0].split("."):[];return m===0&&b.length===0?{ver:{major:0,minor:0,patch:0,pre:[]},partial:0}:{ver:{major:c[0]??0,minor:c[1]??0,patch:c[2]??0,pre:b},partial:m}}function Me(l,d){switch(d){case">=":return l>=0;case">":return l>0;case"<":return l<0;case"<=":return l<=0;case"=":return l===0}}function Te(l,d,f){let c=`${l.major}.${l.minor}.${l.patch}`+(l.pre.length?`-${l.pre.join(".")}`:"");if(f.upper)return!(!(I(c,`${f.ver.major}.${f.ver.minor}.${f.ver.patch}`+(f.ver.pre.length?`-${f.ver.pre.join(".")}`:""))>=0)||!(I(c,`${f.upper.major}.${f.upper.minor}.${f.upper.patch}`)<0));let m=I(c,`${f.ver.major}.${f.ver.minor}.${f.ver.patch}`+(f.ver.pre.length?`-${f.ver.pre.join(".")}`:"")),y=Me(m,f.op);return f.ver.pre.length>0&&l.pre.length===0&&(f.op===">"||f.op==="<")?!1:y}var w=class extends Error{code;details;constructor(d,f,c,m){super(`[fulgurjs:${d}] ${f}`,m),this.name="FgError",this.code=d,this.details=c}},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 te="6.12.0";var Ie="__fulgurjsSetup",je="__FULGURJS_APP_CONFIG__",G=15e3,oe=2,xe=5,Ce=3e4,Ne=4e3,Ue=.2;function Ve(){let l=Object.create(null),d=new Map,f=[],c=new Set,m=new Map,y=(e,r)=>JSON.stringify([r.shareScope||"default",r.shareKey||e,r.requiredVersion??null,!!r.singleton,!!r.strictVersion]),b=new Map,v=new Map,M=new WeakMap,N=new WeakMap,_={},ie=()=>{for(let e of f)try{e.init?.(_)}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,V,F=e=>{let r=U.get(e);return r||U.set(e,r={}),r},X=()=>globalThis[je]??{};async function B(e,r,n,o){let t=u=>u instanceof w?u:new w(E.SETUP_RUN_FAILED,`\u73B0\u8C61\uFF1A\u8FDC\u7A0B\u5E94\u7528 "${e}" \u7684 ${o} \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 ${o} \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:o},{cause:u});V=e;let s;try{s=r(n)}catch(u){throw t(u)}finally{V=void 0}try{await s}catch(u){throw t(u)}}async function ae(e,r,n,o){e.debug.setup="pending";try{if(e.manifestUrl)try{await H(`${e.name}/${n}`)}catch{}let t=await r.get(n),s=t?.default;if(typeof s!="function")throw new w(E.SETUP_INVALID_EXPORT,`\u73B0\u8C61\uFF1A\u8FDC\u7A0B\u5E94\u7528 "${e.name}" \u7684 setup \u6A21\u5757 "${n}" \u65E0\u6CD5\u521D\u59CB\u5316\u3002
|
|
4
|
-
\u539F\u56E0\uFF1A\u9ED8\u8BA4\u5BFC\u51FA\u7C7B\u578B\u4E3A ${t==null?String(t):typeof s}\uFF0C\
|
|
5
|
-
\u4FEE\u6CD5\uFF1A\
|
|
3
|
+
\u4FEE\u6CD5\uFF1A\u68C0\u67E5\u5E76\u4FEE\u590D\u8BE5 ${o} \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:o},{cause:u});V=e;let s;try{s=r(n)}catch(u){throw t(u)}finally{V=void 0}try{await s}catch(u){throw t(u)}}async function ae(e,r,n,o){e.debug.setup="pending";try{if(e.manifestUrl)try{await H(`${e.name}/${n}`)}catch{}let t=await r.get(n),s=t?.default,u=t?.onSession!==void 0||t?.globalComponents!==void 0||t?.pageProviders!==void 0;if(s!==void 0&&typeof s!="function"||!s&&!u)throw new w(E.SETUP_INVALID_EXPORT,`\u73B0\u8C61\uFF1A\u8FDC\u7A0B\u5E94\u7528 "${e.name}" \u7684 setup \u6A21\u5757 "${n}" \u65E0\u6CD5\u521D\u59CB\u5316\u3002
|
|
4
|
+
\u539F\u56E0\uFF1A\u9ED8\u8BA4\u5BFC\u51FA\u7C7B\u578B\u4E3A ${t==null?String(t):typeof s}\uFF0C\u4E14\u6A21\u5757\u4E0D\u6EE1\u8DB3\u521D\u59CB\u5316\u58F0\u660E\u5951\u7EA6\u3002
|
|
5
|
+
\u4FEE\u6CD5\uFF1A\u9ED8\u8BA4\u5BFC\u51FA\u521D\u59CB\u5316\u51FD\u6570\uFF0C\u6216\u53EA\u58F0\u660E onSession/globalComponents/pageProviders\uFF1B\u7A7A\u6A21\u5757\u4E0E\u975E\u51FD\u6570\u9ED8\u8BA4\u5BFC\u51FA\u65E0\u6548\u3002`,{remote:e.name,module:n});if(t.onSession!==void 0&&typeof t.onSession!="function")throw new w(E.SETUP_INVALID_EXPORT,`\u73B0\u8C61\uFF1A\u8FDC\u7A0B\u5E94\u7528 "${e.name}" \u7684 setup \u6A21\u5757 "${n}" \u65E0\u6CD5\u521D\u59CB\u5316\u3002
|
|
6
6
|
\u539F\u56E0\uFF1AonSession \u5BFC\u51FA\u7C7B\u578B\u4E3A ${typeof t.onSession}\uFF0C\u5E94\u4E3A\u51FD\u6570\u3002
|
|
7
7
|
\u4FEE\u6CD5\uFF1A\u5C06 onSession \u6539\u4E3A\u5177\u540D\u5BFC\u51FA\u7684\u51FD\u6570\uFF0C\u6216\u5220\u9664\u8BE5\u5BFC\u51FA\u3002`,{remote:e.name,module:n});if(o.setupExports=t,t.globalComponents!==void 0){if(typeof t.globalComponents!="object"||t.globalComponents===null||Array.isArray(t.globalComponents))throw new w(E.SETUP_INVALID_EXPORT,`\u73B0\u8C61\uFF1A\u8FDC\u7A0B\u5E94\u7528 "${e.name}" \u7684 setup \u6A21\u5757 "${n}" \u65E0\u6CD5\u521D\u59CB\u5316\u3002
|
|
8
8
|
\u539F\u56E0\uFF1AglobalComponents \u5BFC\u51FA\u7C7B\u578B\u4E3A ${Array.isArray(t.globalComponents)?"array":typeof t.globalComponents}\uFF0C\u5E94\u4E3A\u5BF9\u8C61\uFF08\u952E=\u7EC4\u4EF6\u6CE8\u518C\u540D\uFF0C\u503C=\u7EC4\u4EF6\uFF09\u3002
|
|
9
9
|
\u4FEE\u6CD5\uFF1A\u6539\u4E3A export const globalComponents = { \u7EC4\u4EF6\u6CE8\u518C\u540D: \u7EC4\u4EF6 } \u5F62\u6001\uFF0C\u6216\u5220\u9664\u8BE5\u5BFC\u51FA\u3002`,{remote:e.name,module:n});o.globalComponents=t.globalComponents}if(t.pageProviders!==void 0){if(!Array.isArray(t.pageProviders))throw new w(E.SETUP_INVALID_EXPORT,`\u73B0\u8C61\uFF1A\u8FDC\u7A0B\u5E94\u7528 "${e.name}" \u7684 setup \u6A21\u5757 "${n}" \u65E0\u6CD5\u521D\u59CB\u5316\u3002
|
|
10
10
|
\u539F\u56E0\uFF1ApageProviders \u5BFC\u51FA\u7C7B\u578B\u4E3A ${typeof t.pageProviders}\uFF0C\u5E94\u4E3A\u6570\u7EC4\uFF08\u6BCF\u9879=\u7EC4\u4EF6\u6216\u96F6\u53C2 loader\uFF09\u3002
|
|
11
|
-
\u4FEE\u6CD5\uFF1A\u6539\u4E3A export const pageProviders = [AppProvider] \u6216 [() => import('./X').then((m) => m.AppProvider)] \u5F62\u6001\uFF0C\u6216\u5220\u9664\u8BE5\u5BFC\u51FA\u3002`,{remote:e.name,module:n});o.pageProviders=t.pageProviders}await B(e.name,s,{appContext:X(),signal:(o.controller??=new AbortController).signal},"setup"),e.debug.setup="ready"}catch(t){throw e.debug.setup="failed",o.setupExports=void 0,o.globalComponents=void 0,o.pageProviders=void 0,t}}async function ce(e,r,n){let o=X(),t=o?.sessionKey;if(typeof t!="string"||t==="")throw new w(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
|
|
11
|
+
\u4FEE\u6CD5\uFF1A\u6539\u4E3A export const pageProviders = [AppProvider] \u6216 [() => import('./X').then((m) => m.AppProvider)] \u5F62\u6001\uFF0C\u6216\u5220\u9664\u8BE5\u5BFC\u51FA\u3002`,{remote:e.name,module:n});o.pageProviders=t.pageProviders}s&&await B(e.name,s,{appContext:X(),signal:(o.controller??=new AbortController).signal},"setup"),e.debug.setup="ready"}catch(t){throw e.debug.setup="failed",o.setupExports=void 0,o.globalComponents=void 0,o.pageProviders=void 0,t}}async function ce(e,r,n){let o=X(),t=o?.sessionKey;if(typeof t!="string"||t==="")throw new w(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
|
|
12
12
|
\u539F\u56E0\uFF1A\u5F53\u524D\u503C\u4E3A ${t===void 0?"\u7F3A\u5931":JSON.stringify(t)}\u3002
|
|
13
|
-
\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===t)return r.sessionPromise;r.controller?.abort();let s=new AbortController;r.controller=s,r.sessionKey=t;let u=r.sessionPromise?r.sessionPromise.catch(()=>{}):Promise.resolve(),a=(async()=>{await u,!s.signal.aborted&&await B(e.name,n,{appContext:o,sessionKey:t,signal:s.signal},"onSession")})();return r.sessionPromise=a,a.catch(()=>{r.sessionKey===t&&(r.sessionKey=void 0,r.sessionPromise=void 0)}),a}async function le(e,r){let n=r?.[Ie];if(typeof n!="string"||n==="")return;let o=F(e.name);o.setupPromise||(o.setupPromise=ae(e,r,n,o).catch(s=>{throw o.setupPromise=void 0,s})),await o.setupPromise;let t=o.setupExports?.onSession;typeof t=="function"&&await ce(e,o,t)}function ue(){for(let e of U.values()){try{e.controller?.abort()}catch{}e.sessionKey=void 0,e.sessionPromise=void 0}}let A=e=>l[e]??=Object.create(null);function
|
|
13
|
+
\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===t)return r.sessionPromise;r.controller?.abort();let s=new AbortController;r.controller=s,r.sessionKey=t;let u=r.sessionPromise?r.sessionPromise.catch(()=>{}):Promise.resolve(),a=(async()=>{await u,!s.signal.aborted&&await B(e.name,n,{appContext:o,sessionKey:t,signal:s.signal},"onSession")})();return r.sessionPromise=a,a.catch(()=>{r.sessionKey===t&&(r.sessionKey=void 0,r.sessionPromise=void 0)}),a}async function le(e,r){let n=r?.[Ie];if(typeof n!="string"||n==="")return;let o=F(e.name);o.setupPromise||(o.setupPromise=ae(e,r,n,o).catch(s=>{throw o.setupPromise=void 0,s})),await o.setupPromise;let t=o.setupExports?.onSession;typeof t=="function"&&await ce(e,o,t)}function ue(){for(let e of U.values()){try{e.controller?.abort()}catch{}e.sessionKey=void 0,e.sessionPromise=void 0}}let A=e=>l[e]??=Object.create(null);function P(e){try{_.onRemoteError?.(e)}catch{}typeof window<"u"&&window.dispatchEvent(new CustomEvent("fulgurjs:error",{detail:e}))}function de(e="default"){return A(e),l}function D(e,r,n,o,t={}){let s=A(e||"default"),u=Object.hasOwn(s,r)?s[r]:void 0,a=u&&typeof u=="object"?u:void 0;a||(a=Object.create(null),s[r]=a),!(Object.hasOwn(a,n)&&a[n])&&(a[n]={version:n,get:o,from:t.from??"unknown",eager:!!t.eager,loaded:!!t.loaded})}function fe(e){let r=(n,o,t)=>{if(n===void 0)return;if(!(typeof n=="number"&&(t?Number.isInteger(n)&&n>=0&&n<=10:Number.isFinite(n)&&n>0)))throw new Error(`[fulgurjs] \u8FDC\u7A0B\u5E94\u7528 "${e.name}" \u7684 ${o} \u914D\u7F6E\u65E0\u6548\uFF1A\u5F53\u524D\u4E3A ${String(n)}\uFF0C\u5E94\u4E3A${t?" 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 J(e){for(let r of e){fe(r);let n=d.get(r.name);d.set(r.name,{timeout:G,retries:oe,...n,...r,breakerThreshold:r.breaker?.threshold??n?.breakerThreshold??xe,breakerResetMs:r.breaker?.resetMs??n?.breakerResetMs??Ce,state:n?.state??"idle",breakerState:n?.breakerState??{fails:0,openUntil:0},entryInflight:n?.entryInflight??new Map,entryFailCounts:n?.entryFailCounts??new Map,debug:n?.debug??{entry:r.entry,status:"idle",setup:"none"}})}}function pe(e){J([e])}function me(e){f.push(...e),m.clear(),ie()}function T(e,r,n=!1){let o=r.shareScope||"default",t=r.shareKey||e,u=A(o)[t]||{},a=Object.keys(u).filter(i=>!n||r.singleton||u[i].value!==void 0);if(n&&a.length===0)return;let S=r.requiredVersion,g=a.filter(i=>S===void 0||S===!1||j(i,S)),p;if(r.singleton&&a.length>0){let i=a.filter(h=>u[h].loaded);if(p=[...i.length?i:a].sort(I).pop(),!g.includes(p)){let h=u[p],L=`\u73B0\u8C61\uFF1A\u5171\u4EAB\u5355\u4F8B "${t}" \u7684\u5B9E\u9645\u7248\u672C\u4E0D\u6EE1\u8DB3\u5F53\u524D\u5E94\u7528\u8981\u6C42\u3002
|
|
14
14
|
\u539F\u56E0\uFF1A\u5E94\u7528\u8981\u6C42 ${S??"\u4EFB\u610F\u7248\u672C"}\uFF0C\u4F5C\u7528\u57DF\u4E2D\u6709 ${a.join("\u3001")}\uFF1B\u4E3A\u4FDD\u8BC1\u5168\u9875\u53EA\u4F7F\u7528\u4E00\u4E2A\u5B9E\u4F8B\uFF0C\u6700\u7EC8\u590D\u7528 ${h.from} \u63D0\u4F9B\u7684 ${p}\u3002
|
|
15
15
|
\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
|
|
16
|
-
\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 O=new w(E.SHARE_STRICT_VERSION,L,{shareKey:t,requiredVersion:S});throw
|
|
16
|
+
\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 O=new w(E.SHARE_STRICT_VERSION,L,{shareKey:t,requiredVersion:S});throw P({remote:h.from,error:O}),O}let $=`${o}|${t}|${S??"*"}|${p}|${a.join(",")}`;c.has($)||(c.add($),console.warn(`[fulgurjs:MFU-010] ${L}`))}}else if(p=[...g].sort(I).pop(),!p){if(r.strictVersion){let i=new w(E.SHARE_STRICT_VERSION,`\u73B0\u8C61\uFF1A\u5171\u4EAB\u4F5C\u7528\u57DF "${o}" \u4E2D\u627E\u4E0D\u5230\u7B26\u5408\u8981\u6C42\u7684 "${t}"\u3002
|
|
17
17
|
\u539F\u56E0\uFF1A\u8981\u6C42\u7248\u672C ${S}\uFF0C\u5F53\u524D\u53EF\u7528\u7248\u672C\u4E3A ${a.join("\u3001")||"\u65E0"}\u3002
|
|
18
|
-
\u4FEE\u6CD5\uFF1A\u7EDF\u4E00\u5BBF\u4E3B\u4E0E\u8FDC\u7A0B\u7684\u4F9D\u8D56\u7248\u672C\uFF0C\u6216\u4FEE\u6B63 shared.requiredVersion\u3002`);throw
|
|
18
|
+
\u4FEE\u6CD5\uFF1A\u7EDF\u4E00\u5BBF\u4E3B\u4E0E\u8FDC\u7A0B\u7684\u4F9D\u8D56\u7248\u672C\uFF0C\u6216\u4FEE\u6B63 shared.requiredVersion\u3002`);throw P({remote:t,error:i}),i}return}return u[p]}function W(e,r,n){let o=r.localVersion;if(!o||n===void 0)return;let t=r.shareScope||"default",s=r.shareKey||e,u=A(t),a=Object.hasOwn(u,s)?u[s]:void 0;if(a&&Object.keys(a).length>0){try{let g=T(e,r);if(g&&g.value===void 0){if(g.version===o)g.value=n,g.loaded=!0;else if(r.singleton&&!g.pendingGet){D(t,s,o,()=>Promise.resolve(n),{from:"fulgurjs:local-fallback",loaded:!0});let p=u[s][o];p.value=n,p.loaded=!0}}}catch{}return}D(t,s,o,()=>Promise.resolve(n),{from:"fulgurjs:local-fallback",loaded:!0});let S=u[s]?.[o];S&&(S.value=n)}async function z(e,r={}){let n=r.shareScope||"default",o=r.shareKey||e,t=A(n)[o]||{},s=y(e,r),u=_.resolveShare?m.get(s):void 0,a=u||T(e,r);if(!a){if(r.fallback){let i=await r.fallback();return W(e,r,i),i}let p=new w(E.SHARE_NOT_AVAILABLE,`\u73B0\u8C61\uFF1A\u65E0\u6CD5\u52A0\u8F7D\u5171\u4EAB\u4F9D\u8D56 "${o}"\u3002
|
|
19
19
|
\u539F\u56E0\uFF1A\u4F5C\u7528\u57DF "${n}" \u4E2D\u6CA1\u6709\u7B26\u5408 ${r.requiredVersion??"\u4EFB\u610F\u7248\u672C"} \u8981\u6C42\u7684\u7248\u672C\uFF0C\u4E14\u672A\u914D\u7F6E\u672C\u5730\u526F\u672C\u3002
|
|
20
|
-
\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:o,requiredVersion:r.requiredVersion});throw
|
|
20
|
+
\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:o,requiredVersion:r.requiredVersion});throw P({remote:o,error:p}),p}if(_.resolveShare&&!u){let p=await _.resolveShare({shareKey:o,shareScope:n,requiredVersion:r.requiredVersion,picked:a,available:Object.values(t)});p&&(a=p),m.set(s,a)}if(a.value!==void 0)return m.set(y(e,r),a),a.value;if(a.loaded=!0,!a.pendingGet)try{a.pendingGet=a.get()}catch(p){a.pendingGet=Promise.reject(p)}let S=a.pendingGet,g;try{g=await S}catch(p){if(a.value!==void 0)return m.set(y(e,r),a),a.value;throw a.loaded=!1,m.get(s)===a&&m.delete(s),p}finally{a.pendingGet===S&&(a.pendingGet=void 0)}return a.value===void 0&&(a.value=g),m.set(y(e,r),a),a.value}function ge(e,r={}){return _.resolveShare?m.get(y(e,r))?.value:T(e,r,!0)?.value}function he(e,r,n,o){W(e,{...r,localVersion:n},o)}function ye(e,r){let n=r.shareScope||"default",o=r.shareKey||e;if(_.resolveShare){let s=y(e,r),u=m.get(s);if(u&&u.value!==void 0)return{kind:"ready",value:u.value};let a=u||_.resolveShare({shareKey:o,shareScope:n,requiredVersion:r.requiredVersion,picked:T(e,r),available:Object.values(A(n)[o]||{})});if(a&&typeof a.then=="function")throw Promise.resolve(a).catch(()=>{}),new w(E.SHARE_NOT_AVAILABLE,`\u73B0\u8C61\uFF1AresolveShare \u5BF9\u5171\u4EAB "${o}" \u8FD4\u56DE\u4E86 Promise\uFF0C\u4F46\u8BE5\u5171\u4EAB\u6B63\u88AB\u540C\u6B65\u9759\u6001\u5BFC\u5165\u6D88\u8D39\uFF08Vite 8 \u540C\u6B65\u534F\u5546\u95E8\u9762\uFF09\u3002
|
|
21
21
|
\u539F\u56E0\uFF1A\u6A21\u5757\u6C42\u503C\u671F\u65E0\u6CD5\u7B49\u5F85\u5F02\u6B65\u51B3\u7B56\uFF1B\u9759\u6001\u5BFC\u5165\u4E0D\u80FD\u9759\u9ED8\u5FFD\u7565 hook \u51B3\u7B56\u3002
|
|
22
22
|
\u4FEE\u6CD5\uFF1AVite 8 HTML \u5165\u53E3\u4F1A\u5148\u5B8C\u6210\u5F02\u6B65\u534F\u5546\uFF1B\u5176\u4ED6\u5165\u53E3\u8BF7\u5148\u52A8\u6001 loadShare \u5EFA\u7ACB\u5FEB\u7167\uFF0C\u518D\u5BFC\u5165\u6D88\u8D39\u8005\uFF0C\u6216\u8BA9\u8BE5\u952E\u540C\u6B65\u8FD4\u56DE picked\u3002`,{shareKey:o,requiredVersion:r.requiredVersion,syncUnsupported:!0});let S=a;if(S){if(S.value!==void 0)return m.set(y(e,r),S),{kind:"ready",value:S.value};if(S.version!==void 0&&S.version===r.localVersion)return{kind:"local"};throw new w(E.SHARE_NOT_AVAILABLE,`\u73B0\u8C61\uFF1AresolveShare \u4E3A "${o}" \u9009\u62E9\u4E86\u672A\u5C31\u7EEA\u7684 ${S.version??"\u6761\u76EE"}\u3002
|
|
23
23
|
\u539F\u56E0\uFF1A\u540C\u6B65\u6D88\u8D39\u4E0D\u80FD\u7B49\u5F85\u52A0\u8F7D\u3002
|
|
24
|
-
\u4FEE\u6CD5\uFF1A\u5148\u52A8\u6001 loadShare \u518D\u5BFC\u5165\u6D88\u8D39\u8005\uFF0C\u6216\u9009\u62E9\u5DF2\u5C31\u7EEA\u5B9E\u4F8B/\u672C\u5730\u7248\u672C ${r.localVersion??"\u672A\u58F0\u660E"}\u3002`,{shareKey:o,requiredVersion:r.requiredVersion,syncUnsupported:!0})}}let t=T(e,r);if(!t)return{kind:"local"};if(t.value!==void 0)return{kind:"ready",value:t.value};if(t.version!==void 0&&t.version===r.localVersion)return{kind:"local"};if(r.singleton||r.strictVersion&&r.requiredVersion&&(!r.localVersion||!
|
|
24
|
+
\u4FEE\u6CD5\uFF1A\u5148\u52A8\u6001 loadShare \u518D\u5BFC\u5165\u6D88\u8D39\u8005\uFF0C\u6216\u9009\u62E9\u5DF2\u5C31\u7EEA\u5B9E\u4F8B/\u672C\u5730\u7248\u672C ${r.localVersion??"\u672A\u58F0\u660E"}\u3002`,{shareKey:o,requiredVersion:r.requiredVersion,syncUnsupported:!0})}}let t=T(e,r);if(!t)return{kind:"local"};if(t.value!==void 0)return{kind:"ready",value:t.value};if(t.version!==void 0&&t.version===r.localVersion)return{kind:"local"};if(r.singleton||r.strictVersion&&r.requiredVersion&&(!r.localVersion||!j(r.localVersion,r.requiredVersion))){if(r.strictVersion||t.pendingGet)throw new w(E.SHARE_NOT_AVAILABLE,`\u73B0\u8C61\uFF1A\u5171\u4EAB "${o}" \u9009\u4E2D\u4E86 ${t.from} \u63D0\u4F9B\u7684 ${t.version}\uFF08\u5C1A\u672A\u52A0\u8F7D\uFF09\uFF0C\u540C\u6B65\u9759\u6001\u5BFC\u5165\u65E0\u6CD5\u7B49\u5F85\u5176\u5B9E\u4F8B\u5C31\u7EEA\u3002
|
|
25
25
|
\u539F\u56E0\uFF1A\u4E0D\u80FD\u6539\u7528\u4E0D\u517C\u5BB9\u7684\u672C\u5730\u526F\u672C\u6216\u5206\u88C2\u5355\u4F8B\u3002
|
|
26
|
-
\u4FEE\u6CD5\uFF1A\u8BA9\u8BE5\u5171\u4EAB\u7684\u9996\u6B21\u6D88\u8D39\u5148\u7ECF\u4E00\u6B21\u52A8\u6001 loadShare \u5B8C\u6210\u52A0\u8F7D\uFF0C\u6216\u5C06\u672C\u5E94\u7528\u7248\u672C\u4E0E\u4F5C\u7528\u57DF\u63D0\u4F9B\u7248\u672C\u5BF9\u9F50\u3002`,{shareKey:o,requiredVersion:r.requiredVersion,syncUnsupported:!0});let s=`${n}|${o}|${t.version}|${r.localVersion}`;return c.has(s)||(c.add(s),console.warn(`[fulgurjs:MFU-010] \u5171\u4EAB\u5355\u4F8B "${o}"\uFF1A\u4F5C\u7528\u57DF\u4E2D ${t.from} \u63D0\u4F9B\u7684 ${t.version} \u5C1A\u672A\u52A0\u8F7D\uFF0C\u9996\u4E2A\u6D88\u8D39\u8005\u4EE5\u672C\u5730\u7248\u672C ${r.localVersion??""} \u63A5\u7BA1\uFF08\u540E\u7EED\u6D88\u8D39\u8005\u6309\u5DF2\u52A0\u8F7D\u4F18\u5148\u6536\u655B\u5230\u8BE5\u5B9E\u4F8B\uFF09\u3002`)),{kind:"local"}}return console.warn(`[fulgurjs] \u5171\u4EAB "${o}"\uFF1A\u975E\u5355\u4F8B\u540C\u6B65\u6D88\u8D39\u4F7F\u7528\u672C\u5730 ${r.localVersion??""}\uFF0C\u8FDC\u7A0B ${t.version} \u5C1A\u672A\u5C31\u7EEA\u3002`),{kind:"local"}}async function Se(e){if(_.resolveShare){for(let{name:r,opts:n}of e){let o=y(r,n);if(m.has(o))continue;let t=T(r,n),s=await _.resolveShare({shareKey:n.shareKey||r,shareScope:n.shareScope||"default",requiredVersion:n.requiredVersion,picked:t,available:Object.values(A(n.shareScope||"default")[n.shareKey||r]||{})})||t;s&&m.set(o,s)}for(let{name:r,opts:n}of e)await z(r,n)}}function Y(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 Z(e,r,n){return new Promise((o,t)=>{let s=setTimeout(()=>t(new Error(`\u7B49\u5F85\u8D85\u8FC7 ${r} \u6BEB\u79D2\uFF1A${n}`)),r);e.then(u=>{clearTimeout(s),o(u)},u=>{clearTimeout(s),t(u)})})}let we=e=>new Promise(r=>setTimeout(r,e)),Q=new Set;function K(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 n=`\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){let o=`${r.name}\u2194${e.name}`;Q.has(o)||(Q.add(o),console.warn(`[fulgurjs] ${n} \u5F53\u524D\u662F\u52A8\u6001 Promise \u8FDC\u7A0B\uFF0C\u7EE7\u7EED\u52A0\u8F7D\u3002`))}else throw Object.assign(new Error(n),{code:E.REMOTE_NAME_MISMATCH})}}async function ee(e,r){let n=r.entryFailCounts.get(e)??0,o=n>0?`${e}${e.includes("?")?"&":"?"}fulgurjs_retry=${n}`:e,t=r.entryInflight.get(e),s=t??import(o);return t||(r.entryInflight.set(e,s),s.catch(()=>{r.entryInflight.delete(e),r.entryFailCounts.set(e,(r.entryFailCounts.get(e)??0)+1)})),Z(s,r.timeout??G,`\u52A0\u8F7D\u8FDC\u7A0B\u5165\u53E3 ${Y(e)}`)}async function re(e,r){let n=e.shareScope||"default";if(e.container){let s=
|
|
26
|
+
\u4FEE\u6CD5\uFF1A\u8BA9\u8BE5\u5171\u4EAB\u7684\u9996\u6B21\u6D88\u8D39\u5148\u7ECF\u4E00\u6B21\u52A8\u6001 loadShare \u5B8C\u6210\u52A0\u8F7D\uFF0C\u6216\u5C06\u672C\u5E94\u7528\u7248\u672C\u4E0E\u4F5C\u7528\u57DF\u63D0\u4F9B\u7248\u672C\u5BF9\u9F50\u3002`,{shareKey:o,requiredVersion:r.requiredVersion,syncUnsupported:!0});let s=`${n}|${o}|${t.version}|${r.localVersion}`;return c.has(s)||(c.add(s),console.warn(`[fulgurjs:MFU-010] \u5171\u4EAB\u5355\u4F8B "${o}"\uFF1A\u4F5C\u7528\u57DF\u4E2D ${t.from} \u63D0\u4F9B\u7684 ${t.version} \u5C1A\u672A\u52A0\u8F7D\uFF0C\u9996\u4E2A\u6D88\u8D39\u8005\u4EE5\u672C\u5730\u7248\u672C ${r.localVersion??""} \u63A5\u7BA1\uFF08\u540E\u7EED\u6D88\u8D39\u8005\u6309\u5DF2\u52A0\u8F7D\u4F18\u5148\u6536\u655B\u5230\u8BE5\u5B9E\u4F8B\uFF09\u3002`)),{kind:"local"}}return console.warn(`[fulgurjs] \u5171\u4EAB "${o}"\uFF1A\u975E\u5355\u4F8B\u540C\u6B65\u6D88\u8D39\u4F7F\u7528\u672C\u5730 ${r.localVersion??""}\uFF0C\u8FDC\u7A0B ${t.version} \u5C1A\u672A\u5C31\u7EEA\u3002`),{kind:"local"}}async function Se(e){if(_.resolveShare){for(let{name:r,opts:n}of e){let o=y(r,n);if(m.has(o))continue;let t=T(r,n),s=await _.resolveShare({shareKey:n.shareKey||r,shareScope:n.shareScope||"default",requiredVersion:n.requiredVersion,picked:t,available:Object.values(A(n.shareScope||"default")[n.shareKey||r]||{})})||t;s&&m.set(o,s)}for(let{name:r,opts:n}of e)await z(r,n)}}function Y(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 Z(e,r,n){return new Promise((o,t)=>{let s=setTimeout(()=>t(new Error(`\u7B49\u5F85\u8D85\u8FC7 ${r} \u6BEB\u79D2\uFF1A${n}`)),r);e.then(u=>{clearTimeout(s),o(u)},u=>{clearTimeout(s),t(u)})})}let we=e=>new Promise(r=>setTimeout(r,e)),Q=new Set;function K(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 n=`\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){let o=`${r.name}\u2194${e.name}`;Q.has(o)||(Q.add(o),console.warn(`[fulgurjs] ${n} \u5F53\u524D\u662F\u52A8\u6001 Promise \u8FDC\u7A0B\uFF0C\u7EE7\u7EED\u52A0\u8F7D\u3002`))}else throw Object.assign(new Error(n),{code:E.REMOTE_NAME_MISMATCH})}}async function ee(e,r){let n=r.entryFailCounts.get(e)??0,o=n>0?`${e}${e.includes("?")?"&":"?"}fulgurjs_retry=${n}`:e,t=r.entryInflight.get(e),s=t??import(o);return t||(r.entryInflight.set(e,s),s.catch(()=>{r.entryInflight.delete(e),r.entryFailCounts.set(e,(r.entryFailCounts.get(e)??0)+1)})),Z(s,r.timeout??G,`\u52A0\u8F7D\u8FDC\u7A0B\u5165\u53E3 ${Y(e)}`)}async function re(e,r){let n=e.shareScope||"default";if(e.container){let s=N.get(e.container);if(s&&s!==n)throw new w(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 "${n}" \u521D\u59CB\u5316\u3002\u8BF7\u7EDF\u4E00 shareScope \u914D\u7F6E\u3002`);return e.container}if(e.containerPromise)return e.containerPromise;let o=e.breakerState;if(o.openUntil>Date.now()){let s=new w(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(o.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 P({remote:e.name,error:s}),s}e.state="loading",e.debug.status="loading";let t=(async()=>{let s=[];if(e.promise)s.push(async()=>{let i=await Z(e.promise(),e.timeout??G,`\u89E3\u6790\u52A8\u6001\u8FDC\u7A0B\u5E94\u7528 "${e.name}"`),h=typeof i=="string"?await ee(i,e):i;return K(h,e),h});else for(let i of[e.entry,...e.fallback??[]])s.push(async()=>{let h=await ee(i,e);return K(h,e),h});let u,a,S=!1,g=r?.retries??e.retries??oe;for(let i of s){for(let h=0;h<=g;h++){let L=performance.now();try{u=await i(),e.lastLoadMs=Math.round(performance.now()-L),e.debug.lastLoadMs=e.lastLoadMs,S=!0;break}catch($){if(a=$,$?.code)throw $;h<g&&await we(Math.min(Ne,200*2**h)*(1-Ue*(1-2*Math.random())))}}if(S)break}if(!S||!u){let i=Y(e.entry),h=[];throw/^https?:\/\//.test(e.entry)&&typeof location<"u"?(h.push(`1. \u5728\u6D4F\u89C8\u5668\u6253\u5F00 ${i}\uFF0C\u786E\u8BA4\u8FDC\u7A0B\u5F00\u53D1\u670D\u52A1\u5DF2\u542F\u52A8\uFF0C\u5E76\u8FD4\u56DE JS \u800C\u975E HTML\u3002`),h.push("2. \u6838\u5BF9 federation({ remotes }) \u4E2D\u7684\u5730\u5740\uFF1B\u5F00\u53D1\u548C\u751F\u4EA7\u5730\u5740\u53EF\u4EE5\u4E0D\u540C\u3002"),h.push("3. \u82E5\u8DE8\u57DF\uFF0C\u68C0\u67E5\u8FDC\u7A0B\u5F00\u53D1\u670D\u52A1\u7684 server.cors \u914D\u7F6E\u3002")):(h.push(`1. \u5728\u6D4F\u89C8\u5668\u6253\u5F00 ${i}\uFF0C\u786E\u8BA4\u8FDC\u7A0B\u5E94\u7528\u5DF2\u90E8\u7F72\uFF0C\u4E14\u5165\u53E3\u8FD4\u56DE JS\u3002`),h.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 w(E.REMOTE_LOAD_FAILED,`\u73B0\u8C61\uFF1A\u65E0\u6CD5\u4ECE ${i} \u52A0\u8F7D\u8FDC\u7A0B\u5E94\u7528 "${e.name}"\u3002
|
|
27
27
|
\u539F\u56E0\uFF1A${String(a?.message??a)}
|
|
28
28
|
\u4FEE\u6CD5\uFF1A
|
|
29
29
|
${h.join(`
|
|
30
|
-
`)}`,{remote:e.name})}K(u,e);let p=
|
|
30
|
+
`)}`,{remote:e.name})}K(u,e);let p=N.get(u);if(p&&p!==n)throw new w(E.CONTAINER_REINIT_CONFLICT,`\u8FDC\u7A0B\u5BB9\u5668 "${e.name}" \u5DF2\u4F7F\u7528\u5171\u4EAB\u4F5C\u7528\u57DF "${p}" \u521D\u59CB\u5316\uFF0C\u4E0D\u80FD\u518D\u4EE5 "${n}" \u521D\u59CB\u5316\u3002\u8BF7\u7EDF\u4E00 shareScope \u914D\u7F6E\u3002`);return typeof u.init=="function"&&await u.init(l),N.set(u,n),e.container=u,e.state="loaded",e.debug.status="loaded",o.fails=0,u})();e.containerPromise=t;try{return await t}catch(s){if(e.containerPromise=void 0,e.state="failed",e.debug.status="failed",e.debug.error=String(s?.message??s),o.fails+=1,o.fails>=e.breakerThreshold&&(o.openUntil=Date.now()+e.breakerResetMs,o.fails=0),s instanceof w)throw P({remote:e.name,error:s}),s;if(s?.code)throw P({remote:e.name,error:s}),s;let u=new w(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 P({remote:e.name,error:u}),u}}function q(e){let r=e.indexOf("/");return r===-1?{remote:e,module:""}:{remote:e.slice(0,r),module:ne(e.slice(r+1))}}function ne(e){return e?e.startsWith(".")?e:`./${e}`:""}async function Ee(e,r){let{remote:n,module:o}=q(e);if(o&&V===n)throw new w(E.SETUP_RECURSION,`\u73B0\u8C61\uFF1A\u52A0\u8F7D "${e}" \u65F6\uFF0C\u8FDC\u7A0B\u5E94\u7528 "${n}" \u7684 setup/onSession \u53C8\u540C\u6B65\u52A0\u8F7D\u4E86\u81EA\u8EAB\u6A21\u5757\uFF0C\u5F62\u6210\u5FAA\u73AF\u7B49\u5F85\u3002
|
|
31
31
|
\u539F\u56E0\uFF1A\u521D\u59CB\u5316\u5C1A\u672A\u5B8C\u6210\uFF0C\u4E0D\u80FD\u7B49\u5F85\u81EA\u8EAB\u7684\u521D\u59CB\u5316\u7ED3\u679C\u3002
|
|
32
|
-
\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:n});try{_.beforeLoadRemote?.({remote:n,module:o})}catch(i){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",i)}let t=d.get(n);if(!t)throw new w(E.REMOTE_UNKNOWN,`\u672A\u77E5\u8FDC\u7A0B\u5E94\u7528 "${n}"\u3002\u8BF7\u5728 federation({ remotes }) \u4E2D\u914D\u7F6E\uFF0C\u6216\u5728\u52A0\u8F7D\u524D\u8C03\u7528 registerRemote()\u3002`,{remote:n});let s;try{let i=o&&t.manifestUrl?H(e):Promise.resolve();[s]=await Promise.all([re(t,{retries:r?.retries}),i])}catch(i){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`,i)
|
|
32
|
+
\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:n});try{_.beforeLoadRemote?.({remote:n,module:o})}catch(i){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",i)}let t=d.get(n);if(!t)throw new w(E.REMOTE_UNKNOWN,`\u672A\u77E5\u8FDC\u7A0B\u5E94\u7528 "${n}"\u3002\u8BF7\u5728 federation({ remotes }) \u4E2D\u914D\u7F6E\uFF0C\u6216\u5728\u52A0\u8F7D\u524D\u8C03\u7528 registerRemote()\u3002`,{remote:n});let s;try{let i=o&&t.manifestUrl?H(e):Promise.resolve();[s]=await Promise.all([re(t,{retries:r?.retries}),i])}catch(i){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`,i),P({remote:n,error:i}),await r.fallbackModule();throw i}if(!o)return s;await le(t,s);let u=F(n).globalComponents,a=r?.consumerApp;if(u&&a&&typeof a.component=="function")for(let i of Object.keys(u))a.component(i,u[i]);let S=F(n).pageProviders;S&&S.length>0&&typeof a?.pageProviders=="function"&&a.pageProviders(S);let g=`${n}@${t.shareScope||"default"}#${o}`;b.has(g)||b.set(g,s.get(o).catch(i=>{throw b.delete(g),i instanceof w||i?.code?i:new w(E.REMOTE_LOAD_FAILED,`\u65E0\u6CD5\u4ECE\u8FDC\u7A0B\u5E94\u7528 "${n}" \u52A0\u8F7D\u6A21\u5757 "${o}"\u3002\u5E95\u5C42\u539F\u56E0\uFF1A${String(i?.message??i)}\u3002\u8BF7\u6838\u5BF9 exposes \u952E\u548C\u8FDC\u7A0B\u6784\u5EFA\u4EA7\u7269\u3002`,{remote:n,module:o})}));let p;try{p=await b.get(g)}catch(i){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`,i),P({remote:n,error:i}),await r.fallbackModule();throw i}try{_.afterLoadRemote?.({remote:n,module:o,module_ns:p})}catch(i){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",i)}if(p&&typeof p=="object"&&Object.keys(p).length===0){let i=new w(E.EMPTY_EXPORTS,`\u8FDC\u7A0B\u5E94\u7528 "${n}" \u7684\u6A21\u5757 "${o}" \u6CA1\u6709\u4EFB\u4F55\u5BFC\u51FA\u3002\u8BF7\u68C0\u67E5 exposes \u6307\u5411\u7684\u6587\u4EF6\u53CA\u5176 export \u58F0\u660E\u3002`,{remote:n,module:o});P({remote:n,error:i}),console.error(i.message)}return p}function Re(e){let r=d.get(e);if(!r)throw new w(E.REMOTE_UNKNOWN,`\u672A\u77E5\u8FDC\u7A0B\u5E94\u7528 "${e}"\u3002\u8BF7\u5148\u6CE8\u518C\u8BE5\u8FDC\u7A0B\u5E94\u7528\u3002`,{remote:e});return re(r)}async function H(e,r={}){let{remote:n,module:o}=q(e),t=d.get(n);if(!t)throw new w(E.REMOTE_UNKNOWN,`\u672A\u77E5\u8FDC\u7A0B\u5E94\u7528 "${n}"\u3002\u8BF7\u5148\u6CE8\u518C\u8BE5\u8FDC\u7A0B\u5E94\u7528\u3002`,{remote:n});let s=r.mode??"preload",u=(g,p)=>{if(g.sheet)return Promise.resolve();let i=M.get(g);if(i)return i;let h=new Promise(L=>{let $=()=>{g.removeEventListener("load",$),g.removeEventListener("error",O),L()},O=()=>{P({remote:n,error:new w(E.PRELOAD_FAILED,`\u8FDC\u7A0B\u5E94\u7528 "${n}" \u7684\u6837\u5F0F\u8D44\u6E90\u52A0\u8F7D\u5931\u8D25\uFF1A${p}\u3002\u8BF7\u68C0\u67E5\u6587\u4EF6\u662F\u5426\u5B58\u5728\u4EE5\u53CA\u8DE8\u57DF\u548C\u7F13\u5B58\u914D\u7F6E\u3002`,{remote:n})}),$()};g.addEventListener("load",$,{once:!0}),g.addEventListener("error",O,{once:!0}),g.sheet&&$()});return M.set(g,h),h},a=(g,p)=>{if(typeof document>"u")return Promise.resolve();let i=document.querySelector(`link[href="${g}"]`);if(i)return p==="style"&&s==="preload"?M.get(i)??Promise.resolve():Promise.resolve();let h=document.createElement("link");h.rel=p==="style"?"stylesheet":"modulepreload",h.href=g,s==="prefetch"&&(h.fetchPriority="low");let L=p==="style"?u(h,g):Promise.resolve();return document.head.appendChild(h),p==="style"&&s==="preload"?L:Promise.resolve()},S=g=>{let p=typeof document<"u"?document.baseURI:void 0,i=new URL(t.entry,p||"http://fulgurjs.invalid/");return!i.pathname.endsWith("/")&&!i.pathname.split("/").pop().includes(".")&&(i.pathname+="/"),new URL(g,i).href};try{if(t.manifestUrl){let g=v.get(t.manifestUrl);g||(g=fetch(t.manifestUrl,{cache:"no-cache",signal:AbortSignal.timeout(8e3)}).then(i=>i.ok?i.json():void 0),v.set(t.manifestUrl,g),g.then(i=>{i||v.delete(t.manifestUrl)},()=>v.delete(t.manifestUrl)));let p=await g;if(p){let i=p.schemaVersion;if(typeof i=="number"&&(!Number.isInteger(i)||i>1)){P({remote:n,error:new w(E.PRELOAD_FAILED,`\u8FDC\u7A0B\u5E94\u7528 "${n}" \u7684 manifest \u534F\u8BAE\u7248\u672C\u4E3A ${String(i)}\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:n})}),await a(t.entry,"modulepreload");return}await a(t.entry,"modulepreload");let h=p.exposes,L=Array.isArray(h)?h.filter(k=>k&&typeof k=="object").map(k=>[String(k.name??""),k]):h&&typeof h=="object"?Object.entries(h):[],$=o?L.filter(([k,x])=>ne(String(x?.name??k))===o):L,O=[];for(let[,k]of $)if(typeof k?.file=="string"&&await a(S(k.file),"modulepreload"),Array.isArray(k?.css))for(let x of k.css){if(typeof x!="string")continue;let be=a(S(x),"style");s==="preload"&&O.push(be)}await Promise.all(O);return}}await a(t.entry,"modulepreload")}catch(g){P({remote:n,error:new w(E.PRELOAD_FAILED,`\u8FDC\u7A0B\u5E94\u7528 "${n}" \u9884\u52A0\u8F7D\u5931\u8D25\u3002\u5E95\u5C42\u539F\u56E0\uFF1A${String(g?.message??g)}\u3002\u8BF7\u68C0\u67E5 manifest \u548C\u8D44\u6E90\u5730\u5740\u3002`,{remote:n})})}}return typeof window>"u"||(window.__FULGURJS_SCOPE__=l,window.__FULGURJS_INFO__={get remotes(){let e={};for(let[r,n]of d)e[r]={...n.debug,entry:n.entry};return e},errors:[]}),{shareScopeMap:l,initSharing:de,registerShare:D,registerRemotes:J,registerRemote:pe,registerPlugins:me,loadShare:z,loadShareSync:ye,prepareShares:Se,getLoadedShare:ge,pinLoadedShare:he,loadRemote:Ee,getContainer:Re,preloadRemote:H,parseSpec:q,clearSessionState:ue}}var se=globalThis,R=se.__FULGURJS_RUNTIME__??Ve();se.__FULGURJS_RUNTIME__=R;try{Object.freeze(R)}catch{}var Be=te;function Je(){return R}var We=R.initSharing,ze=R.registerShare,Ye=R.registerRemotes,Ze=R.registerRemote,Qe=R.registerPlugins,er=R.loadShare,rr=R.getLoadedShare,nr=R.prepareShares||(async l=>{for(let{name:d,opts:f}of l)await R.loadShare(d,f)}),tr=R.loadShareSync,or=R.pinLoadedShare,sr=R.loadRemote,ir=R.getContainer,ar=R.preloadRemote,cr=R.parseSpec,lr=R.clearSessionState,ur=R.shareScopeMap;function dr(l){if(l&&typeof l=="object"&&"default"in l){let d=l.default;return d!==void 0?d:l}return l}var fr=R;export{lr as clearSessionState,fr as default,ir as getContainer,rr as getLoadedShare,Je as getRuntime,We as initSharing,sr as loadRemote,er as loadShare,tr as loadShareSync,cr as parseSpec,or as pinLoadedShare,ar as preloadRemote,nr as prepareShares,Qe as registerPlugins,Ze as registerRemote,Ye as registerRemotes,ze as registerShare,R as runtime,ur as shareScopeMap,dr as unwrapDefault,Be as version};
|
package/dist/vue-adapter.d.cts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { DefineComponent, Component } from 'vue';
|
|
2
2
|
import { PageRouteLike } from './pages.cjs';
|
|
3
3
|
import { R as ResolvedHostPage, H as HostPagesCoreOptions } from './host-pages-core-BFxp-IOj.cjs';
|
|
4
|
-
import { b as FgModuleDefault, c as FgComponentLike, d as FgComponentEntry } from './remote-types-
|
|
4
|
+
import { b as FgModuleDefault, c as FgComponentLike, d as FgComponentEntry } from './remote-types-Cf4SSzus.cjs';
|
|
5
5
|
import { FgRemoteTypes } from '@fulgurjs/federation/internal/registry.js';
|
|
6
|
-
import './bridge-core-
|
|
6
|
+
import './bridge-core-CGFET9Qi.cjs';
|
|
7
7
|
import './context.cjs';
|
|
8
8
|
|
|
9
9
|
/** Vue 适配层只接收加载函数,不静态引用运行时内核。 */
|
package/dist/vue-adapter.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { DefineComponent, Component } from 'vue';
|
|
2
2
|
import { PageRouteLike } from './pages.js';
|
|
3
3
|
import { R as ResolvedHostPage, H as HostPagesCoreOptions } from './host-pages-core-DLfMeDrO.js';
|
|
4
|
-
import { b as FgModuleDefault, c as FgComponentLike, d as FgComponentEntry } from './remote-types-
|
|
4
|
+
import { b as FgModuleDefault, c as FgComponentLike, d as FgComponentEntry } from './remote-types-CMtfvLcH.js';
|
|
5
5
|
import { FgRemoteTypes } from '@fulgurjs/federation/internal/registry.js';
|
|
6
|
-
import './bridge-core-
|
|
6
|
+
import './bridge-core-Dm6ABUxQ.js';
|
|
7
7
|
import './context.js';
|
|
8
8
|
|
|
9
9
|
/** Vue 适配层只接收加载函数,不静态引用运行时内核。 */
|
package/dist/vue.d.ts
CHANGED
|
@@ -203,7 +203,7 @@ type FgBridgeAppProps<S extends string> = S extends keyof FgRemoteTypes ? FgRemo
|
|
|
203
203
|
} ? D extends BridgeApp ? FgBridgePropsOf<D> : never : never : Record<string, unknown>;
|
|
204
204
|
|
|
205
205
|
/**
|
|
206
|
-
* Vue
|
|
206
|
+
* Vue 宿主桥接工厂(公开入口 /vue 导出 createVueBridgeApp)。
|
|
207
207
|
*
|
|
208
208
|
* 定位:接收注入的 loadRemote(不静态引用运行时内核,dist 壳绑定),返回一个
|
|
209
209
|
* 包装组件 `{ appProps: P; sessionKey?: string | null }`,负责:
|
|
@@ -228,6 +228,13 @@ interface VueBridgeAppOptions {
|
|
|
228
228
|
timeout?: number;
|
|
229
229
|
/** 无副作用的同步 getter:首次、重试及换会话的实际加载前返回本次所需上下文快照 */
|
|
230
230
|
getContext?: () => Partial<AppContext> & Record<string, unknown>;
|
|
231
|
+
/**
|
|
232
|
+
* 自动会话:响应式地返回非敏感用户标识;null=已退出,undefined=用户资料恢复中。
|
|
233
|
+
* 同身份刷新/token轮换不换代,换身份自动重挂。不要再传 sessionKey prop 或在上下文里手填代次。
|
|
234
|
+
*/
|
|
235
|
+
session?: () => string | number | null | undefined;
|
|
236
|
+
/** 自动会话命名空间;同一宿主的多个远程应使用同一键,默认 fulgurjs-bridge-session。 */
|
|
237
|
+
sessionStorageKey?: string;
|
|
231
238
|
}
|
|
232
239
|
/**
|
|
233
240
|
* 构建 Vue 宿主桥接工厂(dist 壳与 dev 门面绑定各自运行时的 loadRemote 后导出)。
|
|
@@ -454,9 +461,9 @@ interface RemoteSetupContext {
|
|
|
454
461
|
sessionKey?: string;
|
|
455
462
|
signal: AbortSignal;
|
|
456
463
|
}
|
|
457
|
-
/** setup
|
|
464
|
+
/** setup 模块至少声明一项能力;无应用级副作用时不要求手写空默认函数。 */
|
|
458
465
|
interface RemoteSetupModule {
|
|
459
|
-
default
|
|
466
|
+
default?: (ctx: RemoteSetupContext) => void | Promise<void>;
|
|
460
467
|
onSession?: (ctx: RemoteSetupContext) => void | Promise<void>;
|
|
461
468
|
/**
|
|
462
469
|
* 远程暴露面依赖的「宿主全局注册组件」声明(键=组件注册名,值=组件对象或零参 loader):
|
package/dist/vue.js
CHANGED
|
@@ -7,13 +7,14 @@ import { defineBridgeApp as defineVueBridgeApp } from "./bridge-app-vue.js";
|
|
|
7
7
|
import { createVueBridgeAppWithLoader } from "./bridge-host-vue.js";
|
|
8
8
|
import { createVueBridgeNavigation, connectVueBridgeRouter, installVueBridgeRouter } from "./bridge-router-vue.js";
|
|
9
9
|
import { createBridgeSession } from "./bridge-session.js";
|
|
10
|
+
import { createAutomaticBridgeSession } from "./bridge-session-auto.js";
|
|
10
11
|
import { hasBridgeMount } from "./bridge-core.js";
|
|
11
12
|
export const remoteComponent = /*#__PURE__*/ createRemoteComponent(loadRemote);
|
|
12
13
|
export const createHostPages = (options) => createHostPagesWithLoader(options, loadRemote);
|
|
13
14
|
export const defineBridgeApp = defineVueBridgeApp;
|
|
14
15
|
export { defineApplication } from "./bridge-app-vue.js";
|
|
15
16
|
export { bindStoreToApp } from "./vue-store.js";
|
|
16
|
-
export const createVueBridgeApp = /*#__PURE__*/ createVueBridgeAppWithLoader(loadRemote);
|
|
17
|
+
export const createVueBridgeApp = /*#__PURE__*/ createVueBridgeAppWithLoader(loadRemote, createAutomaticBridgeSession);
|
|
17
18
|
export { createVueBridgeNavigation, connectVueBridgeRouter, installVueBridgeRouter };
|
|
18
19
|
export { createBridgeSession };
|
|
19
20
|
export { hasBridgeMount };
|
package/docs/en/reference/api.md
CHANGED
|
@@ -344,6 +344,8 @@ export const pageProviders: RemoteSetupModule['pageProviders'] = [
|
|
|
344
344
|
|
|
345
345
|
`RemoteSetupContext`: `{ appContext: Readonly<AppContext>, sessionKey?: string, signal: AbortSignal }`. `appContext` is the snapshot taken from the page-level AppContext **at call time** (never a saved stale reference); `signal` is invalidated when the login generation changes or on logout cleanup.
|
|
346
346
|
|
|
347
|
+
A module with only pageProviders/globalComponents/onSession can omit the default function. Empty modules and non-function defaults remain invalid.
|
|
348
|
+
|
|
347
349
|
Fixed contract:
|
|
348
350
|
|
|
349
351
|
| Dimension | Semantics |
|
|
@@ -355,7 +357,7 @@ Fixed contract:
|
|
|
355
357
|
| Execution count (pageProviders) | Declaration is extracted once with setup; **wrapping applies on every component render** (the declared array is cached by reference, successful loader results are reused; rejected loaders evict the cache so same-page retries execute them again). Vue `remoteComponent`/`createHostPages` and React `remoteComponent`/`createReactHostPages` apply it automatically (outer→inner wrap; attrs/slots pass through to the innermost business component; providers receive no props); manual `loadRemote` and `useLoadRemote` (returning the module for self-rendering) do not — wrap yourself there |
|
|
356
358
|
| Execution count (onSession) | Deduplicated by the non-sensitive `sessionKey`: once per login generation; a new generation first invalidates the old `signal`, then chains the old call and the new call **serially** per remote (preventing two accounts' async writes from interleaving); `clearAppContext()` invalidates the dedup state, forcing a rerun on the next login. App-level setup does not re-run on logout/generation switch |
|
|
357
359
|
| sessionKey | The host login flow generates a new generation on every successful login/re-login (non-sensitive ID, never a token); kept when a token refreshes but the session does not. **onSession present but sessionKey missing → MFU-013**; identity is never guessed from a user object reference; remotes without onSession need no sessionKey |
|
|
358
|
-
| Export validation |
|
|
360
|
+
| Export validation | At least one of default/onSession/globalComponents/pageProviders must be declared; any provided default must be a function; the named `onSession` is optional and must be a function; `globalComponents` is optional and must be an object (key = registered name, value = component); `pageProviders` is optional and must be an array (entries = component objects or zero-arg loaders; functions with parameters or `displayName`/`props`/`emits` metadata remain static components; wrap unmarked zero-argument components with `defineComponent`; entry contents are validated at consumer-side resolution). Violations → MFU-011 (reports actual type / expected signature / fix) |
|
|
359
361
|
| Failure and retry | setup/onSession throwing → that `loadRemote` rejects (MFU-012); **only the failed stage's cache is cleared** (after a setup failure the retry starts at setup; an onSession failure only reruns the session segment); already-successful stages are not repeated. `fallbackModule` never masks an initialization failure |
|
|
360
362
|
| Self-recursion | `loadRemote(same remote/…)` inside setup/onSession's synchronous segment → MFU-014 (the call waits on itself, deadlocking). Same-remote recursion inside the async segment cannot be attributed precisely and shows up as a hang — never load same-remote modules inside initialization |
|
|
361
363
|
| dev/prod parity | The dev container (middleware-served) and the prod container (build artifact) carry the same setup metadata (the container's `__fulgurjsSetup` field + the manifest's `setup` field); the internal expose key `./__fulgurjs_setup__` never appears in type artifacts or public exposes lists |
|
|
@@ -444,7 +446,7 @@ export default defineBridgeApp(async (props, ctx) => {
|
|
|
444
446
|
// Vue host (/vue)
|
|
445
447
|
import { createVueBridgeApp } from '@fulgurjs/federation/vue'
|
|
446
448
|
const RemoteReactApp = createVueBridgeApp<P>('react-remote/bridge', {
|
|
447
|
-
loadingComponent?, errorComponent?, retries?, timeout?, getContext?,
|
|
449
|
+
loadingComponent?, errorComponent?, retries?, timeout?, getContext?, session?, sessionStorageKey?,
|
|
448
450
|
})
|
|
449
451
|
// Template: <RemoteReactApp :session-key="loginKey" :app-props="{ userId, onReady }" />
|
|
450
452
|
|
|
@@ -471,12 +473,21 @@ const RemoteVueApp = createReactBridgeApp<P>('vue-remote/bridge', {
|
|
|
471
473
|
- **DOM ownership**: the wrapper component only creates and keeps a stable empty mount container; host re-renders never patch inside the child app's root. React host StrictMode double effects are safe. Vue `<KeepAlive>` deactivate is not unmount — a child app in a cached page keeps its root and state.
|
|
472
474
|
- **Old requests never pretend to be cancelled**: work already inside `loadRemote` is not cancelled because the bridge layer invalidates it — late old results are discarded by generation; the remote's `onSession` must honor the `signal.aborted` contract.
|
|
473
475
|
|
|
476
|
+
### Automatic Vue session options
|
|
477
|
+
|
|
478
|
+
| Option | Type / default | Behavior |
|
|
479
|
+
|---|---|---|
|
|
480
|
+
| `session` | `() => string \| number \| null \| undefined` / disabled | Synchronous reactive identity getter in createVueBridgeApp: stable ID=ready, null=logout, undefined=restoring. The plugin owns generation/context; do not also pass sessionKey. |
|
|
481
|
+
| `sessionStorageKey` | `string` / `fulgurjs-bridge-session` | Records use this namespace plus `:auto`. All remotes of one host share it. Only meaningful with session enabled. |
|
|
482
|
+
|
|
483
|
+
The same identity restores its generation on reentry/reload; a changed identity generates a new one. Never use credentials or sensitive data. localStorage updates must be reflected in reactive state. Omit session to disable, provide a getter to enable, add sessionStorageKey to customize. getContext need not return sessionKey; explicit conflicts remain errors. Getter errors/illegal results appear as MFU-016 (getContext); invalid option types throw TypeError immediately. See [automatic sessions](../guide/app-bridge.md).
|
|
484
|
+
|
|
474
485
|
### Host-side helper: `createBridgeSession` (Vue)
|
|
475
486
|
|
|
476
|
-
`createBridgeSession(options?)` (`/vue`) — moves the **contract semantics** of sessionKey (non-sensitive login generation, never the token itself, null = logged out, unchanged across reloads within one session) into the plugin; the
|
|
487
|
+
`createBridgeSession(options?)` (`/vue`) — moves the **contract semantics** of sessionKey (non-sensitive login generation, never the token itself, null = logged out, unchanged across reloads within one session) into the plugin; this is the explicit-control helper. Normal Vue bridges should use the factory session identity getter instead of manual calls:
|
|
477
488
|
|
|
478
489
|
```ts
|
|
479
|
-
// src/fulgurjs/host/
|
|
490
|
+
// src/fulgurjs/host/context.ts (create once at module level)
|
|
480
491
|
import { createBridgeSession } from '@fulgurjs/federation/vue'
|
|
481
492
|
export const bridgeSession = createBridgeSession()
|
|
482
493
|
// on successful login → bridgeSession.renew(); on logout → bridgeSession.clear()
|
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
| `MFU-008` | Runtime reports an unknown remote | The remote name in the spec/call is not in `remotes`/the runtime registry | Check the remote name spelling; for dynamic remotes call `registerRemote`/`registerRemotes` first |
|
|
67
67
|
| `MFU-009` | Runtime reports the loaded module has no exports | The expose target file has no exports (an empty module / side effects only) | Add exports to the expose target file; confirm the expected file is what got loaded |
|
|
68
68
|
| `MFU-010` | Runtime warns the selected shared singleton version fails some consumer's requirement (lists candidate versions, the provider, impact, and fixes; the same combination warns once) | The version singleton converged on is outside some consumer's requiredVersion; or a bridge host/child app missing singleton causes double-instance symptoms (Invalid hook call) | Align dependency versions; confirm the warning is acceptable or adjust requiredVersion; three singleton keys for cross-framework hosts |
|
|
69
|
-
| `MFU-011` | Runtime reports an illegal setup lifecycle entry export shape (reports actual type / expected signature / fix) |
|
|
69
|
+
| `MFU-011` | Runtime reports an illegal setup lifecycle entry export shape (reports actual type / expected signature / fix) | Empty setup module, non-function default/onSession, or invalid component/Provider declarations | Export an initialization function or valid onSession/globalComponents/pageProviders; no empty function is required and an empty module is invalid |
|
|
70
70
|
| `MFU-012` | That `loadRemote` rejects, reporting setup/onSession threw (cause carries the original exception) | The initialization code itself threw | Fix the error inside setup/onSession and retry directly — only the failed stage's cache is cleared (after a setup failure the retry starts at setup; an onSession failure only reruns the session segment); already-successful stages are not repeated |
|
|
71
71
|
| `MFU-013` | Runtime reports the remote declares onSession but the host AppContext lacks sessionKey | The host did not provide a non-sensitive login generation ID (never use a token as one) | In the host login flow call `provideAppContext({ sessionKey })` — generate a new value on every successful login/re-login; token refreshes keep it |
|
|
72
72
|
| `MFU-014` | Runtime reports a recursive loadRemote of the same remote inside setup/onSession's synchronous segment | Loading a module of the same remote inside the initialization's synchronous segment — the call waits on itself, deadlocking | Do not load same-remote modules inside initialization; put cross-remote loads in the async segment |
|
|
@@ -213,10 +213,9 @@ Import from: `@fulgurjs/federation/react`, `@fulgurjs/federation/runtime`, `@ful
|
|
|
213
213
|
|
|
214
214
|
| Field | Optional | Type | Contract |
|
|
215
215
|
|---|---|---|---|
|
|
216
|
-
| `default` |
|
|
216
|
+
| `default` | yes | `(ctx: RemoteSetupContext) => void \| Promise<void>` | See the owning API for lifecycle and runtime defaults. |
|
|
217
217
|
| `onSession` | yes | `(ctx: RemoteSetupContext) => void \| Promise<void>` | See the owning API for lifecycle and runtime defaults. |
|
|
218
218
|
| `globalComponents` | yes | `Record<string, unknown>` | Static components retain their identity. Zero-argument functions with displayName/props/emits metadata are components; unmarked zero-argument functions are lazy loaders. See the setup API for installation and retry semantics. |
|
|
219
|
-
|
|
220
219
|
| `pageProviders` | yes | `unknown[]` | Ancestor Providers required by remote components; each item is a component or zero-argument loader. Adapters wrap the actual consumer tree without copying the provider application. |
|
|
221
220
|
|
|
222
221
|
## AppContext
|
|
@@ -433,6 +432,9 @@ Import from: `@fulgurjs/federation/vue`.
|
|
|
433
432
|
| `retries` | yes | `number` | See the owning API for lifecycle and runtime defaults. |
|
|
434
433
|
| `timeout` | yes | `number` | See the owning API for lifecycle and runtime defaults. |
|
|
435
434
|
| `getContext` | yes | `() => Partial<AppContext> & Record<string, unknown>` | See the owning API for lifecycle and runtime defaults. |
|
|
435
|
+
| `session` | yes | `() => string \| number \| null \| undefined` | Reactive non-sensitive identity; managed generations. null=logout, undefined=restoring; do not combine with sessionKey. |
|
|
436
|
+
| `sessionStorageKey` | yes | `string` | Automatic session namespace; defaults to fulgurjs-bridge-session and is shared by one host. |
|
|
437
|
+
|
|
436
438
|
|
|
437
439
|
## VueBridgeRouterConnection
|
|
438
440
|
|
package/docs/zh/reference/api.md
CHANGED
|
@@ -339,6 +339,8 @@ export const pageProviders: RemoteSetupModule['pageProviders'] = [
|
|
|
339
339
|
|
|
340
340
|
`RemoteSetupContext`:`{ appContext: Readonly<AppContext>, sessionKey?: string, signal: AbortSignal }`。`appContext` 是**调用时**从页面级 AppContext 取得的快照(不保存永不更新的旧引用);`signal` 在登录代次变化或退出清理时失效。
|
|
341
341
|
|
|
342
|
+
没有应用级副作用时可只导出 pageProviders/globalComponents/onSession,省略默认函数;模块至少有一项有效声明,不为通过校验写空函数。
|
|
343
|
+
|
|
342
344
|
固定契约:
|
|
343
345
|
|
|
344
346
|
| 维度 | 语义 |
|
|
@@ -348,10 +350,9 @@ export const pageProviders: RemoteSetupModule['pageProviders'] = [
|
|
|
348
350
|
| 执行次数(setup) | 每容器一次;并发调用共享同一 Promise;成功后不重复。`preloadRemote` 只预取资源不执行 |
|
|
349
351
|
| 执行次数(globalComponents) | 声明提取随 setup 一次;**安装随每次 `loadRemote` 执行**(幂等,`app.component` 同名覆盖,后注册生效)——桥接子应用每次挂载新建 app 实例也能拿到注册。Vue `remoteComponent` 和 `createHostPages` 自动捕获消费方 app;手动 `loadRemote` 与 React 侧不自动传入(React 无 Vue 全局注册表)——跳过安装,不报错。注册随消费方 app 生命周期驻留,无独立卸载 API |
|
|
350
352
|
| 执行次数(pageProviders) | 声明提取随 setup 一次;**包裹随每次组件渲染生效**(声明数组按引用缓存,成功的 loader 结果复用,失败清缓存允许同页重试;setup 重跑换新数组时也重新解析)。Vue `remoteComponent`/`createHostPages` 与 React `remoteComponent`/`createReactHostPages` 自动应用(按 外→内 包裹,attrs/slots 透传给最内层业务组件,Provider 不收 props);手动 `loadRemote` 与 `useLoadRemote`(返回模块自行渲染)不自动应用——这类消费自行包裹 |
|
|
351
|
-
| 导出校验 |
|
|
353
|
+
| 导出校验 | 默认函数可省略,但必须声明 default/onSession/globalComponents/pageProviders 中至少一项;已有默认导出必须为函数,具名 `onSession` 可选且必须是函数;`globalComponents` 可选且必须是对象(键=注册名,值=组件);`pageProviders` 可选且必须是数组(项=组件对象或零参 loader,带参函数或带 `displayName`/`props`/`emits` 元数据的函数视为静态函数组件;无元数据的零参组件请用 `defineComponent` 包装;项内容在消费方解析时校验)。违反 → MFU-011(报实际类型/预期签名/修法) |
|
|
352
354
|
| 执行次数(onSession) | 按非敏感 `sessionKey` 去重:同一登录代次一次;新代次先作废旧 `signal`,再按远程**串行**衔接旧调用与新调用(防两账号异步写入交错);`clearAppContext()` 失效去重状态,下次登录必须重跑。应用级 setup 不因退出/换代重复执行 |
|
|
353
355
|
| sessionKey | 宿主登录流程每次成功登录/重登生成新代次(非敏感 ID,禁止用 token);token 刷新但会话未变时沿用。**有 onSession 却缺 sessionKey → MFU-013**,不凭用户对象引用猜测身份;无 onSession 的远程无需 sessionKey |
|
|
354
|
-
| 导出校验 | 必须默认导出函数;具名 `onSession` 可选且必须是函数;`globalComponents` 可选且必须是对象(键=注册名,值=组件)。违反 → MFU-011(报实际类型/预期签名/修法) |
|
|
355
356
|
| 失败与重试 | setup/onSession 抛错 → 该次 `loadRemote` 拒绝(MFU-012);**只清失败阶段的缓存**(setup 失败重试从 setup 开始;onSession 失败只重跑会话段),已成功的阶段不重复。`fallbackModule` 不掩盖初始化失败 |
|
|
356
357
|
| 自递归 | setup/onSession 同步段内 `loadRemote(同 remote/…)` → MFU-014(该调用会等待自身形成死锁)。异步段内的同远程递归无法精确归因,表现为挂起——不要在初始化内加载同远程模块 |
|
|
357
358
|
| dev/prod 一致 | dev 容器(中间件直出)与 prod 容器(构建产物)携带同一 setup 元数据(容器上的 `__fulgurjsSetup` 字段 + manifest 的 `setup` 字段);内部 expose 键 `./__fulgurjs_setup__` 不出现在类型产物与公开文档 exposes 清单中 |
|
|
@@ -440,7 +441,7 @@ export default defineBridgeApp(async (props, ctx) => {
|
|
|
440
441
|
// Vue 宿主(/vue)
|
|
441
442
|
import { createVueBridgeApp } from '@fulgurjs/federation/vue'
|
|
442
443
|
const RemoteReactApp = createVueBridgeApp<P>('react-remote/bridge', {
|
|
443
|
-
loadingComponent?, errorComponent?, retries?, timeout?, getContext?,
|
|
444
|
+
loadingComponent?, errorComponent?, retries?, timeout?, getContext?, session?, sessionStorageKey?,
|
|
444
445
|
})
|
|
445
446
|
// 模板:<RemoteReactApp :session-key="loginKey" :app-props="{ userId, onReady }" />
|
|
446
447
|
|
|
@@ -454,7 +455,7 @@ const RemoteVueApp = createReactBridgeApp<P>('vue-remote/bridge', {
|
|
|
454
455
|
|
|
455
456
|
| 项 | `createVueBridgeApp`(Vue 宿主) | `createReactBridgeApp`(React 宿主) |
|
|
456
457
|
|---|---|---|
|
|
457
|
-
| 工厂选项 | `loadingComponent?` `errorComponent?`(收到 `error` prop,完全接管) `retries?`(0–10 整数) `timeout?`(正有限 ms) `getContext?` | `fallback?`(pending 占位) `error?`(节点或 `(error, retry) => ReactNode`) `retries?` `timeout?` `getContext?` |
|
|
458
|
+
| 工厂选项 | `loadingComponent?` `errorComponent?`(收到 `error` prop,完全接管) `retries?`(0–10 整数) `timeout?`(正有限 ms) `getContext?` `session?` `sessionStorageKey?` | `fallback?`(pending 占位) `error?`(节点或 `(error, retry) => ReactNode`) `retries?` `timeout?` `getContext?` |
|
|
458
459
|
| 返回组件 props | `appProps: P`(业务数据)+ `sessionKey?: string \| null`(控制参数,不混入业务 props) | 同左,`ComponentType<{ appProps: P; sessionKey?: string \| null }>` |
|
|
459
460
|
| 泛型 | `createVueBridgeApp<P>(spec, options?)`,P 只约束 `appProps` | 同左 |
|
|
460
461
|
| spec | 完整 `<remote>/<expose>`,与 `remoteComponent` 同一解析规则;无 remotePrefixes/schema/deriveSpec | 同左 |
|
|
@@ -467,12 +468,21 @@ const RemoteVueApp = createReactBridgeApp<P>('vue-remote/bridge', {
|
|
|
467
468
|
- **DOM 所有权**:包装组件只创建并保持稳定的空挂载容器;宿主重渲染不 patch 子应用 root 内部。React 宿主 StrictMode 双 effect 安全。Vue `<KeepAlive>` 的 deactivate 不是卸载——缓存页中的子应用保有 root 与状态。
|
|
468
469
|
- **旧请求不冒充取消**:已进入 `loadRemote` 的工作不因桥接层作废而被取消——迟到的旧结果按代次丢弃;远程 `onSession` 必须遵守 `signal.aborted` 契约。
|
|
469
470
|
|
|
471
|
+
### Vue 自动会话选项
|
|
472
|
+
|
|
473
|
+
| 选项 | 类型 / 默认 | 配置与效果 |
|
|
474
|
+
|---|---|---|
|
|
475
|
+
| `session` | `() => string \| number \| null \| undefined` / 不启用 | createVueBridgeApp 的同步响应式身份 getter;非空标识=登录就绪,null=退出,undefined=恢复中。插件管理代次与AppContext,不能同时传sessionKey prop。 |
|
|
476
|
+
| `sessionStorageKey` | `string` / `fulgurjs-bridge-session` | 自动记录写入此命名空间的 `:auto` 键。同一宿主的远程使用相同命名空间;只在 session 启用时有意义。 |
|
|
477
|
+
|
|
478
|
+
同身份重进/刷新恢复同代次,身份变化新建代次,token不参与身份判断。身份记录不能包含凭据或敏感资料;localStorage变化必须反映到响应式状态。关闭:省略session;开启:在工厂提供身份getter;自定义:同时提供sessionStorageKey。getContext不需要返回sessionKey;显式矛盾仍拒绝。getter非法返回值/抛错显示MFU-016(getContext),配置类型错误立即抛出TypeError。详见[自动会话](../guide/app-bridge.md)。
|
|
479
|
+
|
|
470
480
|
### 宿主侧辅助:`createBridgeSession`(Vue)
|
|
471
481
|
|
|
472
|
-
`createBridgeSession(options?)`(`/vue`)——把 sessionKey 的**契约语义**(非敏感登录代次、禁用 token 充当、null
|
|
482
|
+
`createBridgeSession(options?)`(`/vue`)——把 sessionKey 的**契约语义**(非敏感登录代次、禁用 token 充当、null=登出、同会话刷新不变)收进插件,这是显式控制工具;常规Vue桥接推荐配置工厂 `session` 身份 getter,由插件自动管理,不必调用下方方法:
|
|
473
483
|
|
|
474
484
|
```ts
|
|
475
|
-
// src/fulgurjs/host/
|
|
485
|
+
// src/fulgurjs/host/context.ts(模块级创建一次)
|
|
476
486
|
import { createBridgeSession } from '@fulgurjs/federation/vue'
|
|
477
487
|
export const bridgeSession = createBridgeSession()
|
|
478
488
|
// 登录成功 → bridgeSession.renew();退出登录 → bridgeSession.clear()
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
| `MFU-008` | 运行时报未知远程 | spec/调用里的远程名不在 `remotes`/运行时注册表里 | 核对远程名拼写;动态远程先 `registerRemote`/`registerRemotes` |
|
|
66
66
|
| `MFU-009` | 运行时报加载到的模块没有任何导出 | expose 目标文件没有导出(空模块/只有副作用) | 给 expose 目标文件补导出;确认加载的是预期文件 |
|
|
67
67
|
| `MFU-010` | 运行时警告选中的共享单例版本不满足某消费方要求(列出候选版本、提供方、影响与修法;同一组合只告警一次) | singleton 收敛到的版本不在某消费方 requiredVersion 内;或桥接宿主/子应用缺 singleton 导致双实例症状(Invalid hook call) | 统一依赖版本;确认告警可接受或调整 requiredVersion;跨框架宿主三键 singleton |
|
|
68
|
-
| `MFU-011` | 运行时报 setup 生命周期入口导出形态非法(报实际类型/预期签名/修法) | setup
|
|
68
|
+
| `MFU-011` | 运行时报 setup 生命周期入口导出形态非法(报实际类型/预期签名/修法) | setup模块为空、已有默认导出/onSession不是函数,或组件/Provider声明形态非法 | 默认导出初始化函数,或声明有效onSession/globalComponents/pageProviders;无需空函数,不接受空模块 |
|
|
69
69
|
| `MFU-012` | 该次 `loadRemote` 拒绝,报 setup/onSession 执行抛错(cause 含原始异常) | 初始化代码自身抛错 | 修复 setup/onSession 内部错误后直接重试——只清失败阶段缓存(setup 失败重试从 setup 开始;onSession 失败只重跑会话段),已成功阶段不重复 |
|
|
70
70
|
| `MFU-013` | 运行时报远程声明 onSession 但宿主 AppContext 缺 sessionKey | 宿主未提供非敏感登录代次 ID(禁止用 token 充当) | 宿主登录流程 `provideAppContext({ sessionKey })`——每次成功登录/重登生成新值,token 刷新沿用 |
|
|
71
71
|
| `MFU-014` | 运行时报 setup/onSession 同步段内递归 loadRemote 同一远程 | 初始化同步段内加载同远程模块——该调用会等待自身形成死锁 | 初始化内不要加载同远程模块;跨远程加载放异步段 |
|
|
@@ -213,10 +213,9 @@ setup/onSession 收到的上下文.
|
|
|
213
213
|
|
|
214
214
|
| 字段 | 可省略 | 类型 | 说明 |
|
|
215
215
|
|---|---|---|---|
|
|
216
|
-
| `default` |
|
|
216
|
+
| `default` | yes | `(ctx: RemoteSetupContext) => void \| Promise<void>` | 见对应 API 合同。 |
|
|
217
217
|
| `onSession` | yes | `(ctx: RemoteSetupContext) => void \| Promise<void>` | 见对应 API 合同。 |
|
|
218
218
|
| `globalComponents` | yes | `Record<string, unknown>` | 远程暴露面依赖的「宿主全局注册组件」声明(键=组件注册名,值=组件对象或零参 loader): 组件联邦(remoteComponent)把远程组件渲染进消费方 app 上下文,模板里的 字符串标签(如 <a-divider>)按消费方 app 的全局注册表解析——消费方没注册就 渲染成死元素。提供方在此声明后,运行时在每次 loadRemote 时把它们幂等注册到 当次传入的 consumerApp 上;无 consumerApp(无组件上下文的手动加载)时静默跳过。 值推荐「零参 loader(() => import('./X.vue'))」:setup 模块保持零重依赖, 组件只在本框架消费方真实渲染时才加载——Vue 适配器注册时自动包 defineAsyncComponent; 静态组件值仍支持;带 displayName/props/emits 的零参函数保留组件身份,未标记零参函数作 loader。运行时对值原样透传。 |
|
|
219
|
-
|
|
220
219
|
| `pageProviders` | yes | `unknown[]` | 远程组件所需的祖先 Provider;元素为组件或零参 loader。由组件适配器包裹实际消费树,不复制提供方整个 app。 |
|
|
221
220
|
|
|
222
221
|
## AppContext
|
|
@@ -419,6 +418,9 @@ Vue 宿主桥接的加载与上下文选项.
|
|
|
419
418
|
| `retries` | yes | `number` | 透传现行 loadRemote 的重试选项(0-10 整数),不另叠自动重试 |
|
|
420
419
|
| `timeout` | yes | `number` | 本次桥接加载等待上限 ms;不取消已发出的共享请求,迟到结果一律丢弃 |
|
|
421
420
|
| `getContext` | yes | `() => Partial<AppContext> & Record<string, unknown>` | 无副作用的同步 getter:首次、重试及换会话的实际加载前返回本次所需上下文快照 |
|
|
421
|
+
| `session` | yes | `() => string \| number \| null \| undefined` | 响应式非敏感身份;插件自动管理代次。null退出、undefined恢复中;不与sessionKey prop并用。 |
|
|
422
|
+
| `sessionStorageKey` | yes | `string` | 自动会话命名空间,默认fulgurjs-bridge-session;同一宿主的远程一致。 |
|
|
423
|
+
|
|
422
424
|
|
|
423
425
|
## VueBridgeRouterConnection
|
|
424
426
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# fulgurjs-federation 模板(examples/templates/)
|
|
2
2
|
|
|
3
|
-
> 五个模板统一使用
|
|
3
|
+
> 五个模板统一使用 defineApplication 装配。按各模板 README 的冻结安装命令安装 registry 正式包。
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
五个可独立复制、`pnpm install` 后直接运行的联邦接入模板。全部使用 **npm registry 正式包** `@fulgurjs/federation`(精确版本 + pnpm 锁文件,钉定版本见各模板 package.json;统一入口 /vue、/react、/runtime——模板代码即统一入口用法),不依赖本仓库源码、workspace 或父目录。
|
|
@@ -11,6 +11,10 @@
|
|
|
11
11
|
|
|
12
12
|
普通组件/模块参考 vue-vue 或 react-react 的 config 和消费视图;完整子应用参考跨框架模板的 application 与宿主挂载视图;需要 URL 同步时参考 showcase。不需要的会话、路由和 Provider 不要一起复制。自动工具遇到复杂业务装配会保留人工待办,不能把生成文件视为已验收。
|
|
13
13
|
|
|
14
|
+
## 接入代码目录
|
|
15
|
+
|
|
16
|
+
五模板统一采用 `src/fulgurjs/host/`、`exposes/`、`types/`:宿主装配及会话放 `host/`,远程装配和对外组件/模块放 `exposes/`,同步声明放 `types/`。根部仅按需保留 `setup.ts`,不用的目录不创建。原 `src/main.ts(x)` 只启动对应 `application`;原业务 App、页面仍在原位置。完整说明与文件格式见[已有应用接入指南](https://github.com/chenmingye/fulgurjs-federation/blob/master/docs/zh/guide/existing-apps.md#接入文件集中放在哪里)。
|
|
17
|
+
|
|
14
18
|
## 获取模板的两种方式
|
|
15
19
|
|
|
16
20
|
```bash
|
|
@@ -39,8 +39,8 @@ pnpm prod
|
|
|
39
39
|
|
|
40
40
|
| 文件 | 职责 |
|
|
41
41
|
|---|---|
|
|
42
|
-
| `react-host/src/application.tsx` | 本应用唯一装配;main 只负责调用 start |
|
|
43
|
-
| `vue-remote/src/application.ts` | 本应用唯一装配;main 只负责调用 start |
|
|
42
|
+
| `react-host/src/fulgurjs/host/application.tsx` | 本应用唯一装配;main 只负责调用 start |
|
|
43
|
+
| `vue-remote/src/fulgurjs/exposes/application.ts` | 本应用唯一装配;main 只负责调用 start |
|
|
44
44
|
| `react-host/fulgurjs.config.ts` | 本应用的远程地址、exposes、实际共享依赖 |
|
|
45
45
|
| `vue-remote/fulgurjs.config.ts` | 本应用的远程地址、exposes、实际共享依赖 |
|
|
46
46
|
| `scripts/dev.mjs` / `scripts/prod.mjs` | 统一开发/生产启动器;业务接入不复制它们到应用源码 |
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
/** 宿主装配入口:main 只调用 start;在这里连接本工程的路由与远程挂载,原业务页面仍在 pages/。 */
|
|
1
2
|
import { StrictMode, useCallback, useState } from 'react'
|
|
2
3
|
import { defineApplication } from '@fulgurjs/federation/react'
|
|
3
4
|
import { clearAppContext } from '@fulgurjs/federation/react'
|
|
4
5
|
import { createReactBridgeApp } from '@fulgurjs/federation/react'
|
|
5
|
-
import { getLatestHostContext, login, logout } from './
|
|
6
|
+
import { getLatestHostContext, login, logout } from './session'
|
|
6
7
|
|
|
7
8
|
// 工厂选项:fallback(pending 占位)、error(节点或 (error, retry) => ReactNode)、
|
|
8
9
|
// retries、timeout、getContext 与 Vue 宿主同语义
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import application from './application'
|
|
1
|
+
import application from './fulgurjs/host/application'
|
|
2
2
|
void application.start('#root').catch(console.error)
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
## 按顺序读源码
|
|
6
6
|
|
|
7
|
-
1. `fulgurjs.config.ts`:`./bridge` 直接 expose `src/application.ts`,公开模块名称不受文件名称约束。
|
|
8
|
-
2. `src/application.ts`:`defineApplication` 唯一装配;独立模式用浏览器路由,桥接模式用本地 memory 路由,两者显示同一套真实页面、计数与 props。
|
|
7
|
+
1. `fulgurjs.config.ts`:`./bridge` 直接 expose `src/fulgurjs/exposes/application.ts`,公开模块名称不受文件名称约束。
|
|
8
|
+
2. `src/fulgurjs/exposes/application.ts`:`defineApplication` 唯一装配;独立模式用浏览器路由,桥接模式用本地 memory 路由,两者显示同一套真实页面、计数与 props。
|
|
9
9
|
3. `src/main.ts`:只调用 application.start,不再复制初始化或新增转发文件。
|
|
10
10
|
4. `react-host/`:宿主的挂载、会话与回调,见[组合说明](../README.md)。
|
|
11
11
|
|
|
@@ -8,7 +8,7 @@ export default {
|
|
|
8
8
|
name: 'bridge-vue-remote',
|
|
9
9
|
filename: 'fulgurjs-remoteEntry.js',
|
|
10
10
|
exposes: {
|
|
11
|
-
'./bridge': './src/application.ts',
|
|
11
|
+
'./bridge': './src/fulgurjs/exposes/application.ts',
|
|
12
12
|
},
|
|
13
13
|
shared: {
|
|
14
14
|
vue: { singleton: true, requiredVersion: '^3.4.0' },
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
2
|
import { onMounted, ref } from 'vue'
|
|
3
3
|
import { RouterView, useRoute, useRouter } from 'vue-router'
|
|
4
|
-
import type { BridgeVueProps } from './application'
|
|
4
|
+
import type { BridgeVueProps } from './fulgurjs/exposes/application'
|
|
5
5
|
const props = defineProps<BridgeVueProps>()
|
|
6
6
|
const route = useRoute()
|
|
7
7
|
const router = useRouter()
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
/** 应用装配入口:main 只调用 start;独立与嵌入复用本工厂,每次挂载的实例和清理由插件管理。 */
|
|
1
2
|
import { createApp } from 'vue'
|
|
2
3
|
import { createMemoryHistory, createWebHistory, createRouter } from 'vue-router'
|
|
3
4
|
import { defineApplication } from '@fulgurjs/federation/vue'
|
|
4
|
-
import App from '
|
|
5
|
-
import HomePage from '
|
|
6
|
-
import AboutPage from '
|
|
5
|
+
import App from '../../App.vue'
|
|
6
|
+
import HomePage from '../../HomePage.vue'
|
|
7
|
+
import AboutPage from '../../AboutPage.vue'
|
|
7
8
|
|
|
8
9
|
export interface BridgeVueProps { label?: string; onReady?: () => void }
|
|
9
10
|
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import application from './application'
|
|
1
|
+
import application from './fulgurjs/exposes/application'
|
|
2
2
|
void application.start('#app', { label: '独立 Vue 子应用' }).catch(console.error)
|