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