出售异步JavaScript库:模块与存根

出售异步JavaScript库:模块与存根,javascript,Javascript,在创建新的基于浏览器的JavaScript库时,开发人员通常会选择以下技术之一来解决异步脚本加载问题和加载JS库的一般不确定方式: 通过模块依赖系统(如RequireJS、AMD、CommonJS等)出售库 创建一个库“存根”,它可以内联插入并记录对所述存根的方法调用,然后在库从异步脚本完全加载时重播它们 举一个具体的例子,假设我们有一个库a,其中包含一个方法x,我们希望将其出售给外部用户 如果我们使用模块,最终用户会写: waitForLibrary("A").then((A) =>

在创建新的基于浏览器的JavaScript库时,开发人员通常会选择以下技术之一来解决异步脚本加载问题和加载JS库的一般不确定方式:

  • 通过模块依赖系统(如RequireJS、AMD、CommonJS等)出售库
  • 创建一个库“存根”,它可以内联插入并记录对所述存根的方法调用,然后在库从异步脚本完全加载时重播它们
举一个具体的例子,假设我们有一个库
a
,其中包含一个方法
x
,我们希望将其出售给外部用户

如果我们使用模块,最终用户会写:

waitForLibrary("A").then((A) => A.x());
通过存根:

/* Stub module inline/globally */
let A = mockModule({x: recordMethodCalls();});
...
/* Users call x() method normally */
A.x();
...
/* When the full library loads, existing method calls are replayed */
A.x.replay(() => /* Actually do stuff */
然而,每种方法都有其缺点,即:

  • 您不能在加载模块之前调用该模块。例如,如果
    a
    是用于记录Java脚本错误的库,则只有在
    a
    模块加载之后,您才能记录所述错误
  • 存根一个复杂的API将导致大量的内联代码。如果您的库/模块具有返回对象的方法,以及返回对象的方法等,那么所有这些执行路径都必须存根,从而导致复杂的存根逻辑和大量的内联/全局插入的JS。使用异步JS库的主要原因是为了减少页面加载时间,大量的存根代码将抵消这一好处
除了这两种技术之外,还有其他方法可以出售JavaScript API吗

(需要注意的是,要求使用vanilla.js与ES5向后兼容,因此没有异步函数)