javascript 什么是通用模块定义(UMD)?

drkbr07n  于 12个月前  发布在  Java
关注(0)|答案(1)|浏览(94)

我已经找到了(?)github repository for UMD,它带有以下描述(强调我的):
UMD(通用模块定义)模式适用于JavaScript模块**,可在任何地方工作**。
...
此存储库形式化了JavaScript模块的通用模块定义(UMD)API的设计和实现。这些是模块,能够在任何地方工作,无论是在客户端,服务器还是其他地方。
到目前为止,这是直截了当的。至少我觉得是Node.JS默认使用CommonJS。浏览器默认使用全局变量。我认为这是说UMD的工作原理与你的模块系统无关;您可以一次构建项目,而不是每个模块系统一次。
但接下来的一切让我困惑:
UMD模式通常试图提供与当今最流行的脚本加载器的兼容性(例如JavaScript等)。
这不是与前一段矛盾吗?UMD你是在任何地方工作,还是只在最受欢迎的环境中工作?
它接着列出了至少九种可供选择的“变体”。为什么会有 * 任何 * 变化,如果这意味着是 * 普遍 *?我如何确定哪一个适合我的情况?
自述文件写得好像我已经知道这些问题的答案,但我试图了解UMD是什么以及何时使用它。
注意:This similar question询问的是其他模块系统,而不是UMD。

8yoxcaq7

8yoxcaq71#

该存储库旨在正式化 * 通用模块 * 的 * 定义 *。它没有提供一个“普遍的定义”。这个标准是在当时编写的,因为每个人都以不同的方式定义他们的通用模块-有一些通用的方法,对不同的环境有不同的支持,但没有真正建立起来。
正如您已经引用的那样,通用模块可以在多种环境中工作。在通用模块之前,库将为不同的环境分发单独的文件,例如。library.amd.jslibrary.common.jslibrary.global.js。这对维护人员来说是一个很大的麻烦,因为它需要使用构建工具(JavaScript通常不需要)和额外的文档。因此,我们的目标是定义一个通用模块,一个单一的文件,这是作者编写和分发以及用户(下载)加载所需的全部内容。请注意,这是在包管理器和存储库通用之前(或者:当它们开始变得更流行时,你必须把你的库变成一个模块来支持它们)。
然而,仍然存在差异。为web浏览器编写的模块不需要考虑支持commonjs格式,因为它们在nodejs中不起作用。没有依赖关系的模块不需要支持require的UMD模式。不使用循环依赖的模块不需要支持可变exports对象的模式。您可以在记录UMD repository中模式的注解中找到这些差异的解释及其权衡。一个图书馆的作者可以去那里,通读它们,然后选择正确的一个。
当然,这一切都是历史。今天,构建工具无处不在。您可以将代码编写为现代ES模块,并让您的编译器解决其余的问题。对于库作者,你可以将你的包作为一个esm文件包分发。
然而,对于前端库,您仍然提供了一个方便的文件,用户可以下载(从CDN)并直接嵌入到他们的网页中。这仍然通常采用UMD模式,只是不再由库作者编写/复制到源代码中,而是由编译器/编译器自动添加。
类似地,对于应该在node.js中工作的后端/通用库,您仍然通过npm分发commonjs模块构建,以支持所有仍然使用旧版本node.js的用户(并且不希望/需要自己使用转译器)。这对于新的库来说现在已经不太常见了,但是现有的库会努力保持向后兼容,而不会导致应用程序崩溃。

相关问题