当我使用requirejs和backbonejs进行开发时,我对导入机制的工作方式感到困惑,因为我认为导入的类只适用于该功能范围。然而,当我尝试调试时,发现了一些requirejs类,我没有导入jquery或骨干或下划线,它仍然能够正常工作,但这不适用于我创建的其他类。RequireJS - 我是否需要重新导入以前需要的子类文件
下面的例子说明了我的意思:
1)的index.html - >初始加载文件
2)init.js - >导入所有所需的类和输出是否类可用
3)base.js - >基类,导入所需的所有库
4)shop.js - >从基类扩展,没有不进口jquery的,骨干的文件,但它是工作
个的index.html
<html>
<head>
<title>Testing</title>
<script data-main='init' src='http://requirejs.org/docs/release/2.0.4/minified/require.js'></script>
</head>
<body>
halo world
</body>
</html>
init.js
require.config({
paths: {
jquery: 'http://code.jquery.com/jquery-1.7.2.min',
underscore: 'http://underscorejs.org/underscore-min',
backbone: 'http://backbonejs.org/backbone-min'
},
shim: {
backbone: {
deps: ["underscore", "jquery"],
exports: "Backbone"
},
underscore: {
exports: "_"
}
}
});
require([
'views/shop',
],function(ShopView){
var shopView = new ShopView();
shopView.render();
console.log('Backbone - ');
console.log(Backbone);
console.log('Underscore - ');
console.log(_);
console.log('jQuery - ');
console.log($);
console.log('BaseView - ');
console.log(BaseView);
});
shop.js
define([
'views/base'
], function(BaseView) {
var ShopView = BaseView.extend({
initialize:function(){
console.log('ShopView');
}
});
return ShopView;
});
base.js
define([
'jquery',
'underscore',
'backbone'
], function($,_,Backbone) {
var BaseView = Backbone.View.extend({
initialize:function(){
console.log('BaseView');
}
});
return BaseView;
});
从init.js结果输出的:
console.log(Backbone); - >返回我骨干班,即使我没有输入它
console.log($); - >返回我的jquery类,即使我没有导入它
console.log(_); - >返回我下划线类,即使我没有导入它
console.log(BaseView); - >我的自定义类返回undefined
如果我从init.js中删除视图/商店。
require([
],function(){
console.log('Backbone - ');
console.log(Backbone);
console.log('Underscore - ');
console.log(_);
console.log('jQuery - ');
console.log($);
console.log('BaseView - ');
console.log(BaseView);
});
console.log(Backbone); - >未定义
console.log($); - > break
console.log(_); - > break
console.log(BaseView); - > break
我无法解释以前的场景是如何工作的,我认为backbone,jquery,下划线是全局变量,但是我似乎删除了视图类,然后变量未定义,而如果它是导入类,我可以将我之前从base.js导入的类引入未来的导入类。对不起,如果它困惑。
有人可以了解requirejs中的导入工作方式和导入范围。我是否需要重新要求我以前需要的课程。
感谢,但为什么jQuery的,骨干,并强调是可访问的,即使没有将其导入。 – TonyTakeshi 2012-07-11 03:49:24
不客气。即使你不使用'require'这个词,你实际上在'define'中声明了依赖关系数组时也会导入它们。 我认为这就是让你困惑的原因。这个'定义'也可以导入东西。如果不清楚,请告诉我。 – corbacho 2012-07-11 07:15:01