为什么有同步和异步模块的规格?

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

我不明白的是,如果我使用CommonJS格式编写模块,我怎么才能使模块变得奇迹般地同步,或者如果我以AMD格式编写它,它如何变成奇迹般的异步。 我的意思是JavaScript没有define或甚至require关键字。 他们只是规格而不是库。

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

我是否认为NodeJS世界中的所有库都是同步加载的,无论它们以什么格式写入。 浏览器空间中的所有模块都是异步加载的。

如果我的上述假设是正确的,那为什么还有UMD的规格? 我的意思是如果一个脚本根据它存在的环境加载,那么为什么要为通用模块加载做一个规范?

有人能帮我解决这个问题吗?


这是一个很好的问题。 这是一个在Node社区引起很多热烈讨论的主题。 要充分了解它的全部内容,请阅读:

  • Node.js,TC-39和来自iBM的James M Snell的模块
  • ES6模块互操作性 - Node.js增强建议
  • 保护.js - 由Dave Herman,Yehuda Katz和CaridyPatiño提出的关于Node.js模块的建议
  • 讨论节点-eps(002:ES6模块互操作)的请求请求#3
  • 现在,回答你的问题 - 为什么有同步和异步模块的规格? 因为有些用例更喜欢模块的同步加载,比如Node.js中的服务器端模块,在开始提供服务请求之前要加载所需的所有内容,并且某些用例更喜欢异步加载模块,比如在浏览器中时在加载依赖关系时,不想阻止呈现线程。

    在浏览器中实际上没有同步加载的选项,因为它会使浏览器无法响应。

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

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

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

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


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

    模块是同步加载还是异步加载取决于模块加载器,但模块必须能够使用模块加载器,因此必须包含与加载器进行通信的接口。 您无法使用amd define函数在node.js中加载模块。 你必须使用require

    如果我的上述假设是正确的,那为什么还有UMD的规格? 我的意思是如果一个脚本根据它存在的环境加载,那么为什么要为通用模块加载做一个规范?

    脚本不基于环境加载,它通过加载器接口加载。 UMD适用于人们在浏览器和服务器中使用的库。 库作者不必创建两个版本的库,一个用于浏览器,一个用于节点,因为UMD知道如何处理这两个版本。

    链接地址: http://www.djcxy.com/p/55393.html

    上一篇: Why is there a spec for sync and async modules?

    下一篇: Returning data from ajax results in strange object