51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

通过创建script 动态引入js

通过创建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()
    )
  }
赞(2)
未经允许不得转载:工具盒子 » 通过创建script 动态引入js