Modernizr.load 已弃用。 Yepnope.js 已弃用。当前的替代品?

Modernizr.load Deprecated. Yepnope.js Deprecated. Current Alternatives?

Modernizr.load 和 yepnope.js 都已弃用。 我们现在如何有条件地调用 javascript 文件? 能举个例子吗?

这是我要加载的javascript

var BubbleShoot = window.BubbleShoot || {};
BubbleShoot.Game = (function($){
var Game = function(){
    this.init = function(){
      $(".but_satart_game").bind("click", startGame);
    };
    var startGame = function(){
      console.log("dentro de startGame  en game.js");
      //$(".but_satart_game").unbind("click");
      //BubbleShoot.ui.hideDialog();
    };

  };
   return Game;
})(jQuery);

和modernizr的代码:

  Modernizr.load({
  load: "_js/game.js",
  complete: function(){
    $(function(){
      var game = new BubbleShoot.Game();
      game.init();
    })
});

您可以使用 document.createElement 将脚本动态添加到页面,使用 .async = true 将其添加到 DOM,然后从脚本的 [=] 调用游戏的 init() 函数16=] 事件侦听器:

function addGameScriptToPage() {

    const scriptElement = document.createElement('script');
    scriptElement.async = true;
    scriptElement.addEventListener( 'load', function( e ) { new BubbleShoot.Game().init(); } );
    scriptElement.src = '__js/game.js';
    document.head.appendChild( scriptElement );
}

您可以通过将脚本的 URL 作为参数传递并为 load 事件侦听器返回 Promise 来使其更通用,因此使用此函数的页面可以有自己的自己的自定义加载逻辑:

function addScriptToPage( scriptUrl ) {
    return new Promise( ( resolve, reject ) => {
        const scriptElement = document.createElement('script');
        scriptElement.async = true;
        scriptElement.addEventListener( 'load', function( e ) { 
            resolve( e );
        );
        scriptElement.addEventListener( 'error', function( e ) { 
            reject( e );
        );
        scriptElement.src = scriptUrl;
        document.head.appendChild( scriptElement );
    } );
}

这样使用:

async function doStuff() {

    const shouldLoadGame = prompt( "Would you like to play a game of global thermonuclear war?" );
    if( shouldLoadGame ) {

        try {
            await addScriptToPage( "__js/game.js" );

            // This code runs when the 'load' event listener calls `resolve(e)`.
            const g = new BubbleShoot.Game();
            g.init();
        }
        catch( err ) {
            // This code runs when the 'error' event listener calls `reject(e)`.
            alert( "Game failed to load." ); // 
        }
    }

}

...这几乎就是按需加载模块的 require() 函数的工作方式,顺便说一句。