forked from MichealWayne/fe-tools
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathloadAssets.ts
156 lines (141 loc) · 4.27 KB
/
loadAssets.ts
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
/**
* @module loadAssets
* @author Wayne
* @Date 2024-04-07 13:45:27
* @LastEditTime 2024-08-25 10:14:05
*/
import { runPromisesInSeries } from 'utils';
/**
* @function loadScript
* @description 动态加载js
* @param {string} url js地址
* @param {boolean} isCrossOrigin 是否跨域
* @returns {Promise<any>} js加载完成后的回调
* @example
* loadScript('https://cdn.jsdelivr.net/npm/[email protected]/dist/echarts.min.js').then(()=>{
* // use echart api
* echarts.init(document.getElementById('main'));
* })
*/
export function loadScript(url: string, isCrossOrigin = true) {
return new Promise((resolve, reject) => {
const script = document.createElement('script');
script.src = url;
script.onload = resolve;
script.onerror = err => reject({ err, url });
script.setAttribute('type', 'text/javascript');
if (isCrossOrigin) {
script.setAttribute('crossorigin', 'anonymous');
}
document.body.appendChild(script);
});
}
/**
* @function loadScriptList
* @description 动态加载js列表
* @param {string[]} urls js地址列表
* @param {boolean} isCrossOrigin 是否跨域
* @param {boolean} isAsync 是否异步加载
* @returns {Promise<any[]>} js加载完成后的回调
* @example
* loadScriptList(['a.js', 'b.js', 'c.js']).then(() => {
* // use a.js, b.js, c.js
* })
*/
export function loadScriptList(urls: string[], isCrossOrigin = true, isAsync = true) {
if (isAsync) return Promise.all(urls.map(url => loadScript(url, isCrossOrigin)));
return runPromisesInSeries(urls.map(url => () => loadScript(url, isCrossOrigin)));
}
/**
* @function loadCss
* @description 动态加载css
* @param {string} url css地址
* @returns {Promise<void>} css加载完成后的回调
* @example
* loadCss('a.css').then(() => {
* // use bootstrap css
* }
*/
export function loadCss(cssPath: string) {
return new Promise((resolve, reject) => {
const head = document.querySelector('head');
if (!head) {
return reject('no head element');
}
const css = document.createElement('link');
css.href = cssPath;
css.rel = 'stylesheet';
css.type = 'text/css';
head.appendChild(css);
function loadCB() {
css.removeEventListener('load', loadCB);
resolve(true);
}
css.addEventListener('load', loadCB);
return true;
});
}
/**
* @function loadCssList
* @description 动态加载css列表
* @param {string[]} cssList css地址列表
* @returns {Promise<any>} css加载完成后的回调
* @example
* loadCssList(['a.css', 'b.css', 'c.css']).then(() => {
* // use a.css, b.css, c.css
* }
*/
export function loadCssList(cssList: string[]): Promise<any> {
return Promise.all(cssList.map(item => loadCss(item)));
}
/**
* @function loadImage
* @description 动态加载图片资源(常用于预加载)
* @param {string} imgUrl 图片地址
* @returns {Promise<HTMLImageElement>} 图片加载完成后的回调
* @example
* loadImage('a.png').then(img => {
* // use img
* }
*/
export function loadImage(imgUrl: string) {
return new Promise((resolve, reject) => {
const img = new Image();
img.src = imgUrl;
img.onload = () => resolve(img);
img.onerror = reject;
});
}
/**
* @function loadImageList
* @description 动态加载图片资源列表(常用于预加载)
* @param {string[]} imageUrls 图片地址列表
* @returns {Promise<HTMLImageElement[]>} 图片加载完成后的回调
* @example
* loadImageList(['a.png', 'b.png', 'c.png']).then(imgs => {
* // use imgs
* }
*/
export function loadImageList(imageUrls: string[]) {
return Promise.all(imageUrls.map(item => loadImage(item)));
}
/**
* @function loadCsv
* @description 前端下载csv数据表(可以配置utils里arrayToCSV)
* @param {string} csvStr csv字符串
* @param {string} name 文件名
* @param {string} type 文件类型
*/
export function loadCSV(csvStr: string, name = 'data', type = 'csv') {
let blobContent = new Blob(['\ufeff' + csvStr], {
type: `text/plain,charset=utf-8`,
});
let blobUrl = window.URL.createObjectURL(blobContent);
let eleLink = document.createElement('a');
eleLink.download = `${name}.${type}`;
eleLink.style.display = 'none';
eleLink.href = blobUrl;
document.body.appendChild(eleLink);
eleLink.click();
document.body.removeChild(eleLink);
}