通过创建script 动态引入js {#h_通过创建script-动态引入js}
起因 {#h_起因}
在项目上会需要excel或者pdf这样的插件,不是每个页面都需要这个插件,通过 npm install pdf.js
这样的方式会使得node_module会很大,项目比较臃肿,影响打包压缩时间。 通过 script
标签引入比较合适。
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
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()
)
}