为什么有同步和异步模块的规格?
我刚读完这篇关于Javascript模块的文章。 我可以理解CommonJS模块是同步加载的,而AMD模块是异步加载的。
我不明白的是,如果我使用CommonJS格式编写模块,我怎么才能使模块变得奇迹般地同步,或者如果我以AMD格式编写它,它如何变成奇迹般的异步。 我的意思是JavaScript没有define
或甚至require
关键字。 他们只是规格而不是库。
我的意思是模块加载的行为取决于模块加载器,而不是模块的结构。 如果是这种情况,为什么遵循不同类型模块的编码模式?
我是否认为NodeJS世界中的所有库都是同步加载的,无论它们以什么格式写入。 浏览器空间中的所有模块都是异步加载的。
如果我的上述假设是正确的,那为什么还有UMD的规格? 我的意思是如果一个脚本根据它存在的环境加载,那么为什么要为通用模块加载做一个规范?
有人能帮我解决这个问题吗?
这是一个很好的问题。 这是一个在Node社区引起很多热烈讨论的主题。 要充分了解它的全部内容,请阅读:
现在,回答你的问题 - 为什么有同步和异步模块的规格? 因为有些用例更喜欢模块的同步加载,比如Node.js中的服务器端模块,在开始提供服务请求之前要加载所需的所有内容,并且某些用例更喜欢异步加载模块,比如在浏览器中时在加载依赖关系时,不想阻止呈现线程。
在浏览器中实际上没有同步加载的选项,因为它会使浏览器无法响应。
你可能会争辩说,你可能会在服务器上使用异步加载,但是你必须通过require()
返回承诺而不是模块,否则它可能需要回调。 无论哪种方式,它都会使任何使用大量模块的复杂代码变得更加复杂。
另一个问题是已经加载的模块的缓存和突变。 使用同步模块加载时,只require
加载模块一次,并且在整个代码库(对于该进程)中的同一模块require
任何其他调用都会返回一个缓存响应,该响应每次都是相同的对象。 代码的任何部分都可以修改该对象,并可用于代码的任何其他部分。 一些使用该功能的使用案例要实施起来要复杂得多。 另外,加载和执行代码的顺序很难预测。
总结一下你的问题的答案,有两种加载模块的方法,而且这两种方法都不是每种情况都明确的赢家。 两者都是必需的,都有一些规范来标准化他们的行为。
阅读我链接的文章以获得更详细的理解。
我的意思是模块加载的行为取决于模块加载器,而不是模块的结构。 如果是这种情况,为什么遵循不同类型模块的编码模式?
模块是同步加载还是异步加载取决于模块加载器,但模块必须能够使用模块加载器,因此必须包含与加载器进行通信的接口。 您无法使用amd define
函数在node.js中加载模块。 你必须使用require
。
如果我的上述假设是正确的,那为什么还有UMD的规格? 我的意思是如果一个脚本根据它存在的环境加载,那么为什么要为通用模块加载做一个规范?
脚本不基于环境加载,它通过加载器接口加载。 UMD适用于人们在浏览器和服务器中使用的库。 库作者不必创建两个版本的库,一个用于浏览器,一个用于节点,因为UMD
知道如何处理这两个版本。