我正在使用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>
有没有办法实现第一种方法?
答案 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
调用(我不确定你可以做),我认为不可能进一步简化这一点。