RequireJS-手动将一些LIB捆绑在一起

RequireJS-手动将一些LIB捆绑在一起,requirejs,Requirejs,我正在尝试迁移一个站点,以使用RequireJS来管理它的JS依赖关系。我还想把一些LIB捆绑在一起 目前,我们正在构建一个base.min.js,它包括下划线、jquery、引导和主干。它们在我们的网站上随处可见,因此一起为它们服务是有意义的 尽管如此,我认为我们在逻辑上应该将三个LIB按名称分开,因此我编写了以下require.config: require.config({ baseUrl: '/s/js/libs', paths: { app: '.

我正在尝试迁移一个站点,以使用RequireJS来管理它的JS依赖关系。我还想把一些LIB捆绑在一起

目前,我们正在构建一个
base.min.js
,它包括下划线、jquery、引导和主干。它们在我们的网站上随处可见,因此一起为它们服务是有意义的

尽管如此,我认为我们在逻辑上应该将三个LIB按名称分开,因此我编写了以下require.config:

  require.config({
     baseUrl: '/s/js/libs',
     paths: {
       app: '../app', shims: '../shims'
     },
     map: {
       '*' : {
       // underscore, backbone, jquery and bootstrap are bundled
       'underscore': '../base',
       'backbone': '../base',
       'jquery': '../base',
       'bootstrap': '../base'
        }
     },
     shim:{
        'bootstrap': {
           deps: ['jquery']
        },
        'backbone': {
           deps: ['underscore', 'jquery'],
           exports: 'Backbone'
        },
        'underscore': {
            exports: '_'
        },
        'jquery': {exports: '$'}
      }
  });
我没有使用
数据主接口
;但相反,我需要几件事:

  require(["jquery", "underscore", "backbone", "bootstrap", "../baseapp"],
     function($){
       // Next line fixes the bootstrap issue with double modals taken from:
       // http://stackoverflow.com/questions/13649459/twitter-bootstrap-multiple-modal-error
       $.fn.modal.Constructor.prototype.enforceFocus = function () {};
       $('.modal').on('shown', function () {
         $('input:text:visible:first, textarea:visible:first', this).focus();
       });
       $('#search').on('shown', function () {
         $('#id_asf-text').focus();
       })

       require(['micro', 'csrf_xhr', 'locale']);
       require(['app/routers']);

     });
但是,这会导致
$
未定义的错误

全局
窗口。$
已定义,但似乎requirejs没有使用my的
导出
正确检测它。即使我做了
导出:'window.jQuery'
它也不起作用

这是RequireJS中的错误还是我的代码中的错误?
map
shim
配合得好吗?RequireJS支持我的用例吗

更新日期2013-11-05 经过长时间的调试,我发现RequireJS中每个“真实”模块都记录了垫片;因此,如果我只是将垫片更改为:

 shim : {
    '../base': {init: function() {return [$, _, Backbone]}}
 }
我确实将此数组作为回调的第一个参数。然而,我希望他们被引爆,即;将每个返回值作为参数

我认为内部映射+路径可以工作。像这样:

  var require = {
     baseUrl: '/s/js/libs/',
     paths: {
       app: '../app',
       shims: '../shims',

       'base-underscore': '../base',
       'base-backbone': '../base',
   'base-jquery': '../base',
   'base-bootstrap': '../base'
     },
     map: {
       '*' : {
       // underscore, backbone, jquery and bootstrap are bundled
       'underscore': 'base-underscore',
       'backbone': 'base-backbone',
       'jquery': 'base-jquery',
       'bootstrap': 'base-bootstrap',
        }
     },
     shim:{
        'base-bootstrap': {
           deps: ['base-jquery'],
           init: function() {return null}
        },
        'base-backbone': {
           deps: ['base-underscore', 'base-jquery'],
           init: function() {return window.Backbone;}
        },
        'base-underscore': {
           init: function() {return window.Underscore;}
        },
        'base-jquery': {
          init: function() {return $}
        }
     }  // shims
  };

不幸的是,事实并非如此。现在错误是:
Uncaught错误:模块的加载超时:基本下划线、基本主干、基本引导、../base
。。。请注意,基本jquery未列出

我找到了一个解决方法,但涉及一个插件。这是我目前的解决方案。在我的HTML上,我有以下
config
(我改为
require={…}
idiom,这样调试就更容易了):

var STATIC_URL=“/s/js/libs/”;
var require={
baseUrl:静态URL,
路径:{
应用程序:'../app',
垫片:'../垫片',
},
地图:{
'*': {
“jquery”:“bundler!jquery”,
“bootstrap”:“bundler!”,
“下划线”:“bundler!\ux”,
“主干”:“绑定器!主干”
}
},
绑定程序:{url:'../base'}
};
bundler.js
插件位于我的
js/libs
中。这是原始的咖啡脚本:

global=@
each=(ary,func)->
if(ari)
i=0
而i
如果没有价值
价值
g=全球;
每个值。拆分('.'),(部分)->
g=g[部分]
G
定义
加载:(名称、要求、加载、配置)->
base=config.bundler?.url?'/基地'
需要[base],()->
如果你的名字?姓名
value=getGlobal(名称)
加载(值)
其他的
onload()
规范化:(名称,规范)->名称

也许应该有一种方法可以在没有
捆绑机的情况下实现这一点。。。我会把这个问题保留一段时间,以便提供更好的答案。

愚蠢的问题1)你提到
base.min
,但你的配置只使用
base
?2) 如果您没有使用data main,那么require.config是从哪里调用的?@explunit——我将其类型从base.min.js更改为base.js,请确保我的捆绑包正常。我找到了一个解决办法,我将在几分钟内与大家分享。@unit--啊!我忘了回答你的第二个问题。调用
require(['jquery',…
是用HTML硬编码的。这是因为我正在逐步翻译一个有几个基本插件的Django应用程序。因此,对于每个页面,可能需要几个JS,并且现在无法轻松提取单个
data main
。我正在回答这个问题。更多详细信息,请访问: