优化app.js后需要模块

时间:2014-02-28 12:42:04

标签: node.js requirejs r.js

我正在使用require.js并使用节点模块r.js对其进行优化。 它有效,但在我包含require.js之后尝试要求模块时遇到一个问题。

这就是我需要的:

<script data-main="/js/app-built" src="/js/vendor/require.min.js"></script>
<script type="text/javascript">
require(['Functions'], function(Functions){
    console.log(Functions);
});
</script>

这不起作用,因为它找不到Functions模块。 但这有效:

<script data-main="/js/app-built" src="/js/vendor/require.min.js"></script>
<script type="text/javascript">
require(['app-built'], function(){
    require(['Functions'], function(Functions){
        console.log(Functions);
    });
});
</script>

有没有办法实现第一种方法?

1 个答案:

答案 0 :(得分:1)

在您的第一个代码段中,问题是,当第一个require调用执行时,很可能(很可能实际上)RequireJS尚未加载您的应用程序。 data-main属性会立即启动主模块的加载,但只有立即启动。加载仍然是异步的。它在你的第二个片段中工作的原因是外部require强制内部require在加载主模块后执行

因此,要使require调用成功,RequireJS必须有足够的信息才能加载它。所以它必须已经具有允许它找到你的模块的配置。这可以在加载RequireJS之前添加一些配置。您可以将require设置为一个配置对象,该对象在加载时将被RequireJS选中:

<script type="text/javascript">
require = {
    // Enough config to find the main module.
    baseUrl: ...,
    paths: ...,
    bundles: {
        // List here every module you want to load individually. 
        "app-built": ["Functions"]
    }
};
</script>
<script src="/js/vendor/require.min.js"></script>
<script type="text/javascript">
require(['app-built']);
require(['Functions'], function(Functions){
    console.log(Functions);
});
</script>

您不必将整个配置从主模块中拉出来,因为RequireJS可以组合配置,但是需要有足够的空间来允许RequireJS开始加载。 app-built模块可能包含初始步骤不需要的其他配置。在上面的代码中,我删除了data-main并使用了require(['app-built']),因为即使使用data-main参数,我也不确定是否仍然可以使用bundles。 (我担心它可能会混淆RequireJS。)使用bundles将允许RequireJS知道当您需要Functions时,它必须在app-built中找到它。

除了可能仍然可以使用data-main而不是初始require调用(我不确定你可以做),我认为不可能进一步简化这一点。