当我还使用RequireJS

时间:2015-12-08 18:55:43

标签: javascript requirejs video.js

我正在一个包含一些我无法控制的JS代码的网站上工作。该代码使用RequireJS加载依赖项和所有。

免责声明:我是RequireJS noob。我理解基础知识,但这几乎就是......

在我的网站上,我需要使用VideoJS。 VideoJS可以使用,也可以不使用RequireJS,但根据我的理解,如果在页面的某个地方使用RequireJS,我就不能使用VideoJS。

所以我正在使用RequireJS加载VideoJS:

var MyRequire = requirejs.config({
    baseUrl: '/_/js',
    paths: {
        videojs: 'http://vjs.zencdn.net/5.3.0/video'
    }
});
MyRequire(["videojs"], function(videojs) {
    videojs('myPlayer', {}, function(){
        console.log('...');
    });
});

它正在工作。

但我想使用VideoJS插件来管理预付费广告。 (https://github.com/dirkjanm/videojs-preroll

我尝试将插件脚本包含在RequireJS中,包含脚本但是一旦插件尝试访问videojs对象,我就会收到一个错误,告诉我videojs没有定义。

我的猜测是,当我将VideoJS作为RequireJS模块加载时,它不在全球范围内,我使用的插件正在寻找全球范围内的VideoJS,而且为什么我会收到这个错误。

有没有什么方法可以使用VideoJS而不将它作为RequireJS模块加载?或者我如何帮助插件找到VideoJS对象?

感谢您的帮助!

1 个答案:

答案 0 :(得分:6)

您应该使用requirejs中的shim并将videojs注入全局范围。 我为你的案例编写了一个代码示例。我测试了它并且它可以工作(你可以看到下面的图片):

加载订单:

  1. " videojs"
  2. "附加视频-JS-在全局范围的"
  3. "广告" (此时videojs var已经存在于window对象中)
  4. "预卷"
  5. 需要分析顺序:

    1. requirejs([" preroll","广告"] - 切入点
    2. "预卷" - 需要"广告"
    3. "广告" - 要求" add-video-js-in-global-scope"
    4. "附加视频-JS-在全局范围的" - 要求" videojs"并在window对象中添加videojs var。
    5. app.js

      
      
      requirejs.config({
          paths: {
              "videojs": "./libs/video",
              "ads": "./libs/videojs.ads",
              "preroll": "./libs/videojs-preroll"
          },
          shim:{
              "preroll": {
                  deps: ['ads']
              },
              "ads": {
                  deps: ["add-video-js-in-global-scope"],
              }
          }
      });
      
      define("add-video-js-in-global-scope",["videojs"], function(videojs) {
          window.videojs = videojs;
      });
      
      requirejs(["preroll", "ads"], function (preroll,ads) {
          // preroll and ads will be undefined because it's not amd.
          videojs('idOne', {}, function () {
              var player = this;
              player.ads(); // initialize the ad framework
              // your custom ad integration code
          });
      });
      
      
      

      的index.html

      
      
      <html>
      <head>
      </head>
      <body>
          <script data-main="app.js" src="//cdnjs.cloudflare.com/ajax/libs/require.js/2.1.22/require.js"></script>
          <div id="idOne"></div>
      </body>
      </html>
      &#13;
      &#13;
      &#13;

      result:

      files: