requirejs returns undefined 没有依赖
requirejs returns undefined without dependency
在某些情况下,requirejs
returns 一个未定义的对象到我的模块。我看过很多帖子,大部分答案都与循环依赖有关。但是我可以找到 none (我已经检查过几次)。对于粘贴我已尝试减少到最低限度的代码数量,我深表歉意:)任何帮助将不胜感激!
这是失败的模块 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
的东西。我一直特别小心,其中 none 定义了 app.js
,这应该足以保证没有循环依赖会导致此错误。有什么线索吗??
以下是我的解决方法:我将 main.js
更改为
require(['config'], function() {
require( ['init_app'], function () {
require( ['app'], function () {
App.start({});
});
});
});
并将 App
放在 init_app
的全局范围内。这很好用,但不能解释之前的失败。
您应该检查您的 shim
配置以删除您为实际使用 define
的模块放入的所有垫片。例如,jQuery 使用 define
因此不需要垫片。 Marionette也是如此。我刚刚用 Bower 安装了它,并在文件开头找到了它:
if (typeof define === 'function' && define.amd) {
define(['backbone', 'underscore'], function(Backbone, _) {
return (root.Marionette = root.Mn = factory(root, Backbone, _));
});
}
...
如果您在使用的模块中看到类似这样的内容,或者对 define
的直接调用,那么您不应该为它使用 shim。
我没有检查你使用的每一个模块。请检查所有这些以确保您没有在不需要的地方使用垫片。如果您不正确地使用垫片,您可以获得模块的 undefined
个值。
在某些情况下,requirejs
returns 一个未定义的对象到我的模块。我看过很多帖子,大部分答案都与循环依赖有关。但是我可以找到 none (我已经检查过几次)。对于粘贴我已尝试减少到最低限度的代码数量,我深表歉意:)任何帮助将不胜感激!
这是失败的模块 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
的东西。我一直特别小心,其中 none 定义了 app.js
,这应该足以保证没有循环依赖会导致此错误。有什么线索吗??
以下是我的解决方法:我将 main.js
更改为
require(['config'], function() {
require( ['init_app'], function () {
require( ['app'], function () {
App.start({});
});
});
});
并将 App
放在 init_app
的全局范围内。这很好用,但不能解释之前的失败。
您应该检查您的 shim
配置以删除您为实际使用 define
的模块放入的所有垫片。例如,jQuery 使用 define
因此不需要垫片。 Marionette也是如此。我刚刚用 Bower 安装了它,并在文件开头找到了它:
if (typeof define === 'function' && define.amd) {
define(['backbone', 'underscore'], function(Backbone, _) {
return (root.Marionette = root.Mn = factory(root, Backbone, _));
});
}
...
如果您在使用的模块中看到类似这样的内容,或者对 define
的直接调用,那么您不应该为它使用 shim。
我没有检查你使用的每一个模块。请检查所有这些以确保您没有在不需要的地方使用垫片。如果您不正确地使用垫片,您可以获得模块的 undefined
个值。