javascript - 为什么有同步和异步模块的规范?

ng.*_*bie 3 javascript asynchronous node.js

我刚刚读完这篇关于 Javascript 模块的文章。我可以理解CommonJS模块是同步加载的,而AMD模块是异步加载的。

我不明白的是,如果我以 CommonJS 格式编写它,模块如何变得神奇地同步,或者如果我以AMD 格式编写它,它如何变得神奇地异步。我的意思是 javascript 甚至没有defineorrequire关键字。它们只是规范而不是库。

我的意思是模块加载的行为取决于模块加载器,而不是模块的结构。如果是这样的话,为什么要遵循不同类型模块的编码模式呢?

我是否正确地假设 NodeJS 世界中的所有库都是同步加载的,无论它们以什么格式编写。并且浏览器空间中的所有模块都是异步加载的。

如果我的上述假设是正确的,那么为什么还有 UMD 规范?我的意思是,如果脚本根据其所在的环境进行加载,那么为什么要制定通用模块加载规范呢?

有人可以帮我解决这个困惑吗?

rsp*_*rsp 6

这是一个很好的问题。这个话题在 Node 社区引起了热烈的讨论。为了更好地理解它的全部内容,您应该阅读:

\n\n\n\n

现在,回答您的问题 - 为什么有同步和异步模块的规范?因为有些用例更喜欢同步加载模块,例如 Node.js 中的服务器端模块,您希望在开始服务请求之前加载所需的所有内容,而有些用例更喜欢异步加载模块,例如在浏览器中不加载模块时加载依赖项时不想阻塞渲染线程。

\n\n

浏览器中确实没有同步加载的选项,因为这会使浏览器不响应。

\n\n

您可能会争辩说您可能在服务器上使用异步加载,但是您要么必须返回承诺而不是模块,要么require()它可能需要回调。无论哪种方式,它都会使任何使用大量模块的复杂代码变得更加复杂。

\n\n

另一个问题是已加载模块的缓存和突变。使用同步模块加载,require您只需加载模块一次,require整个代码库(对于该进程)中对同一模块的任何其他调用都会返回缓存的响应,该响应每次都是同一个对象。代码的任何部分都可以修改该对象,并且该对象可供代码的任何其他部分使用。一些使用该功能的用例实现起来要复杂得多。此外,加载和执行代码的顺序将更难以预测。

\n\n

总结一下你的问题的答案,两种加载模块的方法都有争议,而且这两种方法都不是每种情况下的明显赢家。两者都是必需的,并且都有一些规范来标准化其行为。

\n\n

阅读我链接的文章以获得更详细的了解。

\n