2012-07-10 37 views
3

当我使用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中的导入工作方式和导入范围。我是否需要重新要求我以前需要的课程。

回答

0

require.config它不会自行导入任何东西。 它用于声明别名(路径)和非AMD文件的依赖关系。

考虑到当你使用'define'时,你实际上是需要它的依赖关系。

define ([ array of dependencies ], function) 

init: require shop (ok, let's bring shop here: 
shop: require base (ok, let's bring base here: 
base: require (so you need backbone, underscore and jquery.. ok, 
        I'll bring them for you) 

然后,当需要和加载的每个相关性,则执行init开始。

当您从init.js,删除shop您不需要任何东西。再次require.config不会导入任何内容。

PS。这是个人的喜好,但 我更喜欢有一个文件app.js,其中jquery,下划线和主干是必需的。然后每个模块都需要“应用程序”。如果您想添加功能,共享该名称空间也很有用。 (app.myFunction

看到这个骨干poilerplate:https://github.com/tbranyen/backbone-boilerplate

+0

感谢,但为什么jQuery的,骨干,并强调是可访问的,即使没有将其导入。 – TonyTakeshi 2012-07-11 03:49:24

+0

不客气。即使你不使用'require'这个词,你实际上在'define'中声明了依赖关系数组时也会导入它们。 我认为这就是让你困惑的原因。这个'定义'也可以导入东西。如果不清楚,请告诉我。 – corbacho 2012-07-11 07:15:01