我使用require.js加载一些JS库,并希望在加载前后运行一些常用代码。我创建了一个名为plug.js
的简单加载器插件来执行此操作:
define([], function () {
return {
load: function (name, req, onload, config) {
// Pre-load code...
req([name], function (value) {
// Post-load code...
onload(value);
});
}
};
});
当我从像这样的其他模块中使用它时,它按预期工作:
define(['plug!lib1'], function (lib1) {
// Use lib1
}
但是我想阻止库意外加载默认加载器,所以我尝试添加以下映射:
require.config({
// ...
map: {
'*': {
'lib1': 'plug!lib1'
}
},
// ...
}
然后我在我的模块中需要库而没有通过define(['lib1'], ...)
指定插件,并且插件的预加载代码按预期运行,但是后加载代码永远不会运行并且我得到加载超时错误。我还尝试将映射应用于特定模块而不是*
,但是得到了相同的错误。
我的加载程序插件代码有问题吗?是否有可能将默认加载器插件与模块相关联(全局插件也可以接受)?
作为替代方案,我看到使用预加载代码制作自定义模块并将其设置为shim配置中的依赖项,但这看起来比在任何地方指定插件名称更不方便。
答案 0 :(得分:0)
看起来require.js会尝试阻止循环依赖。 app
模块请求lib1
,再解析为plug!lib1
,plug
请求lib1
,其中require.js拒绝加载,尽管这次会是{直接加载而不是plug
将被递归调用。
我重命名原始库,问题消失了:
require.config({
// ...
paths: {
'lib1-core': 'lib1'
},
map: {
'*': {
'lib1': 'plug!lib1-core'
}
},
// ...
});