remote-reload-utils 0.0.1
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 +37 -0
- package/dist/index.d.ts +1 -0
- package/dist/loadRemote.d.ts +14 -0
- package/dist/main.cjs +110 -0
- package/dist/main.js +76 -0
- package/package.json +29 -0
package/README.md
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Rslib project
|
|
2
|
+
|
|
3
|
+
## Setup
|
|
4
|
+
|
|
5
|
+
Install the dependencies:
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm install
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Get started
|
|
12
|
+
|
|
13
|
+
Build the library:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
pnpm build
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Build the library in watch mode:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
pnpm dev
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### 使用方式
|
|
26
|
+
|
|
27
|
+
```ts
|
|
28
|
+
import { loadRemoteMultiVersion } from 'remote-reload-utils';
|
|
29
|
+
const scope = await loadRemoteMultiVersion({
|
|
30
|
+
name: 'my-lib',
|
|
31
|
+
pkg: 'my-lib',
|
|
32
|
+
version: 'latest',
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
// scope 形如 "my-lib@1.2.3"
|
|
36
|
+
const { Button } = await loadRemote(`${scope}/Button`);
|
|
37
|
+
```
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const squared: (n: number) => number;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface LoadRemoteOptions {
|
|
2
|
+
name: string;
|
|
3
|
+
pkg: string;
|
|
4
|
+
version?: string;
|
|
5
|
+
retries?: number;
|
|
6
|
+
delay?: number;
|
|
7
|
+
localFallback?: string;
|
|
8
|
+
cacheTTL?: number;
|
|
9
|
+
revalidate?: boolean;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* 多版本共存的 loadRemote
|
|
13
|
+
*/
|
|
14
|
+
export declare function loadRemoteMultiVersion(options: LoadRemoteOptions): Promise<string>;
|
package/dist/main.cjs
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_require__ = {};
|
|
3
|
+
(()=>{
|
|
4
|
+
__webpack_require__.d = (exports1, definition)=>{
|
|
5
|
+
for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: definition[key]
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
})();
|
|
11
|
+
(()=>{
|
|
12
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
13
|
+
})();
|
|
14
|
+
(()=>{
|
|
15
|
+
__webpack_require__.r = (exports1)=>{
|
|
16
|
+
if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
17
|
+
value: 'Module'
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
20
|
+
value: true
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
})();
|
|
24
|
+
var __webpack_exports__ = {};
|
|
25
|
+
__webpack_require__.r(__webpack_exports__);
|
|
26
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
27
|
+
loadRemoteMultiVersion: ()=>loadRemoteMultiVersion
|
|
28
|
+
});
|
|
29
|
+
const runtime_namespaceObject = require("@module-federation/runtime");
|
|
30
|
+
async function fetchLatestVersion(pkg) {
|
|
31
|
+
const res = await fetch(`https://registry.npmjs.org/${pkg}`);
|
|
32
|
+
if (!res.ok) throw new Error(`\u{65E0}\u{6CD5}\u{83B7}\u{53D6} ${pkg} \u{7684}\u{7248}\u{672C}\u{4FE1}\u{606F}`);
|
|
33
|
+
const data = await res.json();
|
|
34
|
+
return data['dist-tags']?.latest;
|
|
35
|
+
}
|
|
36
|
+
function getVersionCache() {
|
|
37
|
+
try {
|
|
38
|
+
return JSON.parse(localStorage.getItem('mf-multi-version') || '{}');
|
|
39
|
+
} catch {
|
|
40
|
+
return {};
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function setVersionCache(pkg, version) {
|
|
44
|
+
const cache = getVersionCache();
|
|
45
|
+
cache[pkg] = cache[pkg] || {};
|
|
46
|
+
cache[pkg][version] = {
|
|
47
|
+
timestamp: Date.now()
|
|
48
|
+
};
|
|
49
|
+
localStorage.setItem('mf-multi-version', JSON.stringify(cache));
|
|
50
|
+
}
|
|
51
|
+
function buildCdnUrls(pkg, version) {
|
|
52
|
+
return [
|
|
53
|
+
`https://cdn.jsdelivr.net/npm/${pkg}@${version}/dist/remoteEntry.js`,
|
|
54
|
+
`https://unpkg.com/${pkg}@${version}/dist/remoteEntry.js`
|
|
55
|
+
];
|
|
56
|
+
}
|
|
57
|
+
async function loadRemoteMultiVersion(options) {
|
|
58
|
+
let { name, pkg, version = 'latest', retries = 3, delay = 1000, localFallback, cacheTTL = 86400000, revalidate = true } = options;
|
|
59
|
+
let finalVersion = version;
|
|
60
|
+
if ('latest' === version) {
|
|
61
|
+
const cache = getVersionCache();
|
|
62
|
+
const versions = cache[pkg] || {};
|
|
63
|
+
const latestCached = Object.keys(versions).sort((a, b)=>versions[b].timestamp - versions[a].timestamp)[0];
|
|
64
|
+
if (latestCached && Date.now() - versions[latestCached].timestamp < cacheTTL) {
|
|
65
|
+
console.log(`[MF] \u{4F7F}\u{7528}\u{7F13}\u{5B58}\u{7248}\u{672C}: ${pkg}@${latestCached}`);
|
|
66
|
+
finalVersion = latestCached;
|
|
67
|
+
if (revalidate) fetchLatestVersion(pkg).then((latest)=>{
|
|
68
|
+
if (latest !== latestCached) {
|
|
69
|
+
console.log(`[MF] \u{68C0}\u{6D4B}\u{5230}\u{65B0}\u{7248}\u{672C}: ${pkg}@${latest} (\u{4E0B}\u{6B21}\u{53EF}\u{7528})`);
|
|
70
|
+
setVersionCache(pkg, latest);
|
|
71
|
+
}
|
|
72
|
+
}).catch((err)=>console.warn(`[MF] \u{68C0}\u{67E5}\u{66F4}\u{65B0}\u{5931}\u{8D25}: ${pkg}`, err));
|
|
73
|
+
} else {
|
|
74
|
+
finalVersion = await fetchLatestVersion(pkg);
|
|
75
|
+
console.log(`[MF] \u{83B7}\u{53D6}\u{6700}\u{65B0}\u{7248}\u{672C}: ${pkg}@${finalVersion}`);
|
|
76
|
+
setVersionCache(pkg, finalVersion);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
const scopeName = `${name}@${finalVersion}`;
|
|
80
|
+
const urls = buildCdnUrls(pkg, finalVersion);
|
|
81
|
+
if (localFallback) urls.push(localFallback);
|
|
82
|
+
for (let url of urls){
|
|
83
|
+
let success = false;
|
|
84
|
+
for(let i = 0; i < retries; i++)try {
|
|
85
|
+
console.log(`[MF] \u{5C1D}\u{8BD5}\u{52A0}\u{8F7D}: ${url} (\u{7B2C} ${i + 1} \u{6B21})`);
|
|
86
|
+
(0, runtime_namespaceObject.registerRemotes)([
|
|
87
|
+
{
|
|
88
|
+
name: scopeName,
|
|
89
|
+
entry: url
|
|
90
|
+
}
|
|
91
|
+
]);
|
|
92
|
+
await (0, runtime_namespaceObject.loadRemote)(`${scopeName}/remoteEntry`);
|
|
93
|
+
console.log(`[MF] \u{6210}\u{529F}\u{52A0}\u{8F7D}: ${scopeName}`);
|
|
94
|
+
success = true;
|
|
95
|
+
break;
|
|
96
|
+
} catch (err) {
|
|
97
|
+
console.warn(`[MF] \u{52A0}\u{8F7D}\u{5931}\u{8D25}: ${url}, \u{91CD}\u{8BD5}\u{4E2D}...`, err);
|
|
98
|
+
await new Promise((res)=>setTimeout(res, delay));
|
|
99
|
+
}
|
|
100
|
+
if (success) return scopeName;
|
|
101
|
+
}
|
|
102
|
+
throw new Error(`[MF] \u{6240}\u{6709} CDN \u{52A0}\u{8F7D}\u{5931}\u{8D25}: ${urls.join(', ')}`);
|
|
103
|
+
}
|
|
104
|
+
exports.loadRemoteMultiVersion = __webpack_exports__.loadRemoteMultiVersion;
|
|
105
|
+
for(var __webpack_i__ in __webpack_exports__)if (-1 === [
|
|
106
|
+
"loadRemoteMultiVersion"
|
|
107
|
+
].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
|
|
108
|
+
Object.defineProperty(exports, '__esModule', {
|
|
109
|
+
value: true
|
|
110
|
+
});
|
package/dist/main.js
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { loadRemote, registerRemotes } from "@module-federation/runtime";
|
|
2
|
+
async function fetchLatestVersion(pkg) {
|
|
3
|
+
const res = await fetch(`https://registry.npmjs.org/${pkg}`);
|
|
4
|
+
if (!res.ok) throw new Error(`\u{65E0}\u{6CD5}\u{83B7}\u{53D6} ${pkg} \u{7684}\u{7248}\u{672C}\u{4FE1}\u{606F}`);
|
|
5
|
+
const data = await res.json();
|
|
6
|
+
return data['dist-tags']?.latest;
|
|
7
|
+
}
|
|
8
|
+
function getVersionCache() {
|
|
9
|
+
try {
|
|
10
|
+
return JSON.parse(localStorage.getItem('mf-multi-version') || '{}');
|
|
11
|
+
} catch {
|
|
12
|
+
return {};
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function setVersionCache(pkg, version) {
|
|
16
|
+
const cache = getVersionCache();
|
|
17
|
+
cache[pkg] = cache[pkg] || {};
|
|
18
|
+
cache[pkg][version] = {
|
|
19
|
+
timestamp: Date.now()
|
|
20
|
+
};
|
|
21
|
+
localStorage.setItem('mf-multi-version', JSON.stringify(cache));
|
|
22
|
+
}
|
|
23
|
+
function buildCdnUrls(pkg, version) {
|
|
24
|
+
return [
|
|
25
|
+
`https://cdn.jsdelivr.net/npm/${pkg}@${version}/dist/remoteEntry.js`,
|
|
26
|
+
`https://unpkg.com/${pkg}@${version}/dist/remoteEntry.js`
|
|
27
|
+
];
|
|
28
|
+
}
|
|
29
|
+
async function loadRemoteMultiVersion(options) {
|
|
30
|
+
let { name, pkg, version = 'latest', retries = 3, delay = 1000, localFallback, cacheTTL = 86400000, revalidate = true } = options;
|
|
31
|
+
let finalVersion = version;
|
|
32
|
+
if ('latest' === version) {
|
|
33
|
+
const cache = getVersionCache();
|
|
34
|
+
const versions = cache[pkg] || {};
|
|
35
|
+
const latestCached = Object.keys(versions).sort((a, b)=>versions[b].timestamp - versions[a].timestamp)[0];
|
|
36
|
+
if (latestCached && Date.now() - versions[latestCached].timestamp < cacheTTL) {
|
|
37
|
+
console.log(`[MF] \u{4F7F}\u{7528}\u{7F13}\u{5B58}\u{7248}\u{672C}: ${pkg}@${latestCached}`);
|
|
38
|
+
finalVersion = latestCached;
|
|
39
|
+
if (revalidate) fetchLatestVersion(pkg).then((latest)=>{
|
|
40
|
+
if (latest !== latestCached) {
|
|
41
|
+
console.log(`[MF] \u{68C0}\u{6D4B}\u{5230}\u{65B0}\u{7248}\u{672C}: ${pkg}@${latest} (\u{4E0B}\u{6B21}\u{53EF}\u{7528})`);
|
|
42
|
+
setVersionCache(pkg, latest);
|
|
43
|
+
}
|
|
44
|
+
}).catch((err)=>console.warn(`[MF] \u{68C0}\u{67E5}\u{66F4}\u{65B0}\u{5931}\u{8D25}: ${pkg}`, err));
|
|
45
|
+
} else {
|
|
46
|
+
finalVersion = await fetchLatestVersion(pkg);
|
|
47
|
+
console.log(`[MF] \u{83B7}\u{53D6}\u{6700}\u{65B0}\u{7248}\u{672C}: ${pkg}@${finalVersion}`);
|
|
48
|
+
setVersionCache(pkg, finalVersion);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
const scopeName = `${name}@${finalVersion}`;
|
|
52
|
+
const urls = buildCdnUrls(pkg, finalVersion);
|
|
53
|
+
if (localFallback) urls.push(localFallback);
|
|
54
|
+
for (let url of urls){
|
|
55
|
+
let success = false;
|
|
56
|
+
for(let i = 0; i < retries; i++)try {
|
|
57
|
+
console.log(`[MF] \u{5C1D}\u{8BD5}\u{52A0}\u{8F7D}: ${url} (\u{7B2C} ${i + 1} \u{6B21})`);
|
|
58
|
+
registerRemotes([
|
|
59
|
+
{
|
|
60
|
+
name: scopeName,
|
|
61
|
+
entry: url
|
|
62
|
+
}
|
|
63
|
+
]);
|
|
64
|
+
await loadRemote(`${scopeName}/remoteEntry`);
|
|
65
|
+
console.log(`[MF] \u{6210}\u{529F}\u{52A0}\u{8F7D}: ${scopeName}`);
|
|
66
|
+
success = true;
|
|
67
|
+
break;
|
|
68
|
+
} catch (err) {
|
|
69
|
+
console.warn(`[MF] \u{52A0}\u{8F7D}\u{5931}\u{8D25}: ${url}, \u{91CD}\u{8BD5}\u{4E2D}...`, err);
|
|
70
|
+
await new Promise((res)=>setTimeout(res, delay));
|
|
71
|
+
}
|
|
72
|
+
if (success) return scopeName;
|
|
73
|
+
}
|
|
74
|
+
throw new Error(`[MF] \u{6240}\u{6709} CDN \u{52A0}\u{8F7D}\u{5931}\u{8D25}: ${urls.join(', ')}`);
|
|
75
|
+
}
|
|
76
|
+
export { loadRemoteMultiVersion };
|
package/package.json
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "remote-reload-utils",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"exports": {
|
|
6
|
+
".": {
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"import": "./dist/index.js",
|
|
9
|
+
"require": "./dist/index.cjs"
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"main": "./dist/index.cjs",
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "rslib build",
|
|
19
|
+
"dev": "rslib build --watch"
|
|
20
|
+
},
|
|
21
|
+
"devDependencies": {
|
|
22
|
+
"@rslib/core": "^0.12.2",
|
|
23
|
+
"@types/node": "^22.17.2",
|
|
24
|
+
"typescript": "^5.9.2"
|
|
25
|
+
},
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"@module-federation/runtime": "^0.18.3"
|
|
28
|
+
}
|
|
29
|
+
}
|