如何将外部 JS 脚本添加到 VueJS 组件?

IT技术 javascript vue.js vuejs2 vue-component vue-router
2021-01-22 12:58:22

我必须为支付网关使用两个外部脚本。

现在两者都放在index.html文件中。

但是,我不想在一开始就加载这些文件。

仅当用户打开特定组件 ( using router-view)时才需要支付网关

有没有办法实现这一目标?

谢谢。

6个回答

解决这个问题的一个简单有效的方法是将外部脚本添加到mounted()组件的 vue中。我将用Google Recaptcha脚本向您说明

<template>
   .... your HTML
</template>

<script>
  export default {
    data: () => ({
      ......data of your component
    }),
    mounted() {
      let recaptchaScript = document.createElement('script')
      recaptchaScript.setAttribute('src', 'https://www.google.com/recaptcha/api.js')
      document.head.appendChild(recaptchaScript)
    },
    methods: {
      ......methods of your component
    }
  }
</script>

来源:https : //medium.com/@lassiuosukainen/how-to-include-a-script-tag-on-a-vue-component-fe10940af9e8

created()方法无法获取文档,请mounted()改用
2021-03-24 12:58:22
这是包含您无法控制且无法直接包含的外部库的好方法。要访问其中的构造函数和函数,而无需 Vue 编译器抱怨,请参阅stackoverflow.com/a/62617268/917444
2021-03-27 12:58:22
@mejiamanuel57 如果我要重用这样的 vue 组件怎么办?每个人都会在文档头中添加相同的 <script> 标签吗?
2021-03-31 12:58:22
之后使用脚本定义的变量,即使 defer 设置为 false,也不起作用。示例:加载api.mapbox.com/mapbox-gl-js/v1.11.1/mapbox-gl.js mapboxgl.accessToken = 123。必须使用 vue-plugin-load-script .then() 才能使其工作。
2021-04-03 12:58:22
你好!我试过这个解决方案。我想从项目 src/assets/js/ 文件夹加载脚本,但它有错误未捕获 SyntaxError: Unexpected token '<'。但是当我尝试从 CDN 加载时,它没有错误。我是 Vue 的新手,我使用 vue-cli 创建项目。TIA
2021-04-07 12:58:22

我已经下载了一些带有自定义 js 文件和 jquery 的 HTML 模板。我不得不将这些 js 附加到我的应用程序中。并继续使用 Vue。

找到了这个插件,这是一种通过 CDN 和静态文件添加外部脚本的干净方法 https://www.npmjs.com/package/vue-plugin-load-script

// local files
// you have to put your scripts into the public folder. 
// that way webpack simply copy these files as it is.
Vue.loadScript("/js/jquery-2.2.4.min.js")

// cdn
Vue.loadScript("https://maps.googleapis.com/maps/api/js")
这个 Vue.loadScript() 将位于哪个文件中?是 App.vue 文件吗?
2021-04-06 12:58:22

使用 webpack 和 vue loader 你可以做这样的事情

它在创建组件之前等待外部脚本加载,因此组件中可以使用全局变量等

components: {
 SomeComponent: () => {
  return new Promise((resolve, reject) => {
   let script = document.createElement('script')
   script.onload = () => {
    resolve(import(someComponent))
   }
   script.async = true
   script.src = 'https://maps.googleapis.com/maps/api/js?key=APIKEY&libraries=places'
   document.head.appendChild(script)
  })
 }
},
如果您必须多次使用此组件怎么办?您将多次加载脚本。如果是 google 脚本,它会在您的控制台中发出警告。
2021-03-23 12:58:22
>> “你把这个代码放在哪里?” :它在你的 vuejs 组件的 components 部分。
2021-03-26 12:58:22
你能解释一下这是怎么回事import(someComponent)吗?您加载的脚本是否必须定义为 es module?如果您要导入一个附加到 的脚本,这是否不起作用window
2021-04-02 12:58:22

如果您尝试将外部 js 脚本嵌入到 vue.js 组件模板中,请执行以下操作:

我想向我的组件添加一个外部 javascript 嵌入代码,如下所示:

<template>
  <div>
    This is my component
    <script src="https://badge.dimensions.ai/badge.js"></script>
  </div>
<template>

Vue 向我展示了这个错误:

模板应该只负责将状态映射到 UI。避免在模板中放置带有副作用的标签,例如 ,因为它们不会被解析。


我解决它的方法是添加type="application/javascript"请参阅此问题以了解有关 js 的 MIME 类型的更多信息):

<script type="application/javascript" defer src="..."></script>


您可能会注意到该defer属性。如果您想了解更多信息,请观看Kyle 的此视频

VueCompilerError:在客户端组件模板中忽略具有副作用的标签(<script> 和 <style>)。
2021-03-14 12:58:22
谢谢你!谁能解释一下这是如何/为什么工作的?学习Vue所以很好奇。
2021-03-24 12:58:22
谢谢男人,效果很好,也适用于内联 javascript 代码
2021-04-03 12:58:22
效果很好,谢谢!Webpack 的附加提示:require('module-name/file-name.js')
2021-04-09 12:58:22

这可以像这样简单地完成。

  created() {
    var scripts = [
      "https://cloudfront.net/js/jquery-3.4.1.min.js",
      "js/local.js"
    ];
    scripts.forEach(script => {
      let tag = document.createElement("script");
      tag.setAttribute("src", script);
      document.head.appendChild(tag);
    });
  }
附带问题:添加属性“defer”有意义吗?我想不是因为网站已经加载,但也许它仍然有意义......知道吗?
2021-03-15 12:58:22