在某些情况下,requirejs
会将未定义的对象返回给我的模块。我查看了很多帖子,大部分答案都与循环依赖关系有关。但是我找不到(我已经多次检查过)。我为提交一些我试图减少到最低限度的代码而道歉。我们非常感谢任何帮助!
以下是失败的模块init_app.js
:
define([
'marionette',
], function(
Marionette
) {
"use strict";
var App;
App = new Marionette.Application();
App.addRegions({ body: "#main_body" });
return App;
});
有时Marionette
模块未定义。以下是config.js
可能相关的部分:
define([], function() {
'use strict';
require.config({
baseUrl: 'js',
paths : {
underscore : 'vendors/underscore/underscore',
jquery : 'vendors/jquery/dist/jquery',
backbone : 'vendors/backbone/backbone',
marionette : 'vendors/marionette/lib/backbone.marionette',
wreqr : 'vendors/backbone.wreqr/lib/backbone.wreqr',
eventbinder : 'vendors/backbone.eventbinder/lib/backbone.eventbinder',
babysitter : 'vendors/backbone.babysitter/lib/backbone.babysitter',
},
shim : {
jquery : {
exports : 'jQuery'
},
underscore : {
exports : '_'
},
backbone : {
deps : ['jquery', 'underscore'],
exports : 'Backbone'
},
wreqr: {
deps : ['backbone'],
exports: 'Backbone.Wreqr'
},
eventbinder : {
deps : ['backbone']
},
babysitter : {
deps: ['backbone']
},
marionette : {
deps: ['backbone', 'wreqr', 'eventbinder', 'babysitter'],
exports : 'Marionette'
},
}
});
});
main.js
文件是
require(['config'], function() {
require( ['app'], function (App) {
App.start({});
});
});
app.js
文件
define([
'init_app',
'router',
], function(
App,
Router
) {
"use strict";
App.on('start', function() {
new Router();
Backbone.history.start();
});
return App;
});
路由器将定义一些可能依赖于init_app.js
的东西。我特别小心,他们都没有定义app.js
,这应该足以保证没有循环依赖可能导致这个错误。任何线索??
答案 0 :(得分:1)
以下是我解决问题的方法:我将main.js
更改为
require(['config'], function() {
require( ['init_app'], function () {
require( ['app'], function () {
App.start({});
});
});
});
并将App
放在init_app
的全局范围内。这很有效,但没有解释以前的失败。
答案 1 :(得分:1)
您应该检查一下shim
配置,以删除您为实际使用define
的模块添加的所有填充程序。例如,jQuery使用define
,因此不需要垫片。木偶也是如此。我刚刚在Bower上安装了它,并在文件的开头找到了它:
if (typeof define === 'function' && define.amd) {
define(['backbone', 'underscore'], function(Backbone, _) {
return (root.Marionette = root.Mn = factory(root, Backbone, _));
});
}
...
如果您在使用的模块中看到类似的内容,或者对define
进行平铺调用,则不应使用垫片。
我没有检查您使用的每个模块。请检查所有这些以确保您不在不需要的地方使用垫片。如果您使用垫片不正确,则可以获得模块的undefined
值。