使用Shim在Backbone + Requirejs中包含一个自定义Jquery插件

时间:2012-12-20 22:06:54

标签: jquery jquery-ui backbone.js requirejs backbone-views

我有一个骨干项目,我使用require.js来模块化代码。

我的main.js看起来像这样:

require.config({
    paths:{
        jquery:'../../../../core/js/external/jquery/jquery-1.8.2',
        underscore:'../../../../core/js/external/underscore/underscore',
        backbone:'../../../../core/js/external/backbone/backbone',
        text:'../../../../core/js/external/require/text',
        backbone_paginate:'../../../../core/js/external/backbone/backbone.pagination',
        'jquery.sprites':'../../../../core/js/sprites',
        'jquery.sprite_util':'../../../../core/js/util/spriteUtil'


    },
    shim:{
        'backbone':{
            deps:['underscore', 'jquery'],
            exports:'Backbone'
        },
        'underscore':{
            exports:'_'
        },
        'jquery.blades':{
            deps:['jquery']
        },

        'jquery.sprites':{
            deps:['jquery']
        },
        'jquery.sprite_util':{
            deps:['jquery.sprites']
        }
    }
    }
});
require(['../app'], function (AppView) {
    "use strict";
    new AppView();
});

所以,这里的jquery.sprites和jquery.utils是我需要使用的插件,而不是在我的视图中包含它们。目前,无论在何处使用,我都必须将它们包含在任何地方。例如:

define([
  'jquery',
  'underscore',
  'backbone',
  'views/SimpleNamedObjectView',
  'jquery.sprites',
  'jquery.sprite_util',


], function($, _, Backbone, SimpleNamedObjectView){
  "use strict";

有没有办法可以访问jquery.sprites和jquery.sprite_util而不在每个视图中包含它们?它可以从main.js的所有视图变为全局,以便我可以使用这些插件的功能而不将它们包含在所有视图中吗? 例如这个。$ el.getSprites(); (其中getSprites是jquery.sprites的方法)

1 个答案:

答案 0 :(得分:3)

一旦它们被加载,因为它们已经“填充”,它们将在全球范围内可用。

因此,您可以在require内的引导main.js调用中将它们称为依赖项。这样可行。

但是!这完全违背了Require.js和AMD的理念。每个模块都应声明所有依赖项,以便它们可以单独加载并按原样工作。这样也可以更容易进行单元测试。

所以,是的,你可以,但你真的不应该这样做