5

有没有办法避免加载可能已经存在到 DOM 中的模块?

例子:

require.config({
  paths: {
    // jquery here is needed only if window.jQuery is undefined
    'jquery': '//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min'
  }
});

能够使用像这个片段这样的东西会很棒

require.config({
  paths: {
    'jquery': {
       uri: '//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min',
       // if this function returns false or undefined load the script from the url
       define: function(){ return window.jQuery; } 
    }
  }
});

-------------------------------------------------- ---------------

更新

-------------------------------------------------- ---------------

我在 github https://github.com/jrburke/requirejs/issues/886上向@jrburke 发送了一个拉取请求以及我的提议。可以在这里测试 requirejs 的固定版本:

http://gianlucaguarini.com/experiments/requirejs/requirejs-test3.html

这里是根据我的 API 提议的 requirejs 配置

require.config({
  paths: {
    // jquery here is needed only if window.jQuery is undefined
    'jquery':'//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min',
    'lodash':'//cdnjs.cloudflare.com/ajax/libs/lodash.js/2.0.0/lodash.underscore.min',
    'backbone':'//cdnjs.cloudflare.com/ajax/libs/backbone.js/1.0.0/backbone-min'
  },
  shim:{
    'jquery':{
      // with my fix now I detect whether window.jQuery has been already defined
      // in this case I avoid to load the script from the cdn
      exports:'jQuery',
      // if this feature is missing I need to load the new jQuery from the cdn
      validate: function(){
        return  window.jQuery.Defferred;
      }
    },
    'lodash':{
      // lodash will be loaded only if it does not exist in the DOM
      exports:'_',
      // if this function returns false or undefined load the script from the cdn
      validate: function() {
        // is the lodash version already available in the DOM new enough for my application?
        return  window.parseInt(window._.VERSION) >= 2;
      }
    },
    'backbone':{
      deps:['lodash','jquery'],
      // if backbone exists we don't need to load it twice
      exports:'Backbone'
    }
  }
});
4

2 回答 2

2

正如@jrburke 在您的pull-request中指出的那样,这样做的方法是:

require.config({});

if (typeof jQuery === 'function') {
  define('jquery', function() { return jQuery; });
}

// start module loading here
require(['app'], function(app) {});

如果一个模块已经定义,它不会被(重新)加载。在这里,定义只是重新使用已经加载的全局jQuery对象。

于 2014-10-15T03:43:21.107 回答
0

由于 jQuery 与 AMD 兼容,如果它已经在页面中,Require.js 将不会再次加载它。

在更广泛的意义上,Require.js 仅在尚未定义模块时查看路径配置。因此,一旦您定义了一个模块,Require.js 就不会再次加载它:

define('jquery', [], function() { /* stuff */ });
//        ^ Module 'jquery' is defined here. Require.js won't load it twice.

查看此 JsBin 以获取工作示例:http: //jsbin.com/OfIBAxA/2/edit

于 2013-09-20T17:35:32.337 回答