gpt4 book ai didi

javascript - 如何处理有条件要求的 AMD 模块?

转载 作者:行者123 更新时间:2023-11-29 10:48:43 26 4
gpt4 key购买 nike

假设我有一个 AMD 模块,在某些环境中有条件地需要第二个模块:

define(["require"], function(require) {  var myObj = {     foo: console.error.bind(console)   };  if(browserEnv)    require(["./conditional-polyfill"],function(polyfill){      myObj.foo = console.log.bind(console,polyfill) ;    });  return myObj; //returns before conditional require is satisfied});

问题是:如何在条件要求完成后延迟 define() 调用以返回/回调?

即下面的代码失败了:

require(["module-from-above"],function(logger){  logger.foo("Hello!"); //console.error gets called});

我对解决这个问题的想法:

  • 如果我内联 ./polyfill,一切都会正常。然而,这只是规避了问题,并不适用于所有情况。我希望它模块化是有原因的。
  • 我可以返回 Deferred对象而不是 myObj 稍后由 ./conditional-polyfill 实现。这会起作用,但是一直调用 loggerDeferred.then(function(logger){ ... }); 真的很难看。
  • 我可以为这个模块制作一个 AMD 加载器插件。一切准备就绪后立即调用回调。同样,这可行,但我的构建工具无法使用自己的加载程序插件。

我能想到的所有解决方案都是黑客而不是好的代码。但是,我认为我的问题并不太牵强。那么,如何处理呢?

最佳答案

将条件推送到“工厂函数”(AMD 社区中常用的名称,指的是要求和定义的回调函数)之外

;(function() {

function factory(require, polyfill){
var myObj = {
foo: console.error.bind(console)
}
if(polyfill){
myObj.foo = console.log.bind(console, polyfill)
}
return myObj
}

var need = ['require']

if(browserEnv){
need.push("./conditional-polyfill")
}

define(need, factory)

})();

关于javascript - 如何处理有条件要求的 AMD 模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14341078/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com