Vue组件中的条件导入

时间:2020-06-28 06:35:01

标签: javascript vue.js vuejs2 video.js

我有一个包含几个CustomVideo组件的根实例(在其他组件中)。 CustomVideo组件实现了VideoJS,但是并不是在所有页面上都有CustomVideo组件,因此我不想在全球范围内导入VideoJS。这是页面上组件的示例:

App.js
|
|-- CustomVideo
|-- FooComponent
|-- CustomVideo
|-- BarComponent
|-- CustomVideo

在CustomVideo顶部,导入VideoJS,如下所示:

import videojs from 'video.js';
import abLoopPlugin from 'videojs-abloop'


export default {
  name: "FeaturedVideoPlayer",
  props: {
    videoUrl: String
  }
  mounted() {
    let videoOptions = {
      sources: [
        {
          src: this.videoUrl,
          type: "video/mp4"
        }
      ],
      plugins: {
        abLoopPlugin: {
          'enabled': true
        }
      }
    };

    this.player = videojs(this.$refs.featuredVideoPlayer, videoOptions, function onPlayerReady() {});

  }

但是如果有多个CustomVideo,则会收到控制台警告:

视频:警告:已经存在一个名为“ abLoopPlugin”的插件。您可能要避免重新注册插件!

我尝试研究条件导入,但似乎不是这样做的方法。


即使我尝试将其导入app.js,即使我更愿意将其导入CustomVideo,也会出现另一个控制台错误:

尝试

import abLoopPlugin from 'videojs-abloop'
Vue.use( abLoopPlugin );

然后我得到了错误:

未捕获的TypeError:无法读取未定义的属性'registerPlugin'


如何确保插件仅注册一次?

2 个答案:

答案 0 :(得分:1)

选中videojs.getPlugins().abLoopPlugin

videojs.getPlugins()返回所有已加载插件名称的符号表。您可以简单地检查abLoopPlugin不在该表中,然后再将其加载到组件中:

import videojs from 'video.js'

if (!videojs.getPlugins().abLoopPlugin) {
  abLoopPlugin(window, videojs)
}

在使用$nextTick之前等待ref

您会注意到,您的视频最初在您指定的<video>元素中不可见。这是因为将ref传递给videojs中的mounted()时未定义。

ref docs状态:

关于ref注册时间的重要说明:由于ref本身是通过render函数创建的,因此您无法在初始渲染时访问它们-它们尚不存在!

解决方案是等到$nextTick()

async mounted() {
  // this.$refs.featuredVideoPlayer is undefined here
  await this.$nextTick()

  // this.$refs.featuredVideoPlayer is the <video> here
  this.player = videojs(this.$refs.featuredVideoPlayer)
}

Edit Using videojs-abloop in Vue

答案 1 :(得分:0)

尝试创建abLoopPlugin的实例。对于vue-i18n和其他插件,我遵循相同的方法在全球范围内使用。像这样:

import AbLoopPlugin from 'videojs-abloop'

Vue.use(AbLoopPlugin) // CHECK IF REGISTER PLUGIN ERROR PERSIST

const abLoopPlugin = new AbLoopPlugin({
   ---your settings---
})
export default abLoopPlugin