关于vue.js:Vue组件中如何引入外部的js文件

在Vue中,通常咱们引入一个js插件都是应用npm 形式下载而后import应用的。然而我当初本地有了js文件或者是一个近程js文件链接,我不想应用npm install xxx 的形式,有什么方法吗?

办法1

简略粗犷,间接在Vue我的项目的index.html 中应用全局的形式引入,比方:

<!DOCTYPE html>
<html>
<head>
    <!-- ... 省略-->
</head>
<body>
    <div id="app"></div>
</body>
<script src="../xxx.js"></script> // 暴力引入
</html>

毛病:不应用该js插件的组件也会加载,而我只想在某个Vue组件中应用该js插件。


办法2

如果是下载到本地的动态文件,能够应用import 的形式导入。

import { xxx } from '门路' 

毛病:下载的动态文件才能够


办法3

在Vue组件加载完后,手动操作DOM插入js插件。

export default {
    mounted() {
        let script = document.createElement('script');
        script.type = 'text/javascript';
        script.src = '你的js文件地址';
        document.body.appendChild(script);
    },
}

该形式间接操作DOM,只在以后组件插入js插件。


办法4

应用render办法

export default {
    components: {
        'xxx-js': {
            render(createElement) {
                return createElement(
                    'script',
                    {
                        attrs: {
                            type: 'text/javascript',
                            src: '你的js文件地址',
                        },
                    },
                );
            },
        },
    },
}
// 应用 <xxx-js></xxx-js> 组件形式在页面中调用

办法5

高阶玩法。将形式三包装成一个js插件,应用 Promise,js加载胜利,调用resolve,js加载失败,调用reject。

function loadJs(src) {
  return new Promise((resolve,reject)=>{
    let script = document.createElement('script');
    script.type = "text/javascript";
    script.src= src;
    document.body.appendChild(script);
      
    script.onload = ()=>{
      resolve();
    }
    script.onerror = ()=>{
      reject();
    }
  })
}
 
export default loadJs

应用的时候:

import loadJs from '../../utils/base/loadJs'
   
export default {
    mounted(){
        loadJs('http://api.map.baidu.com/xxx.js').then(()=>{
            // 加载胜利,进行后续操作
        })
    }
}

办法6

更高阶形式。能够动静替换要加载的js文件。

包装一个importJs.js 插件。

// 导入内部js
import Vue from 'vue'
 
Vue.component('remote-script', {
  render: function (createElement) {
    var self = this;
    return createElement('script', {
      attrs: {
        type: 'text/javascript',
        src: this.src
      },
      on: {
        load: function (event) {
          self.$emit('load', event);
        },
        error: function (event) {
          self.$emit('error', event);
        },
        readystatechange: function (event) {
          if (this.readyState == 'complete') {
            self.$emit('load', event);
          }
        }
      }
    });
  },
  props: {
    src: {
      type: String,
      required: true
    }
  }
});

应用形式:

// 引入
import '@/common/importJs.js'
// html应用的中央
<remote-script src="js文件门路"></remote-script>

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理