@module-federation/runtime 0.0.0-next-20240311023539 → 0.0.0-next-20240318072254
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/README.md +70 -3
- package/dist/index.cjs.js +90 -28
- package/dist/index.esm.js +92 -31
- package/dist/package.json +1 -1
- package/dist/share.cjs.js +1 -1
- package/dist/share.esm.js +2 -2
- package/dist/src/core.d.ts +5 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/utils/load.d.ts +1 -0
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -212,15 +212,15 @@ init({
|
|
|
212
212
|
remotes: [
|
|
213
213
|
{
|
|
214
214
|
name: '@demo/sub1',
|
|
215
|
-
entry: 'http://localhost:2001/
|
|
215
|
+
entry: 'http://localhost:2001/mf-manifest.json',
|
|
216
216
|
},
|
|
217
217
|
{
|
|
218
218
|
name: '@demo/sub2',
|
|
219
|
-
entry: 'http://localhost:2001/
|
|
219
|
+
entry: 'http://localhost:2001/mf-manifest.json',
|
|
220
220
|
},
|
|
221
221
|
{
|
|
222
222
|
name: '@demo/sub3',
|
|
223
|
-
entry: 'http://localhost:2001/
|
|
223
|
+
entry: 'http://localhost:2001/mf-manifest.json',
|
|
224
224
|
},
|
|
225
225
|
],
|
|
226
226
|
});
|
|
@@ -258,6 +258,73 @@ preloadRemote([
|
|
|
258
258
|
]);
|
|
259
259
|
```
|
|
260
260
|
|
|
261
|
+
### registerRemotes
|
|
262
|
+
|
|
263
|
+
- Type: `registerRemotes(remotes: Remote[], options?: { force?: boolean }): void`
|
|
264
|
+
- Used to register remotes after init .
|
|
265
|
+
|
|
266
|
+
- Type
|
|
267
|
+
|
|
268
|
+
```typescript
|
|
269
|
+
function registerRemotes(remotes: Remote[], options?: { force?: boolean }) {}
|
|
270
|
+
|
|
271
|
+
type Remote = (RemoteWithEntry | RemoteWithVersion) & RemoteInfoCommon;
|
|
272
|
+
|
|
273
|
+
interface RemoteInfoCommon {
|
|
274
|
+
alias?: string;
|
|
275
|
+
shareScope?: string;
|
|
276
|
+
type?: RemoteEntryType;
|
|
277
|
+
entryGlobalName?: string;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
interface RemoteWithEntry {
|
|
281
|
+
name: string;
|
|
282
|
+
entry: string;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
interface RemoteWithVersion {
|
|
286
|
+
name: string;
|
|
287
|
+
version: string;
|
|
288
|
+
}
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
- Details
|
|
292
|
+
**info**: Please be careful when setting `force:true` !
|
|
293
|
+
|
|
294
|
+
If set `force: true`, it will merge remote(include loaded remote), and remove loaded remote cache , as well as console.warn to tell this action may have risks.
|
|
295
|
+
|
|
296
|
+
* Example
|
|
297
|
+
|
|
298
|
+
```ts
|
|
299
|
+
import { init, registerRemotes } from '@module-federation/runtime';
|
|
300
|
+
|
|
301
|
+
init({
|
|
302
|
+
name: '@demo/register-new-remotes',
|
|
303
|
+
remotes: [
|
|
304
|
+
{
|
|
305
|
+
name: '@demo/sub1',
|
|
306
|
+
entry: 'http://localhost:2001/mf-manifest.json',
|
|
307
|
+
}
|
|
308
|
+
],
|
|
309
|
+
});
|
|
310
|
+
|
|
311
|
+
// add new remote @demo/sub2
|
|
312
|
+
registerRemotes([
|
|
313
|
+
{
|
|
314
|
+
name: '@demo/sub2',
|
|
315
|
+
entry: 'http://localhost:2002/mf-manifest.json',
|
|
316
|
+
}
|
|
317
|
+
]);
|
|
318
|
+
|
|
319
|
+
// override previous remote @demo/sub1
|
|
320
|
+
registerRemotes([
|
|
321
|
+
{
|
|
322
|
+
name: '@demo/sub1',
|
|
323
|
+
entry: 'http://localhost:2003/mf-manifest.json',
|
|
324
|
+
}
|
|
325
|
+
]);
|
|
326
|
+
```
|
|
327
|
+
|
|
261
328
|
## hooks
|
|
262
329
|
|
|
263
330
|
Lifecycle hooks for FederationHost interaction.
|
package/dist/index.cjs.js
CHANGED
|
@@ -160,9 +160,13 @@ async function loadEntryScript({ name, globalName, entry, createScriptHook }) {
|
|
|
160
160
|
return e;
|
|
161
161
|
});
|
|
162
162
|
}
|
|
163
|
+
function getRemoteEntryUniqueKey(remoteInfo) {
|
|
164
|
+
const { entry, name } = remoteInfo;
|
|
165
|
+
return sdk.composeKeyWithSeparator(name, entry);
|
|
166
|
+
}
|
|
163
167
|
async function getRemoteEntry({ remoteEntryExports, remoteInfo, createScriptHook }) {
|
|
164
168
|
const { entry, name, type, entryGlobalName } = remoteInfo;
|
|
165
|
-
const uniqueKey =
|
|
169
|
+
const uniqueKey = getRemoteEntryUniqueKey(remoteInfo);
|
|
166
170
|
if (remoteEntryExports) {
|
|
167
171
|
return remoteEntryExports;
|
|
168
172
|
}
|
|
@@ -1020,9 +1024,14 @@ class SnapshotHandler {
|
|
|
1020
1024
|
return manifestJson;
|
|
1021
1025
|
}
|
|
1022
1026
|
try {
|
|
1023
|
-
|
|
1027
|
+
const headers = sdk.getHeaders();
|
|
1028
|
+
let res = await this.loaderHook.lifecycle.fetch.emit(manifestUrl, {
|
|
1029
|
+
headers
|
|
1030
|
+
});
|
|
1024
1031
|
if (!res || !(res instanceof Response)) {
|
|
1025
|
-
res = await fetch(manifestUrl, {
|
|
1032
|
+
res = await fetch(manifestUrl, {
|
|
1033
|
+
headers
|
|
1034
|
+
});
|
|
1026
1035
|
}
|
|
1027
1036
|
manifestJson = await res.json();
|
|
1028
1037
|
share.assert(manifestJson.metaData && manifestJson.exposes && manifestJson.shared, `${manifestUrl} is not a federation manifest`);
|
|
@@ -1478,30 +1487,9 @@ class FederationHost {
|
|
|
1478
1487
|
});
|
|
1479
1488
|
const userRemotes = userOptionsRes.remotes || [];
|
|
1480
1489
|
const remotes = userRemotes.reduce((res, remote)=>{
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
// As multi-level path references cannot guarantee unique names, alias being a prefix of remote.name is not supported
|
|
1485
|
-
const findEqual = res.find((item)=>{
|
|
1486
|
-
var _item_alias;
|
|
1487
|
-
return remote.alias && (item.name.startsWith(remote.alias) || ((_item_alias = item.alias) == null ? void 0 : _item_alias.startsWith(remote.alias)));
|
|
1488
|
-
});
|
|
1489
|
-
share.assert(!findEqual, `The alias ${remote.alias} of remote ${remote.name} is not allowed to be the prefix of ${findEqual && findEqual.name} name or alias`);
|
|
1490
|
-
}
|
|
1491
|
-
// Set the remote entry to a complete path
|
|
1492
|
-
if ('entry' in remote) {
|
|
1493
|
-
if (share.isBrowserEnv() && !remote.entry.startsWith('http')) {
|
|
1494
|
-
remote.entry = new URL(remote.entry, window.location.origin).href;
|
|
1495
|
-
}
|
|
1496
|
-
}
|
|
1497
|
-
if (!remote.shareScope) {
|
|
1498
|
-
remote.shareScope = share.DEFAULT_SCOPE;
|
|
1499
|
-
}
|
|
1500
|
-
if (!remote.type) {
|
|
1501
|
-
remote.type = share.DEFAULT_REMOTE_TYPE;
|
|
1502
|
-
}
|
|
1503
|
-
res.push(remote);
|
|
1504
|
-
}
|
|
1490
|
+
this.registerRemote(remote, res, {
|
|
1491
|
+
force: false
|
|
1492
|
+
});
|
|
1505
1493
|
return res;
|
|
1506
1494
|
}, globalOptionsRes.remotes);
|
|
1507
1495
|
// register shared in shareScopeMap
|
|
@@ -1581,6 +1569,74 @@ class FederationHost {
|
|
|
1581
1569
|
}
|
|
1582
1570
|
});
|
|
1583
1571
|
}
|
|
1572
|
+
removeRemote(remote) {
|
|
1573
|
+
const { name } = remote;
|
|
1574
|
+
const remoteIndex = this.options.remotes.findIndex((item)=>item.name === name);
|
|
1575
|
+
if (remoteIndex !== -1) {
|
|
1576
|
+
this.options.remotes.splice(remoteIndex, 1);
|
|
1577
|
+
}
|
|
1578
|
+
const loadedModule = this.moduleCache.get(remote.name);
|
|
1579
|
+
if (loadedModule) {
|
|
1580
|
+
const key = loadedModule.remoteInfo.entryGlobalName;
|
|
1581
|
+
if (globalThis[key]) {
|
|
1582
|
+
delete globalThis[key];
|
|
1583
|
+
}
|
|
1584
|
+
const remoteEntryUniqueKey = getRemoteEntryUniqueKey(loadedModule.remoteInfo);
|
|
1585
|
+
if (share.globalLoading[remoteEntryUniqueKey]) {
|
|
1586
|
+
delete share.globalLoading[remoteEntryUniqueKey];
|
|
1587
|
+
}
|
|
1588
|
+
this.moduleCache.delete(remote.name);
|
|
1589
|
+
}
|
|
1590
|
+
}
|
|
1591
|
+
registerRemote(remote, targetRemotes, options) {
|
|
1592
|
+
const normalizeRemote = ()=>{
|
|
1593
|
+
if (remote.alias) {
|
|
1594
|
+
// Validate if alias equals the prefix of remote.name and remote.alias, if so, throw an error
|
|
1595
|
+
// As multi-level path references cannot guarantee unique names, alias being a prefix of remote.name is not supported
|
|
1596
|
+
const findEqual = targetRemotes.find((item)=>{
|
|
1597
|
+
var _item_alias;
|
|
1598
|
+
return remote.alias && (item.name.startsWith(remote.alias) || ((_item_alias = item.alias) == null ? void 0 : _item_alias.startsWith(remote.alias)));
|
|
1599
|
+
});
|
|
1600
|
+
share.assert(!findEqual, `The alias ${remote.alias} of remote ${remote.name} is not allowed to be the prefix of ${findEqual && findEqual.name} name or alias`);
|
|
1601
|
+
}
|
|
1602
|
+
// Set the remote entry to a complete path
|
|
1603
|
+
if ('entry' in remote) {
|
|
1604
|
+
if (share.isBrowserEnv() && !remote.entry.startsWith('http')) {
|
|
1605
|
+
remote.entry = new URL(remote.entry, window.location.origin).href;
|
|
1606
|
+
}
|
|
1607
|
+
}
|
|
1608
|
+
if (!remote.shareScope) {
|
|
1609
|
+
remote.shareScope = share.DEFAULT_SCOPE;
|
|
1610
|
+
}
|
|
1611
|
+
if (!remote.type) {
|
|
1612
|
+
remote.type = share.DEFAULT_REMOTE_TYPE;
|
|
1613
|
+
}
|
|
1614
|
+
};
|
|
1615
|
+
const registeredRemote = targetRemotes.find((item)=>item.name === remote.name);
|
|
1616
|
+
if (!registeredRemote) {
|
|
1617
|
+
normalizeRemote();
|
|
1618
|
+
targetRemotes.push(remote);
|
|
1619
|
+
} else {
|
|
1620
|
+
const messages = [
|
|
1621
|
+
`The remote "${remote.name}" is already registered.`,
|
|
1622
|
+
(options == null ? void 0 : options.force) ? 'Hope you have known that OVERRIDE it may have some unexpected errors' : 'If you want to merge the remote, you can set "force: true".'
|
|
1623
|
+
];
|
|
1624
|
+
if (options == null ? void 0 : options.force) {
|
|
1625
|
+
// remove registered remote
|
|
1626
|
+
this.removeRemote(registeredRemote);
|
|
1627
|
+
normalizeRemote();
|
|
1628
|
+
targetRemotes.push(remote);
|
|
1629
|
+
}
|
|
1630
|
+
share.warn(messages.join(' '));
|
|
1631
|
+
}
|
|
1632
|
+
}
|
|
1633
|
+
registerRemotes(remotes, options) {
|
|
1634
|
+
remotes.forEach((remote)=>{
|
|
1635
|
+
this.registerRemote(remote, this.options.remotes, {
|
|
1636
|
+
force: options == null ? void 0 : options.force
|
|
1637
|
+
});
|
|
1638
|
+
});
|
|
1639
|
+
}
|
|
1584
1640
|
constructor(userOptions){
|
|
1585
1641
|
this.hooks = new PluginSystem({
|
|
1586
1642
|
beforeInit: new SyncWaterfallHook('beforeInit'),
|
|
@@ -1605,7 +1661,7 @@ class FederationHost {
|
|
|
1605
1661
|
// not used yet
|
|
1606
1662
|
afterPreloadRemote: new AsyncHook()
|
|
1607
1663
|
});
|
|
1608
|
-
this.version = "0.0.
|
|
1664
|
+
this.version = "0.0.17";
|
|
1609
1665
|
this.moduleCache = new Map();
|
|
1610
1666
|
this.loaderHook = new PluginSystem({
|
|
1611
1667
|
// FIXME: may not be suitable , not open to the public yet
|
|
@@ -1680,6 +1736,11 @@ function preloadRemote(...args) {
|
|
|
1680
1736
|
// eslint-disable-next-line prefer-spread
|
|
1681
1737
|
return FederationInstance.preloadRemote.apply(FederationInstance, args);
|
|
1682
1738
|
}
|
|
1739
|
+
function registerRemotes(...args) {
|
|
1740
|
+
share.assert(FederationInstance, 'Please call init first');
|
|
1741
|
+
// eslint-disable-next-line prefer-spread
|
|
1742
|
+
return FederationInstance.registerRemotes.apply(FederationInstance, args);
|
|
1743
|
+
}
|
|
1683
1744
|
// Inject for debug
|
|
1684
1745
|
share.setGlobalFederationConstructor(FederationHost);
|
|
1685
1746
|
|
|
@@ -1698,3 +1759,4 @@ exports.loadRemote = loadRemote;
|
|
|
1698
1759
|
exports.loadShare = loadShare;
|
|
1699
1760
|
exports.loadShareSync = loadShareSync;
|
|
1700
1761
|
exports.preloadRemote = preloadRemote;
|
|
1762
|
+
exports.registerRemotes = registerRemotes;
|
package/dist/index.esm.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { g as getGlobalHostPlugins, D as DEFAULT_REMOTE_TYPE, a as DEFAULT_SCOPE, b as globalLoading, c as getRemoteEntryExports, d as assert, s as safeToString, e as getFMId, i as isObject, f as error, w as warn, h as isPlainObject, j as isRemoteInfoWithEntry, k as isPureRemoteEntry, l as getRegisteredShare, m as getInfoWithoutType, n as getPreloaded, o as setPreloaded, p as getGlobalSnapshotInfoByModuleInfo, q as addGlobalSnapshot, r as setGlobalSnapshotInfoByModuleInfo, t as getGlobalSnapshot, G as Global, u as getGlobalShareScope, v as formatShareConfigs, x as
|
|
1
|
+
import { g as getGlobalHostPlugins, D as DEFAULT_REMOTE_TYPE, a as DEFAULT_SCOPE, b as globalLoading, c as getRemoteEntryExports, d as assert, s as safeToString, e as getFMId, i as isObject, f as error, w as warn, h as isPlainObject, j as isRemoteInfoWithEntry, k as isPureRemoteEntry, l as getRegisteredShare, m as getInfoWithoutType, n as getPreloaded, o as setPreloaded, p as getGlobalSnapshotInfoByModuleInfo, q as addGlobalSnapshot, r as setGlobalSnapshotInfoByModuleInfo, t as getGlobalSnapshot, G as Global, u as getGlobalShareScope, v as formatShareConfigs, x as getBuilderId, y as isBrowserEnv, z as addUniqueItem, A as setGlobalFederationConstructor, B as getGlobalFederationInstance, C as getGlobalFederationConstructor, E as setGlobalFederationInstance } from './share.esm.js';
|
|
2
2
|
export { F as registerGlobalPlugins } from './share.esm.js';
|
|
3
|
-
import { composeKeyWithSeparator, loadScriptNode, loadScript, createLink, getResourceUrl, isManifestProvider, generateSnapshotFromManifest } from '@module-federation/sdk';
|
|
3
|
+
import { composeKeyWithSeparator, loadScriptNode, loadScript, createLink, getResourceUrl, isManifestProvider, generateSnapshotFromManifest, getHeaders } from '@module-federation/sdk';
|
|
4
4
|
export { loadScript, loadScriptNode } from '@module-federation/sdk';
|
|
5
5
|
|
|
6
6
|
// Function to match a remote with its name and expose
|
|
@@ -158,9 +158,13 @@ async function loadEntryScript({ name, globalName, entry, createScriptHook }) {
|
|
|
158
158
|
return e;
|
|
159
159
|
});
|
|
160
160
|
}
|
|
161
|
+
function getRemoteEntryUniqueKey(remoteInfo) {
|
|
162
|
+
const { entry, name } = remoteInfo;
|
|
163
|
+
return composeKeyWithSeparator(name, entry);
|
|
164
|
+
}
|
|
161
165
|
async function getRemoteEntry({ remoteEntryExports, remoteInfo, createScriptHook }) {
|
|
162
166
|
const { entry, name, type, entryGlobalName } = remoteInfo;
|
|
163
|
-
const uniqueKey =
|
|
167
|
+
const uniqueKey = getRemoteEntryUniqueKey(remoteInfo);
|
|
164
168
|
if (remoteEntryExports) {
|
|
165
169
|
return remoteEntryExports;
|
|
166
170
|
}
|
|
@@ -1018,9 +1022,14 @@ class SnapshotHandler {
|
|
|
1018
1022
|
return manifestJson;
|
|
1019
1023
|
}
|
|
1020
1024
|
try {
|
|
1021
|
-
|
|
1025
|
+
const headers = getHeaders();
|
|
1026
|
+
let res = await this.loaderHook.lifecycle.fetch.emit(manifestUrl, {
|
|
1027
|
+
headers
|
|
1028
|
+
});
|
|
1022
1029
|
if (!res || !(res instanceof Response)) {
|
|
1023
|
-
res = await fetch(manifestUrl, {
|
|
1030
|
+
res = await fetch(manifestUrl, {
|
|
1031
|
+
headers
|
|
1032
|
+
});
|
|
1024
1033
|
}
|
|
1025
1034
|
manifestJson = await res.json();
|
|
1026
1035
|
assert(manifestJson.metaData && manifestJson.exposes && manifestJson.shared, `${manifestUrl} is not a federation manifest`);
|
|
@@ -1476,30 +1485,9 @@ class FederationHost {
|
|
|
1476
1485
|
});
|
|
1477
1486
|
const userRemotes = userOptionsRes.remotes || [];
|
|
1478
1487
|
const remotes = userRemotes.reduce((res, remote)=>{
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
// As multi-level path references cannot guarantee unique names, alias being a prefix of remote.name is not supported
|
|
1483
|
-
const findEqual = res.find((item)=>{
|
|
1484
|
-
var _item_alias;
|
|
1485
|
-
return remote.alias && (item.name.startsWith(remote.alias) || ((_item_alias = item.alias) == null ? void 0 : _item_alias.startsWith(remote.alias)));
|
|
1486
|
-
});
|
|
1487
|
-
assert(!findEqual, `The alias ${remote.alias} of remote ${remote.name} is not allowed to be the prefix of ${findEqual && findEqual.name} name or alias`);
|
|
1488
|
-
}
|
|
1489
|
-
// Set the remote entry to a complete path
|
|
1490
|
-
if ('entry' in remote) {
|
|
1491
|
-
if (isBrowserEnv() && !remote.entry.startsWith('http')) {
|
|
1492
|
-
remote.entry = new URL(remote.entry, window.location.origin).href;
|
|
1493
|
-
}
|
|
1494
|
-
}
|
|
1495
|
-
if (!remote.shareScope) {
|
|
1496
|
-
remote.shareScope = DEFAULT_SCOPE;
|
|
1497
|
-
}
|
|
1498
|
-
if (!remote.type) {
|
|
1499
|
-
remote.type = DEFAULT_REMOTE_TYPE;
|
|
1500
|
-
}
|
|
1501
|
-
res.push(remote);
|
|
1502
|
-
}
|
|
1488
|
+
this.registerRemote(remote, res, {
|
|
1489
|
+
force: false
|
|
1490
|
+
});
|
|
1503
1491
|
return res;
|
|
1504
1492
|
}, globalOptionsRes.remotes);
|
|
1505
1493
|
// register shared in shareScopeMap
|
|
@@ -1579,6 +1567,74 @@ class FederationHost {
|
|
|
1579
1567
|
}
|
|
1580
1568
|
});
|
|
1581
1569
|
}
|
|
1570
|
+
removeRemote(remote) {
|
|
1571
|
+
const { name } = remote;
|
|
1572
|
+
const remoteIndex = this.options.remotes.findIndex((item)=>item.name === name);
|
|
1573
|
+
if (remoteIndex !== -1) {
|
|
1574
|
+
this.options.remotes.splice(remoteIndex, 1);
|
|
1575
|
+
}
|
|
1576
|
+
const loadedModule = this.moduleCache.get(remote.name);
|
|
1577
|
+
if (loadedModule) {
|
|
1578
|
+
const key = loadedModule.remoteInfo.entryGlobalName;
|
|
1579
|
+
if (globalThis[key]) {
|
|
1580
|
+
delete globalThis[key];
|
|
1581
|
+
}
|
|
1582
|
+
const remoteEntryUniqueKey = getRemoteEntryUniqueKey(loadedModule.remoteInfo);
|
|
1583
|
+
if (globalLoading[remoteEntryUniqueKey]) {
|
|
1584
|
+
delete globalLoading[remoteEntryUniqueKey];
|
|
1585
|
+
}
|
|
1586
|
+
this.moduleCache.delete(remote.name);
|
|
1587
|
+
}
|
|
1588
|
+
}
|
|
1589
|
+
registerRemote(remote, targetRemotes, options) {
|
|
1590
|
+
const normalizeRemote = ()=>{
|
|
1591
|
+
if (remote.alias) {
|
|
1592
|
+
// Validate if alias equals the prefix of remote.name and remote.alias, if so, throw an error
|
|
1593
|
+
// As multi-level path references cannot guarantee unique names, alias being a prefix of remote.name is not supported
|
|
1594
|
+
const findEqual = targetRemotes.find((item)=>{
|
|
1595
|
+
var _item_alias;
|
|
1596
|
+
return remote.alias && (item.name.startsWith(remote.alias) || ((_item_alias = item.alias) == null ? void 0 : _item_alias.startsWith(remote.alias)));
|
|
1597
|
+
});
|
|
1598
|
+
assert(!findEqual, `The alias ${remote.alias} of remote ${remote.name} is not allowed to be the prefix of ${findEqual && findEqual.name} name or alias`);
|
|
1599
|
+
}
|
|
1600
|
+
// Set the remote entry to a complete path
|
|
1601
|
+
if ('entry' in remote) {
|
|
1602
|
+
if (isBrowserEnv() && !remote.entry.startsWith('http')) {
|
|
1603
|
+
remote.entry = new URL(remote.entry, window.location.origin).href;
|
|
1604
|
+
}
|
|
1605
|
+
}
|
|
1606
|
+
if (!remote.shareScope) {
|
|
1607
|
+
remote.shareScope = DEFAULT_SCOPE;
|
|
1608
|
+
}
|
|
1609
|
+
if (!remote.type) {
|
|
1610
|
+
remote.type = DEFAULT_REMOTE_TYPE;
|
|
1611
|
+
}
|
|
1612
|
+
};
|
|
1613
|
+
const registeredRemote = targetRemotes.find((item)=>item.name === remote.name);
|
|
1614
|
+
if (!registeredRemote) {
|
|
1615
|
+
normalizeRemote();
|
|
1616
|
+
targetRemotes.push(remote);
|
|
1617
|
+
} else {
|
|
1618
|
+
const messages = [
|
|
1619
|
+
`The remote "${remote.name}" is already registered.`,
|
|
1620
|
+
(options == null ? void 0 : options.force) ? 'Hope you have known that OVERRIDE it may have some unexpected errors' : 'If you want to merge the remote, you can set "force: true".'
|
|
1621
|
+
];
|
|
1622
|
+
if (options == null ? void 0 : options.force) {
|
|
1623
|
+
// remove registered remote
|
|
1624
|
+
this.removeRemote(registeredRemote);
|
|
1625
|
+
normalizeRemote();
|
|
1626
|
+
targetRemotes.push(remote);
|
|
1627
|
+
}
|
|
1628
|
+
warn(messages.join(' '));
|
|
1629
|
+
}
|
|
1630
|
+
}
|
|
1631
|
+
registerRemotes(remotes, options) {
|
|
1632
|
+
remotes.forEach((remote)=>{
|
|
1633
|
+
this.registerRemote(remote, this.options.remotes, {
|
|
1634
|
+
force: options == null ? void 0 : options.force
|
|
1635
|
+
});
|
|
1636
|
+
});
|
|
1637
|
+
}
|
|
1582
1638
|
constructor(userOptions){
|
|
1583
1639
|
this.hooks = new PluginSystem({
|
|
1584
1640
|
beforeInit: new SyncWaterfallHook('beforeInit'),
|
|
@@ -1603,7 +1659,7 @@ class FederationHost {
|
|
|
1603
1659
|
// not used yet
|
|
1604
1660
|
afterPreloadRemote: new AsyncHook()
|
|
1605
1661
|
});
|
|
1606
|
-
this.version = "0.0.
|
|
1662
|
+
this.version = "0.0.17";
|
|
1607
1663
|
this.moduleCache = new Map();
|
|
1608
1664
|
this.loaderHook = new PluginSystem({
|
|
1609
1665
|
// FIXME: may not be suitable , not open to the public yet
|
|
@@ -1678,7 +1734,12 @@ function preloadRemote(...args) {
|
|
|
1678
1734
|
// eslint-disable-next-line prefer-spread
|
|
1679
1735
|
return FederationInstance.preloadRemote.apply(FederationInstance, args);
|
|
1680
1736
|
}
|
|
1737
|
+
function registerRemotes(...args) {
|
|
1738
|
+
assert(FederationInstance, 'Please call init first');
|
|
1739
|
+
// eslint-disable-next-line prefer-spread
|
|
1740
|
+
return FederationInstance.registerRemotes.apply(FederationInstance, args);
|
|
1741
|
+
}
|
|
1681
1742
|
// Inject for debug
|
|
1682
1743
|
setGlobalFederationConstructor(FederationHost);
|
|
1683
1744
|
|
|
1684
|
-
export { FederationHost, init, loadRemote, loadShare, loadShareSync, preloadRemote };
|
|
1745
|
+
export { FederationHost, init, loadRemote, loadShare, loadShareSync, preloadRemote, registerRemotes };
|
package/dist/package.json
CHANGED
package/dist/share.cjs.js
CHANGED
|
@@ -185,7 +185,7 @@ function getGlobalFederationConstructor() {
|
|
|
185
185
|
function setGlobalFederationConstructor(FederationConstructor, isDebug = isDebugMode()) {
|
|
186
186
|
if (isDebug) {
|
|
187
187
|
globalThis.__FEDERATION__.__DEBUG_CONSTRUCTOR__ = FederationConstructor;
|
|
188
|
-
globalThis.__FEDERATION__.__DEBUG_CONSTRUCTOR_VERSION__ = "0.0.
|
|
188
|
+
globalThis.__FEDERATION__.__DEBUG_CONSTRUCTOR_VERSION__ = "0.0.17";
|
|
189
189
|
}
|
|
190
190
|
}
|
|
191
191
|
// eslint-disable-next-line @typescript-eslint/ban-types
|
package/dist/share.esm.js
CHANGED
|
@@ -183,7 +183,7 @@ function getGlobalFederationConstructor() {
|
|
|
183
183
|
function setGlobalFederationConstructor(FederationConstructor, isDebug = isDebugMode()) {
|
|
184
184
|
if (isDebug) {
|
|
185
185
|
globalThis.__FEDERATION__.__DEBUG_CONSTRUCTOR__ = FederationConstructor;
|
|
186
|
-
globalThis.__FEDERATION__.__DEBUG_CONSTRUCTOR_VERSION__ = "0.0.
|
|
186
|
+
globalThis.__FEDERATION__.__DEBUG_CONSTRUCTOR_VERSION__ = "0.0.17";
|
|
187
187
|
}
|
|
188
188
|
}
|
|
189
189
|
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
@@ -803,4 +803,4 @@ function getGlobalShareScope() {
|
|
|
803
803
|
return Global.__FEDERATION__.__SHARE__;
|
|
804
804
|
}
|
|
805
805
|
|
|
806
|
-
export { setGlobalFederationConstructor as A, getGlobalFederationInstance as B, getGlobalFederationConstructor as C, DEFAULT_REMOTE_TYPE as D, setGlobalFederationInstance as E, registerGlobalPlugins as F, Global as G, nativeGlobal as H, resetFederationGlobalInfo as I, getTargetSnapshotInfoByModuleInfo as J, DEFAULT_SCOPE as a, globalLoading as b, getRemoteEntryExports as c, assert as d, getFMId as e, error as f, getGlobalHostPlugins as g, isPlainObject as h, isObject as i, isRemoteInfoWithEntry as j, isPureRemoteEntry as k, getRegisteredShare as l, getInfoWithoutType as m, getPreloaded as n, setPreloaded as o, getGlobalSnapshotInfoByModuleInfo as p, addGlobalSnapshot as q, setGlobalSnapshotInfoByModuleInfo as r, safeToString as s, getGlobalSnapshot as t, getGlobalShareScope as u, formatShareConfigs as v, warn as w,
|
|
806
|
+
export { setGlobalFederationConstructor as A, getGlobalFederationInstance as B, getGlobalFederationConstructor as C, DEFAULT_REMOTE_TYPE as D, setGlobalFederationInstance as E, registerGlobalPlugins as F, Global as G, nativeGlobal as H, resetFederationGlobalInfo as I, getTargetSnapshotInfoByModuleInfo as J, DEFAULT_SCOPE as a, globalLoading as b, getRemoteEntryExports as c, assert as d, getFMId as e, error as f, getGlobalHostPlugins as g, isPlainObject as h, isObject as i, isRemoteInfoWithEntry as j, isPureRemoteEntry as k, getRegisteredShare as l, getInfoWithoutType as m, getPreloaded as n, setPreloaded as o, getGlobalSnapshotInfoByModuleInfo as p, addGlobalSnapshot as q, setGlobalSnapshotInfoByModuleInfo as r, safeToString as s, getGlobalSnapshot as t, getGlobalShareScope as u, formatShareConfigs as v, warn as w, getBuilderId as x, isBrowserEnv as y, addUniqueItem as z };
|
package/dist/src/core.d.ts
CHANGED
|
@@ -153,5 +153,10 @@ export declare class FederationHost {
|
|
|
153
153
|
private formatOptions;
|
|
154
154
|
private registerPlugins;
|
|
155
155
|
private setShared;
|
|
156
|
+
private removeRemote;
|
|
157
|
+
private registerRemote;
|
|
158
|
+
registerRemotes(remotes: Remote[], options?: {
|
|
159
|
+
force?: boolean;
|
|
160
|
+
}): void;
|
|
156
161
|
}
|
|
157
162
|
export {};
|
package/dist/src/index.d.ts
CHANGED
|
@@ -10,3 +10,4 @@ export declare function loadRemote(...args: Parameters<FederationHost['loadRemot
|
|
|
10
10
|
export declare function loadShare(...args: Parameters<FederationHost['loadShare']>): ReturnType<FederationHost['loadShare']>;
|
|
11
11
|
export declare function loadShareSync(...args: Parameters<FederationHost['loadShareSync']>): ReturnType<FederationHost['loadShareSync']>;
|
|
12
12
|
export declare function preloadRemote(...args: Parameters<FederationHost['preloadRemote']>): ReturnType<FederationHost['preloadRemote']>;
|
|
13
|
+
export declare function registerRemotes(...args: Parameters<FederationHost['registerRemotes']>): ReturnType<FederationHost['registerRemotes']>;
|
package/dist/src/utils/load.d.ts
CHANGED
|
@@ -9,6 +9,7 @@ export declare function loadEntryScript({ name, globalName, entry, createScriptH
|
|
|
9
9
|
entry: string;
|
|
10
10
|
createScriptHook?: (url: string) => HTMLScriptElement | void;
|
|
11
11
|
}): Promise<RemoteEntryExports>;
|
|
12
|
+
export declare function getRemoteEntryUniqueKey(remoteInfo: RemoteInfo): string;
|
|
12
13
|
export declare function getRemoteEntry({ remoteEntryExports, remoteInfo, createScriptHook, }: {
|
|
13
14
|
remoteInfo: RemoteInfo;
|
|
14
15
|
remoteEntryExports?: RemoteEntryExports | undefined;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@module-federation/runtime",
|
|
3
|
-
"version": "0.0.0-next-
|
|
3
|
+
"version": "0.0.0-next-20240318072254",
|
|
4
4
|
"author": "zhouxiao <codingzx@gmail.com>",
|
|
5
5
|
"main": "./dist/index.cjs",
|
|
6
6
|
"module": "./dist/index.esm.js",
|
|
@@ -45,6 +45,6 @@
|
|
|
45
45
|
}
|
|
46
46
|
},
|
|
47
47
|
"dependencies": {
|
|
48
|
-
"@module-federation/sdk": "0.0.0-next-
|
|
48
|
+
"@module-federation/sdk": "0.0.0-next-20240318072254"
|
|
49
49
|
}
|
|
50
50
|
}
|