resource-preloader 2.0.4 → 2.0.5

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.
Files changed (37) hide show
  1. package/dist/resource-loader.amd.js +4 -4
  2. package/dist/resource-loader.amd.js.map +1 -1
  3. package/dist/resource-loader.amd.min.js.map +1 -1
  4. package/dist/resource-loader.cjs.js +4 -4
  5. package/dist/resource-loader.cjs.js.map +1 -1
  6. package/dist/resource-loader.cjs.min.js.map +1 -1
  7. package/dist/resource-loader.esm.js +2 -2
  8. package/dist/resource-loader.esm.js.map +1 -1
  9. package/dist/resource-loader.esm.min.js +1 -1
  10. package/dist/resource-loader.esm.min.js.map +1 -1
  11. package/dist/resource-loader.umd.js +4 -4
  12. package/dist/resource-loader.umd.js.map +1 -1
  13. package/dist/resource-loader.umd.min.js.map +1 -1
  14. package/dist/resource-preloader.amd.js +386 -362
  15. package/dist/resource-preloader.amd.js.map +1 -1
  16. package/dist/resource-preloader.amd.min.js +1 -1
  17. package/dist/resource-preloader.amd.min.js.map +1 -1
  18. package/dist/resource-preloader.cjs.js +292 -268
  19. package/dist/resource-preloader.cjs.js.map +1 -1
  20. package/dist/resource-preloader.cjs.min.js +1 -1
  21. package/dist/resource-preloader.cjs.min.js.map +1 -1
  22. package/dist/resource-preloader.esm.js +292 -268
  23. package/dist/resource-preloader.esm.js.map +1 -1
  24. package/dist/resource-preloader.esm.min.js +1 -1
  25. package/dist/resource-preloader.esm.min.js.map +1 -1
  26. package/dist/resource-preloader.umd.js +389 -365
  27. package/dist/resource-preloader.umd.js.map +1 -1
  28. package/dist/resource-preloader.umd.min.js +1 -1
  29. package/dist/resource-preloader.umd.min.js.map +1 -1
  30. package/package.json +4 -3
  31. package/src/checker.js +53 -0
  32. package/src/config.js +10 -12
  33. package/src/index.js +5 -5
  34. package/src/loader.js +128 -128
  35. package/src/other.js +4 -4
  36. package/src/scheduler.js +123 -149
  37. package/types/index.d.ts +20 -8
package/src/loader.js CHANGED
@@ -9,137 +9,137 @@ const loaderMap = new Map();
9
9
  * @returns {Promise<LoadResult>} 加载结果Promise
10
10
  */
11
11
  export function wrapLoadPromise(url, type, timeout) {
12
- return new Promise(function (resolve, reject) {
13
- // 获取加载器处理函数
14
- const handler = getLoader(type);
15
- // 超时处理
16
- const timeoutTimer = setTimeout(() => {
17
- reject(new Error(`Resource ${url} load timeout (${timeout}ms)`));
18
- }, timeout);
12
+ return new Promise(function (resolve, reject) {
13
+ // 获取加载器处理函数
14
+ const handler = getLoader(type);
15
+ // 超时处理
16
+ const timeoutTimer = setTimeout(() => {
17
+ reject(new Error(`Resource ${url} load timeout (${timeout}ms)`));
18
+ }, timeout);
19
19
 
20
- // 执行具体加载逻辑
21
- handler(url)
22
- .then(function (result) {
23
- clearTimeout(timeoutTimer);
24
- resolve({
25
- url,
26
- success: true,
27
- data: result,
28
- error: null,
29
- });
30
- })
31
- .catch(function (error) {
32
- clearTimeout(timeoutTimer);
33
- reject({
34
- url,
35
- success: false,
36
- data: null,
37
- error,
38
- });
39
- });
40
- });
20
+ // 执行具体加载逻辑
21
+ handler(url)
22
+ .then(function (result) {
23
+ clearTimeout(timeoutTimer);
24
+ resolve({
25
+ url,
26
+ success: true,
27
+ data: result,
28
+ error: null,
29
+ });
30
+ })
31
+ .catch(function (error) {
32
+ clearTimeout(timeoutTimer);
33
+ reject({
34
+ url,
35
+ success: false,
36
+ data: null,
37
+ error,
38
+ });
39
+ });
40
+ });
41
41
  }
42
42
 
43
43
  /** 初始化内置加载器 **/
44
44
  // --------------- 内置JS加载器 ---------------
45
45
  loaderMap.set(
46
- 'js',
47
- /**
48
- * JS加载器
49
- * @param {string} url
50
- * @returns {Promise<HTMLScriptElement|void>}
51
- */
52
- function (url) {
53
- const script = document.createElement('script');
54
- return new Promise(function (resolve, reject) {
55
- script.type = 'text/javascript';
56
- script.src = url;
57
- script.async = false; // 保持加载顺序(不开启异步)
58
- script.dataset.flag = 'resource-preloader';
46
+ "js",
47
+ /**
48
+ * JS加载器
49
+ * @param {string} url
50
+ * @returns {Promise<HTMLScriptElement|void>}
51
+ */
52
+ function (url) {
53
+ const script = document.createElement("script");
54
+ return new Promise(function (resolve, reject) {
55
+ script.type = "text/javascript";
56
+ script.src = url;
57
+ script.async = false; // 保持加载顺序(不开启异步)
58
+ script.dataset.flag = "resource-preloader";
59
59
 
60
- script.addEventListener('load', function (e) {
61
- resolve(script);
62
- });
63
- script.addEventListener('error', function () {
64
- reject(new Error(`JS resource ${url} load failed`));
65
- });
60
+ script.addEventListener("load", function (e) {
61
+ resolve(script);
62
+ });
63
+ script.addEventListener("error", function () {
64
+ reject(new Error(`JS resource ${url} load failed`));
65
+ });
66
66
 
67
- document.head.appendChild(script);
68
- }).finally(function () {
69
- // 加载完成后移除标签,避免污染DOM
70
- document.head.removeChild(script);
71
- });
72
- }
67
+ document.head.appendChild(script);
68
+ }).finally(function () {
69
+ // 加载完成后移除标签,避免污染DOM
70
+ document.head.removeChild(script);
71
+ });
72
+ },
73
73
  );
74
74
  // --------------- 内置CSS加载器 ---------------
75
75
  loaderMap.set(
76
- 'css',
77
- /**
78
- * CSS加载器
79
- * @param {string} url
80
- * @returns {Promise<HTMLLinkElement>}
81
- */
82
- function (url) {
83
- return new Promise(function (resolve, reject) {
84
- const link = document.createElement('link');
85
- link.rel = 'stylesheet';
86
- link.href = url;
87
- link.dataset.flag = 'resource-preloader';
76
+ "css",
77
+ /**
78
+ * CSS加载器
79
+ * @param {string} url
80
+ * @returns {Promise<HTMLLinkElement>}
81
+ */
82
+ function (url) {
83
+ return new Promise(function (resolve, reject) {
84
+ const link = document.createElement("link");
85
+ link.rel = "stylesheet";
86
+ link.href = url;
87
+ link.dataset.flag = "resource-preloader";
88
88
 
89
- link.addEventListener('load', function () {
90
- resolve(link);
91
- });
92
- link.addEventListener('error', function () {
93
- reject(new Error(`CSS resource ${url} load failed`));
94
- document.head.removeChild(link);
95
- });
96
- document.head.appendChild(link);
97
- });
98
- }
89
+ link.addEventListener("load", function () {
90
+ resolve(link);
91
+ });
92
+ link.addEventListener("error", function () {
93
+ reject(new Error(`CSS resource ${url} load failed`));
94
+ document.head.removeChild(link);
95
+ });
96
+ document.head.appendChild(link);
97
+ });
98
+ },
99
99
  );
100
100
  // --------------- 内置IMG加载器 ---------------
101
101
  loaderMap.set(
102
- 'img',
103
- /**
104
- * 图片加载器
105
- * @param url
106
- * @returns {Promise<HTMLImageElement>}
107
- */
108
- function (url) {
109
- const img = new Image();
110
- img.dataset.flag = 'resource-preloader';
111
- return new Promise(function (resolve, reject) {
112
- img.addEventListener('load', function () {
113
- resolve(img);
114
- });
115
- img.addEventListener('error', function () {
116
- reject(new Error(`IMG resource ${url} load failed`));
117
- });
118
- // img 标签不需要添加到DOM树
119
- img.src = url;
120
- });
121
- }
102
+ "img",
103
+ /**
104
+ * 图片加载器
105
+ * @param url
106
+ * @returns {Promise<HTMLImageElement>}
107
+ */
108
+ function (url) {
109
+ const img = new Image();
110
+ img.dataset.flag = "resource-preloader";
111
+ return new Promise(function (resolve, reject) {
112
+ img.addEventListener("load", function () {
113
+ resolve(img);
114
+ });
115
+ img.addEventListener("error", function () {
116
+ reject(new Error(`IMG resource ${url} load failed`));
117
+ });
118
+ // img 标签不需要添加到DOM树
119
+ img.src = url;
120
+ });
121
+ },
122
122
  );
123
123
  // --------------- 内置JSON加载器 ---------------
124
124
  loaderMap.set(
125
- 'json',
126
- /**
127
- * JSON加载器
128
- * @param {string} url
129
- * @returns {Promise<Object|Array|null|undefined>}
130
- */
131
- function (url) {
132
- return fetch(url)
133
- .then(function (res) {
134
- if (!res.ok) {
135
- throw new Error(`JSON resource ${url} load failed`);
136
- }
137
- return res.json();
138
- })
139
- .catch(function (error) {
140
- throw new Error(`JSON resource ${url} load failed: ${error.message}`);
141
- });
142
- }
125
+ "json",
126
+ /**
127
+ * JSON加载器
128
+ * @param {string} url
129
+ * @returns {Promise<Object|Array|null|undefined>}
130
+ */
131
+ function (url) {
132
+ return fetch(url)
133
+ .then(function (res) {
134
+ if (!res.ok) {
135
+ throw new Error(`JSON resource ${url} load failed`);
136
+ }
137
+ return res.json();
138
+ })
139
+ .catch(function (error) {
140
+ throw new Error(`JSON resource ${url} load failed: ${error.message}`);
141
+ });
142
+ },
143
143
  );
144
144
 
145
145
  /**
@@ -148,17 +148,17 @@ loaderMap.set(
148
148
  * @param {LoaderHandler} handler - 加载处理函数,接收url参数,返回Promise
149
149
  */
150
150
  export function registerLoader(type, handler) {
151
- if (typeof type !== 'string' || type.trim() === '') {
152
- throw new Error('资源类型必须是非空字符串');
153
- }
154
- const _ = Object.prototype.toString.call(type).slice(8, -1);
155
- if (['Function', 'AsyncFunction'].includes(_)) {
156
- throw new Error('加载器必须是一个函数返回Promise对象或一个异步函数');
157
- }
158
- if (loaderMap.has(type)) {
159
- console.warn(`类型为${type}的加载器已存在,将被覆盖`);
160
- }
161
- loaderMap.set(type, handler);
151
+ if (typeof type !== "string" || type.trim() === "") {
152
+ throw new Error("资源类型必须是非空字符串");
153
+ }
154
+ const _ = Object.prototype.toString.call(type).slice(8, -1);
155
+ if (["Function", "AsyncFunction"].includes(_)) {
156
+ throw new Error("加载器必须是一个函数返回Promise对象或一个异步函数");
157
+ }
158
+ if (loaderMap.has(type)) {
159
+ console.warn(`类型为${type}的加载器已存在,将被覆盖`);
160
+ }
161
+ loaderMap.set(type, handler);
162
162
  }
163
163
 
164
164
  /**
@@ -167,8 +167,8 @@ export function registerLoader(type, handler) {
167
167
  * @returns {Function} 加载器处理函数
168
168
  */
169
169
  function getLoader(type) {
170
- if (!loaderMap.has(type)) {
171
- throw new Error(`未找到${type}类型的加载器,请先注册自定义加载器`);
172
- }
173
- return loaderMap.get(type);
170
+ if (!loaderMap.has(type)) {
171
+ throw new Error(`未找到${type}类型的加载器,请先注册自定义加载器`);
172
+ }
173
+ return loaderMap.get(type);
174
174
  }
package/src/other.js CHANGED
@@ -1,8 +1,8 @@
1
- import {resourcePreloader} from "./scheduler.js";
2
- import {registerLoader} from "./loader.js";
3
- import {setGlobalConfig} from "./config.js";
1
+ import { resourcePreloader } from "./scheduler.js";
2
+ import { registerLoader } from "./loader.js";
3
+ import { setGlobalConfig } from "./config.js";
4
4
 
5
5
  resourcePreloader.registerLoader = registerLoader;
6
6
  resourcePreloader.setGlobalConfig = setGlobalConfig;
7
7
 
8
- export default resourcePreloader;
8
+ export default resourcePreloader;
package/src/scheduler.js CHANGED
@@ -1,51 +1,6 @@
1
- import {getGlobalConfig} from './config.js';
2
- import {wrapLoadPromise} from './loader.js';
3
-
4
- /**
5
- * 检测循环依赖(深度优先遍历,配置字段改为dependencies)
6
- * @param {Array} configList - 完整配置数组
7
- * @param {number} currentId - 当前资源ID
8
- * @param {Set} visited - 已访问的资源ID集合
9
- * @param {Set} visiting - 正在访问的资源ID集合(用于检测环)
10
- */
11
- function detectCycle(configList, currentId, visited, visiting) {
12
- const currentConfig = configList.find(item => item.name === currentId);
13
- if (!currentConfig) {
14
- throw new Error(`未找到ID为${currentId}的资源配置`);
15
- }
16
-
17
- // 若正在访问中,说明存在循环依赖
18
- if (visiting.has(currentId)) {
19
- throw new Error(`检测到循环依赖:${Array.from(visiting).join(' -> ')} -> ${currentId}`);
20
- }
21
-
22
- // 若已访问过,直接返回(无需重复检测)
23
- if (visited.has(currentId)) {
24
- return;
25
- }
26
-
27
- // 标记为正在访问
28
- visiting.add(currentId);
29
- // 递归检测依赖项(改为dependencies)
30
- const dependencies = currentConfig.dependencies || [];
31
- for (const depId of dependencies) {
32
- detectCycle(configList, depId, visited, visiting);
33
- }
34
- // 标记为已访问,移出正在访问集合
35
- visiting.delete(currentId);
36
- visited.add(currentId);
37
- }
38
-
39
- /**
40
- * 预检测所有资源的循环依赖(配置字段改为dependencies)
41
- * @param {Array} configList - 完整配置数组
42
- */
43
- function checkAllCycles(configList) {
44
- const visited = new Set();
45
- for (const config of configList) {
46
- detectCycle(configList, config.name, visited, new Set());
47
- }
48
- }
1
+ import { getGlobalConfig } from "./config.js";
2
+ import { wrapLoadPromise } from "./loader.js";
3
+ import checkDependencies from "./checker.js";
49
4
 
50
5
  /**
51
6
  * 递归加载单个资源及其所有依赖(保证依赖先加载,配置字段改为dependencies)
@@ -56,72 +11,80 @@ function checkAllCycles(configList) {
56
11
  * @returns {Promise<ResourceLoadResult>} 加载结果
57
12
  */
58
13
  async function loadResourceWithDeps(name, configList, timeout, loadedMap) {
59
- // 若已加载,直接返回缓存结果
60
- if (loadedMap.has(name)) {
61
- return loadedMap.get(name);
62
- }
63
-
64
- const currentConfig = configList.find(item => item.name === name);
65
- if (!currentConfig) {
66
- throw new Error(`未找到name为${name}的资源配置`);
67
- }
68
-
69
- // 1. 先加载所有依赖(改为dependencies)
70
- const dependencies = currentConfig.dependencies || [];
71
- for (const _ of dependencies) {
72
- await loadResourceWithDeps(_, configList, timeout, loadedMap);
73
- }
74
-
75
- // 2. 再加载当前资源的urls(顺序加载,一个成功即可)
76
- const {urls, type} = currentConfig;
77
- let loadResult = null;
78
- let status = 'success';
79
- let error = null;
80
-
81
- try {
82
- loadResult = await loadUrlsInOrder(urls, type, timeout);
83
- } catch (err) {
84
- status = 'failed';
85
- error = err;
86
- }
87
-
88
- // 3. 缓存加载结果
89
- const result = {
90
- name,
91
- config: currentConfig,
92
- result:loadResult,
93
- status,
94
- error,
95
- };
96
- loadedMap.set(name, result);
97
- return result;
14
+ // 若已加载,直接返回缓存结果
15
+ if (loadedMap.has(name)) {
16
+ return loadedMap.get(name);
17
+ }
18
+
19
+ const currentConfig = configList.find((item) => item.name === name);
20
+ if (!currentConfig) {
21
+ throw new Error(`未找到name为${name}的资源配置`);
22
+ }
23
+
24
+ // 1. 先加载所有依赖(改为dependencies)
25
+ const dependencies = currentConfig.dependencies || [];
26
+ for (const _ of dependencies) {
27
+ await loadResourceWithDeps(_, configList, timeout, loadedMap);
28
+ }
29
+
30
+ // 2. 再加载当前资源的urls(顺序加载,一个成功即可)
31
+ const { urls, type } = currentConfig;
32
+ let loadResult = null;
33
+ let status = "success";
34
+ let error = null;
35
+
36
+ try {
37
+ loadResult = await loadUrlsInOrder(name, urls, type, timeout);
38
+ } catch (err) {
39
+ status = "failed";
40
+ error = err;
41
+ }
42
+
43
+ // 3. 缓存加载结果
44
+ const result = {
45
+ name,
46
+ config: currentConfig,
47
+ result: loadResult,
48
+ status,
49
+ error,
50
+ };
51
+ loadedMap.set(name, result);
52
+ return result;
98
53
  }
99
54
 
100
55
  /**
101
56
  * 按顺序加载urls,只需要一个成功即可
102
- * @param {Array} urls - 资源地址数组
57
+ * @param {string} name - 资源名
58
+ * @param {Array<string>} urls - 资源地址数组
103
59
  * @param {string} type - 资源类型
104
60
  * @param {number} timeout - 超时时间
105
61
  * @returns {Promise<LoadResult>} 成功的加载结果
106
62
  */
107
- async function loadUrlsInOrder(urls, type, timeout) {
108
- if (!Array.isArray(urls) || urls.length === 0) {
109
- throw new Error('urls必须是非空数组');
110
- }
63
+ async function loadUrlsInOrder(name, urls, type, timeout) {
64
+ if (!Array.isArray(urls) || urls.length === 0) {
65
+ throw new Error("urls必须是非空数组");
66
+ }
111
67
 
112
- let lastError;
68
+ let lastError;
69
+ const errors = [];
113
70
 
114
- // 按顺序遍历urls,直到有一个加载成功
115
- for (const url of urls) {
116
- try {
117
- return await wrapLoadPromise(url, type, timeout);
118
- } catch (error) {
119
- lastError = error; // 加载失败,继续下一个url
120
- }
71
+ // 按顺序遍历urls,直到有一个加载成功
72
+ for (const url of urls) {
73
+ try {
74
+ const ret = await wrapLoadPromise(url, type, timeout);
75
+ if (errors.length) {
76
+ console.warn(`加载${name}资源时的一些错误信息:`, errors);
77
+ }
78
+ return ret;
79
+ } catch (error) {
80
+ errors.push({ url, error });
81
+ lastError = error; // 加载失败,继续下一个url
121
82
  }
83
+ }
122
84
 
123
- // 所有url都加载失败,抛出最后一个错误
124
- throw new Error(`所有${type}类型资源加载失败,最后一个错误:${lastError?.message || '未知错误'}`);
85
+ // 所有url都加载失败,抛出最后一个错误
86
+ console.warn(`所有${name}资源加载错误信息`, errors);
87
+ throw new Error(`所有${name}资源加载失败,错误内容看上面`);
125
88
  }
126
89
 
127
90
  /**
@@ -130,53 +93,64 @@ async function loadUrlsInOrder(urls, type, timeout) {
130
93
  * @returns {Promise<ResourceLoadResult[]>} 按配置定义顺序的加载结果数组
131
94
  */
132
95
  export async function resourcePreloader(configList) {
133
- if (!Array.isArray(configList) || configList.length === 0) {
134
- throw new Error('配置数组必须是非空数组');
135
- }
136
-
137
- // 将 string[] 形式处理成 { name, urls, type } 形式
138
- configList = configList.map(item => {
139
- if (typeof item === 'string') {
140
- const url = new URL(item, window.location.href);
141
- return {
142
- name: url.pathname,
143
- urls: [item],
144
- type: url.pathname.split('.').pop() || 'js',
145
- };
146
- } else if (Array.isArray(item)) {
147
- if (!item.length) {
148
- return;
149
- }
150
- const url = new URL(item[0], window.location.href);
151
- return {
152
- name: url.pathname,
153
- urls: item,
154
- type: url.pathname.split('.').pop() || 'js',
155
- };
156
- } else {
157
- return item;
96
+ if (!Array.isArray(configList) || configList.length === 0) {
97
+ throw new Error("配置数组必须是非空数组");
98
+ }
99
+
100
+ // 将 string[]|string 形式处理成 { name, urls, type } 形式 同时处理 urls:string 为 urls:[string]
101
+ /** @type {Array<FullResourceConfig>} */
102
+ const configs = configList
103
+ .map(function(item) {
104
+ if (typeof item === "string") {
105
+ const url = new URL(item, window.location.href);
106
+ return {
107
+ name: url.pathname,
108
+ urls: [item],
109
+ type: url.pathname.split(".").pop() || "js",
110
+ };
111
+ } else if (Array.isArray(item)) {
112
+ if (!item.length) {
113
+ return;
158
114
  }
159
- }).filter(Boolean);
160
-
161
- // 1. 获取全局配置
162
- const {timeout: globalTimeout} = getGlobalConfig();
163
-
164
- // 2. 预检测所有循环依赖(防止无限递归)
165
- checkAllCycles(configList);
166
-
167
- // 3. 初始化缓存(存储已加载资源结果,避免重复加载)
168
- const loadedMap = new Map();
169
-
170
- // 4. 按配置定义的顺序,并行加载同层级无依赖资源(保证依赖先加载,结果保留原始顺序)
171
- const rawOrderPromises = configList.map(async function(config) {
172
- return await loadResourceWithDeps(config.name, configList, globalTimeout, loadedMap);
173
- });
174
-
175
- // 5. 等待所有资源加载完成,返回原始配置顺序的结果
176
- return Promise.all(rawOrderPromises).then(function (result) {
177
- if (result.find(item => item.error)) {
178
- return Promise.reject(result);
115
+ const url = new URL(item[0], window.location.href);
116
+ return {
117
+ name: url.pathname,
118
+ urls: item,
119
+ type: url.pathname.split(".").pop() || "js",
120
+ };
121
+ } else {
122
+ if (typeof item.urls === "string") {
123
+ item.urls = [item.urls];
179
124
  }
180
- return result;
181
- });
125
+ return item;
126
+ }
127
+ })
128
+ .filter(Boolean);
129
+
130
+ // 1. 获取全局配置
131
+ const { timeout: globalTimeout } = getGlobalConfig();
132
+
133
+ // 2. 预检测所有循环依赖(防止无限递归)
134
+ checkDependencies(configs);
135
+
136
+ // 3. 初始化缓存(存储已加载资源结果,避免重复加载)
137
+ const loadedMap = new Map();
138
+
139
+ // 4. 按配置定义的顺序,并行加载同层级无依赖资源(保证依赖先加载,结果保留原始顺序)
140
+ const rawOrderPromises = configs.map(async function (config) {
141
+ return await loadResourceWithDeps(
142
+ config.name,
143
+ configs,
144
+ globalTimeout,
145
+ loadedMap,
146
+ );
147
+ });
148
+
149
+ // 5. 等待所有资源加载完成,返回原始配置顺序的结果
150
+ return Promise.all(rawOrderPromises).then(function (result) {
151
+ if (result.find((item) => item.error)) {
152
+ return Promise.reject(result);
153
+ }
154
+ return result;
155
+ });
182
156
  }
package/types/index.d.ts CHANGED
@@ -1,14 +1,24 @@
1
1
  // 资源配置类型
2
- export type ResourceConfig = {
3
- /** 资源名称/ID */
2
+ export type ResourceConfig =
3
+ | {
4
+ /** 资源名称/ID */
5
+ name: string;
6
+ /** 资源类型 (js, css, 等) */
7
+ type: string;
8
+ /** 资源URL数组,按优先级顺序 */
9
+ urls: string | string[];
10
+ /** 依赖的其他资源ID数组 */
11
+ dependencies?: string[];
12
+ }
13
+ | string
14
+ | string[];
15
+
16
+ export type FullResourceConfig = {
4
17
  name: string;
5
- /** 资源类型 (js, css, 等) */
6
18
  type: string;
7
- /** 资源URL数组,按优先级顺序 */
8
19
  urls: string[];
9
- /** 依赖的其他资源ID数组 */
10
20
  dependencies?: string[];
11
- } | string| string[];
21
+ };
12
22
 
13
23
  // 加载结果类型
14
24
  export interface LoadResult {
@@ -31,7 +41,7 @@ export interface ResourceLoadResult {
31
41
  /** 加载结果 */
32
42
  result: LoadResult;
33
43
  /** 加载状态 */
34
- status: 'success' | 'failed';
44
+ status: "success" | "failed";
35
45
  /** 错误信息 */
36
46
  error: Error | null;
37
47
  }
@@ -54,7 +64,9 @@ export type LoaderHandler = (url: string) => Promise<any>;
54
64
  * @param configList - 资源配置数组
55
65
  * @returns 加载结果数组的Promise
56
66
  */
57
- export function resourcePreloader(configList: ResourceConfig[]): Promise<ResourceLoadResult[]>;
67
+ export function resourcePreloader(
68
+ configList: ResourceConfig[],
69
+ ): Promise<ResourceLoadResult[]>;
58
70
 
59
71
  /**
60
72
  * 注册自定义加载器