出售异步JavaScript库:模块与存根
在创建新的基于浏览器的JavaScript库时,开发人员通常会选择以下技术之一来解决异步脚本加载问题和加载JS库的一般不确定方式:出售异步JavaScript库:模块与存根,javascript,Javascript,在创建新的基于浏览器的JavaScript库时,开发人员通常会选择以下技术之一来解决异步脚本加载问题和加载JS库的一般不确定方式: 通过模块依赖系统(如RequireJS、AMD、CommonJS等)出售库 创建一个库“存根”,它可以内联插入并记录对所述存根的方法调用,然后在库从异步脚本完全加载时重播它们 举一个具体的例子,假设我们有一个库a,其中包含一个方法x,我们希望将其出售给外部用户 如果我们使用模块,最终用户会写: waitForLibrary("A").then((A) =>
- 通过模块依赖系统(如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 */
然而,每种方法都有其缺点,即:
- 您不能在加载模块之前调用该模块。例如,如果
是用于记录Java脚本错误的库,则只有在a
模块加载之后,您才能记录所述错误a
- 存根一个复杂的API将导致大量的内联代码。如果您的库/模块具有返回对象的方法,以及返回对象的方法等,那么所有这些执行路径都必须存根,从而导致复杂的存根逻辑和大量的内联/全局插入的JS。使用异步JS库的主要原因是为了减少页面加载时间,大量的存根代码将抵消这一好处