loadJsOrCssMulSync【批量加载远程css和js文件】
描述
支持批量加载远程 css 和 js 文件,返回 promise,如果 html 已经出现相同的 script,将不会重新加载,除非 src 地址不一致。
# 1.示例
# 1.1 加载单个 js
复制代码
# 1.2 同时加载 js 和 css
复制代码
# 1.3 同时加载多个 js
复制代码
# 2.入参说明
| 参数 | 说明 | 类型 | 是否必填 | 默认值 |
|---|---|---|---|---|
| urlList | js 或者 css 链接地址 | Array<String> | 是 |
# 3.源码
源码,点开查看 👈
/**
* 支持批量加载css 和 jsm 例子:loadRemoteScriptOrCss(['https://unpkg.com/element-ui/lib/theme-chalk/index.css', 'https://unpkg.com/element-ui/lib/index.js'])
* @param {Array} urlList 类型 Array | String
* @returns {Promise<void>}
*/
async function loadJsOrCssMulSync(urlList = []) {
const getTypeFromUrl = url => {
// eslint-disable-next-line no-useless-escape
const _type = /\.[^\.]+$/.exec(url)[0]
if (_type === '.js') {
return 'text/javascript'
}
if (_type === '.css') {
return 'text/css'
}
}
const formatFileList = arg => {
let args0
if (typeof arg === 'string') {
args0 = [arg]
} else if (Array.isArray(arg)) {
args0 = arg
} else {
throw { error: 'The dynamicFile parameter must be a string or an array' }
}
let args1
args1 = args0.map(i => {
let url
let type
if (typeof i === 'string') {
url = i
type = getTypeFromUrl(url)
} else if (Array.isArray(i)) {
;[url] = i
type = i[1] && i[1].type ? i[1].type : getTypeFromUrl(url)
} else {
throw { error: 'The dynamicFile parameter must be a string or an array' }
}
return { url, type }
})
return args1
}
const createElement = ({ type, url }) => {
switch (type) {
case 'text/javascript': {
const element = document?.createElement('script')
element.setAttribute('type', 'text/javascript')
element.src = url
return element
}
case 'text/css': {
const element = document?.createElement('link')
element.href = url
element.setAttribute('rel', 'stylesheet')
element.setAttribute('media', 'all')
element.setAttribute('type', 'text/css')
return element
}
default:
break
}
}
/* eslint-disable no-param-reassign */
const loadElement = element =>
new Promise(resolve => {
const head = document?.getElementsByTagName('head')[0]
head.appendChild(element)
if (element.readyState) {
element.onreadystatechange = () => {
if (element.readyState === 'loaded' || element.readyState === 'complete') {
element.onreadystatechange = null
resolve()
}
}
} else {
element.onload = resolve
}
})
try {
const list = formatFileList(urlList)
const elementList = list.map(createElement)
await Promise.all(
elementList.map(i => {
return loadElement(i)
})
)
} catch (error) {
console.log(error)
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
上次更新: 2025/07/01, 14:52:29