理解requirejs路径

时间:2012-06-05 09:47:42

标签: javascript jquery requirejs

使用requirejs我的main.js看起来像这样

requirejs.config({
    baseUrl: '/javascript/',
    paths: {
        jquery: 'http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min',
        async: 'requirePlugins/async',
            hbs: 'hbs'
    },
    waitSeconds: 7
});
define(['common'], function () {
    loadFonts();
});

main.js包含在脚本调用的页面中

<script data-main="/javascript/main.js" src="/javascript/require-2.0.1.js"></script>

Common是网站的基本功能,jquery doc ready函数等包含在define调用中:

define(['jquery'], function() {
    //jQuery dependant common code
});

这很好用,从谷歌CDN加载jQuery并执行代码。但是当我在加载main.js

之后添加一个require调用时
<script data-main="/javascript/main.js" src="/javascript/require-2.0.1.js"></script>
require(['jquery'], function ($) {
    //code
});

从/javascript/jquery.js请求jquery,而不是google cdn的已定义路径。我仍然是requirejs的新手,但在我看来,在任何其他请求被解雇之前应该定义路径,有人可以帮我理解我做错了吗?

6 个答案:

答案 0 :(得分:6)

我认为这可能是因为在RequireJS脚本标记上使用了data-main属性;要解析它,RequireJS本身必须加载和解析。在我的测试中(特别是对于IE9),在解析RequireJS配置文件(由data-main属性指定的文件)之前,浏览器将直接在RequireJS脚本标记之后下载并执行任何脚本标记。

为了解决这个问题,我只是使用data-main属性退出,而是将配置文件直接放在RequireJS脚本标记之后作为普通脚本标记,现在一切似乎都很开心。

具体来说,这就是它的样子(使用你的样本):

<script src="/javascript/require-2.0.1.js"></script>
<script src="/javascript/main.js"></script>

答案 1 :(得分:5)

也许你在加载require js之前放置了config语句。

你应首先加载require.js,然后输入你的配置代码,然后调用require(['jquery'],...);

它搜索/ javascript /的原因是因为你的require.js文件位于那里,它是默认的基本网址。

您的配置可能永远不会被require.js使用。

有关require config的信息,请参阅this tutorial

答案 2 :(得分:0)

您必须将define重命名为require

require(['common'], function () {
    loadFonts();
});

答案 3 :(得分:0)

我建议使用map代替paths来配置特定的模块位置。

paths更适用于简化/配置包含的快捷方式/前缀,而不是完整的模块路径。

请记住:您需要在*对象的星号(map)键下放置您想要全局应用的映射。

答案 4 :(得分:0)

原因是您在加载require.js模块后立即放置require(['jquery']...。结果,它会在读取配置设置之前尝试加载['jquery']

为什么它试图在/javascript/jquery.js中找到jquery?这是因为您的data-main属性。

  

RequireJS加载相对于baseUrl的所有代码。 baseUrl是   通常设置为与data-main中使用的脚本相同的目录   要为页面加载的顶级脚本的属性。

此链接阐明了require.js模块加载过程: http://requirejs.org/docs/api.html#jsfiles

答案 5 :(得分:-2)

我认为你可以在require块中嵌入完整的url。像:

require(['http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min'], function ($) {
   //code
});

顺便说一下,你的jquery链接无效。