/

通过创建script 动态引入js

起因

在项目上会需要excel或者pdf这样的插件,不是每个页面都需要这个插件,通过npm install pdf.js 这样的方式会使得node_module会很大,项目比较臃肿,影响打包压缩时间。 通过script标签引入比较合适。

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
dynamicScript (urls) { return new Promise((resolve, reject) => { const scripts = document.getElementsByTagName('script') const srcs = [] for (let i = 0, len = scripts.length; i < len; i++) { srcs.push(scripts[i].getAttribute('src')) } let index = 0 urls.forEach((s) => { if (!srcs.includes(s)) { const node = document.createElement('script') node.src = s node.type = 'text/javascript' document.body.appendChild(node) node.onload = function () { if (index === urls.length - 1) { resolve() } index++ } } else { if (index === urls.length - 1) { resolve() } index++ } }) }) }, this.dynamicScript(['../../../../assets/lib/ol.js']).then(d => { // eslint-disable-next-line no-console console.log(d) // eslint-disable-next-line no-consol console.log(ol.Map) })

把插件放到服务器中,只有在用到的时候才会调用。

在angular中的应用,用到了rxjs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
dynamicLoadScript(dynamicScripts: string[]) { let scriptSrc = Array.from(document.getElementsByTagName("script")).map(v => v.getAttribute('src')) return from(dynamicScripts).pipe( filter(v => !scriptSrc.includes(v)), tap(v => console.log('加载script:' + v)), mergeMap((v: any) => { let node = document.createElement('script') node.src = v node.type = 'text/javascript' document.body.appendChild(node) return fromEvent(node, 'load').pipe(first()) }), defaultIfEmpty(null), last() ) }
作者:liuk123标签:js分类:javascript

本文是原创文章,采用 CC BY-NC-ND 4.0 协议, 完整转载请注明来自 liuk123