2013-02-25 108 views
3

我有以下main.jsRequireJS忽略了一些路径

requirejs.config({ 
    paths: { 
     'backbone': 'backbone-min', 
     'underscore': 'underscore-min', 
     'loader': 'loader-min' 
    } 
}) 

这种 '架min.js' 文件只是一个优化从loader.js JS:

define(['backbone', 'underscore'], function() { 
}) 

我的HTML页面包含以下:

<script data-main="/js/main" src="/js/require.js"></script> 
<script type="text/javascript"> 
    requirejs(['loader'], function(loader) { 
     .... 
    }) 
</script> 

顺便说一句,正如我从Fire看到的错误控制台,只有以下网址浏览器负载:

GET /js/require.js 
GET /js/main.js 
GET /js/loader.js !!! Notice it's loader.js, not loader-min.js 
GET /js/backbone-min.js 
GET /js/underscore-min.js 

所以,这个问题对于模块loader它会尝试加载文件loader.js,而不是路径在main.js配置。未缩小/优化文件,忽略requirejs.config值。

最奇怪的是,它仍然使用正确的值为backboneunderscore。大多数情况下,但不是全部时间。有时它在加载时失败/js/backbone.js

似乎RequireJS在main.js被完全加载并由浏览器解释之前开始工作。它预期的行为?或我的应用程序有问题?

如何确保requirejs(...)函数仅在处理完'main.js'后执行?

回答

5

您的main.js文件是异步加载的。然而,这个脚本标签(下面)是连续分析的。所以没有办法预测执行顺序(尽管下面的脚本很可能在异步调用返回之前执行)。

<script type="text/javascript"> 
    // require() and not requirejs() 
    require(['loader'], function(loader) { 
     .... 
    }) 
</script> 

你main.js的末尾添加需要调用的文件是这样的:在执行任何要求或定义调用之前

require.config({ 
// configuration. 
}); 

require(['loader'], function(loader) { 
// callback 
}) 

这样RequireJS总是“配置”。

编辑: 我做什么通常是:

<script src="/js/require.js"></script> <!-- No data-main attribute --> 
<script src="/js/config.js"></script> <!-- Explicitly load configuration --> 

<script type="text/javascript"> 
    require.config({ 
     baseURL: "path/to/base" 
    }); 
    require(["module"], function(module){ 
     // code 
    }); 
</script> 

这样,我在什么加载其中明确控制。它也保持我的config.js文件干燥。

我通常在我的引导程序HTML中设置baseURL,因为这样我可以对我的Jasmine测试套件使用相同的配置文件。

+1

如果我有其他模块,uniq每页和用户类型,不仅'loader.js'。这是否意味着无法继续将它们作为单独的脚本使用,我应该将它们全部放入一个巨大的main.js中? – 2013-02-25 11:27:58

+0

我的意思是,requirejs的主要目标是使它可以使用小模块并只加载所需的代码 – 2013-02-25 11:28:58

+0

我编辑了我的答案以回答上述两个问题。希望这可以解决问题。 – 2013-02-25 11:44:16