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

时间:2019-04-01 11:32:58

标签: javascript

在创建新的基于浏览器的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脚本错误的库,则只有在{ {1}}个模块加载。
  • 对复杂的API进行存根将导致大量内联代码。如果您的库/模块具有返回对象的方法以及具有返回对象的方法等,则所有这些执行路径都必须被存根,导致复杂的存根逻辑,并且在行内/全局中插入了许多JS。使用异步JS库的主要原因是为了减少页面加载时间,并且大量的存根代码将使该好处无效。

除了两种出售JavaScript API的技术之外,还有其他选择吗?

(请注意,要求使用对ES5具有向后兼容性的vanilla.js,因此没有异步功能。)

0 个答案:

没有答案