【问题标题】:Use 3rd party Javascript library in Vue component [duplicate]在 Vue 组件中使用 3rd 方 Javascript 库 [重复]
【发布时间】:2018-08-28 04:35:21
【问题描述】:

我正在使用 Webpack 和 VueJs 2。我想在我的组件中使用第 3 方 javascript 库,例如:

<script async defer src="https://apis.google.com/js/api.js" ... ></script>

我找到了一篇文章 here 关于如何为 npm 包执行此操作,但这对我不起作用,因为该库不能作为 npm 包使用。

我无法在本地下载文件并使用它,因为库可能会更改并停止工作。因此,每次浏览器加载页面时,都必须从链接中加载。

我找到了一种可能的解决方案 here 但这基本上是一种 hack(在加载文档后修改 dom 以添加 script 元素)

我相信这个问题必须有一个简单的良好实践解决方案,因为我认为这是一个常见的用例。

更新: 如果我将脚本放在索引文件的头标签中,它将为所有组件加载。出于性能原因,我希望它只为某个组件加载。

【问题讨论】:

  • 如果它需要在 created/method 挂钩中,您为什么不直接包含示例中的脚本并实例化它?
  • 为什么不把脚本标签放在 index.html 文件的 中?
  • @LoïcMonard 查看更新
  • 如果您不想将它包含在索引文件中,您仍然可以将其包含在单个组件中,这样它只会在加载该组件时才被加载
  • @samayo 你能举个例子吗?

标签: webpack vue.js vuejs2


【解决方案1】:

据我所知,没有比动态添加script 标记到页面头部更好的方法了。但是,您可以创建一个小插件来为您处理,并仅在您想要的组件中触发脚本加载,并且只加载一次。

让我们从插件本身开始:

import Vue from 'vue'

const scriptLoader = {
    loaded: [],
    load (src) {
        if (this.loaded.indexOf(src) !== -1) {
            return
        }

        this.loaded.push(src)

        if (document) {
            const script = document.createElement('script')
            script.setAttribute('src', src)
            document.head.appendChild(script)
        }
    }
}

Vue.use({
    install () {
        Vue.prototype.$scriptLoader = scriptLoader
    }
})

如您所见,您创建了一个对象scriptLoader,其中包含某种缓存对象loaded,它会记住您在应用程序中某个时间点已加载的脚本。它还包含一个load() 方法,该方法将处理将脚本添加到您的头脑中。

条件if (document) 在这里,以防您在服务器端渲染您的应用,document 将不存在。

然后,您可以在创建时使用 created 挂钩将脚本加载到任何组件中:

export default {
    ...
    created () {
        this.$scriptLoader.load('https://apis.google.com/js/api.js')
    }
}

这是我用来处理这种脚本的最简洁的方法...我希望这可以帮助...

【讨论】:

    【解决方案2】:

    好的,找到了满足所有要求的解决方案。

    • 脚本是从网上下载的,不需要npm包
    • 脚本仅在某些情况下加载 需要时的组件
    • 没有丑陋的 dom 操作

    使用v-if 指令在 index.html 中添加脚本

    <script v-if="loadGoogleAPI" async defer src="https://apis.google.com/js/api.js" ... ></script>
    

    在组件文件 (.vue) 中,如果要加载脚本,请将标志设置为 true

    <script>
    export default {
      ...
      loadGoogleAPI: true,
      data() {
      ...
      }
    };
    </script>
    

    【讨论】:

    • 如果 scriptv-if 在 Vue 实例之外,则 v-if 完全没有效果。
    • 即使v-if 确实有效,删除script 对已经加载的代码也没有影响。删除 &lt;script&gt; 不会卸载其代码
    • @acdcjunior 这是一个好点,但幸运的是我不需要卸载脚本。如果我需要一种解决方法,那就是制作一个多页 vue 应用程序
    • 然后我指出的另一个问题/答案完全相同。
    猜你喜欢
    • 2017-10-09
    • 1970-01-01
    • 2018-06-18
    • 1970-01-01
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多