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 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
+ ```
@@ -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
+ }