为什么Underscore.js移除了对AMD的支持?

65
1.3.0 - 2012年1月11日,从Underscore中删除了AMD(RequireJS)支持。如果您想要将Underscore与RequireJS一起使用,可以像普通脚本一样加载它,包装或修补您的副本,或下载一个分叉版本。他们为什么这样做呢?有人知道吗?因为他们只在几个月前(10月份)添加了它,而AMD(异步模块定义)据说要比CommonJS模块优越得多。更新:截至2013年12月,此功能已被重新支持。

2
希望你能提供一个链接,指向一篇文章、邮件讨论或者推特评论,以解释这个行为的动机或开发者的澄清。 - c69
1
使用 Asynchronous Module Definition 而不是 Advanced module loader,请参见 https://github.com/amdjs/amdjs-api/wiki/AMD。 - Jacob Oscarson
1
到目前为止,AMD最突出的声音被认为远远优于CommonJS /等的创造者require.js本人。我不太倾向于盲目接受特定方法的创造者的意见,而是更愿意听取一群人的意见,因此,评审团仍未作出裁决。 - Jess Jacobs
4个回答

56

Jeremy 在提交的 评论中说明了他的理由

没错。不支持任何特定的脚本加载器将使所有的脚本加载器都能正常工作。

我很抱歉在一开始时合并了这个支持。

他还在 推特上发推文,进一步解释了这个改变(链接来源于 一个后来的评论):

…因为 AMD 支持会破坏在同一页上也使用 Require.js 的常规 Underscore 嵌入...


2
@SalmanPK 这个改变意味着下划线现在不受加载器约束。因此,你可以根据需要为任何加载器进行设置。这有什么不好的呢? - Jonathan Lonowski
3
因为现在我们不能在任何 AMD 兼容的加载器(RequireJS、Almond.js、curl.js、lsjs、bdLoad、Yabble 等)中使用它,除非进行额外的配置或手动编辑。 - salmatron
5
@SalmanPK 使用专门用于 AMD 的 Underscore 叉子,然后转到:https://github.com/amdjs/underscore。 - Jonathan Lonowski
7
请注意:正如问题中现在提到的那样,自2013年12月起Underscore再次符合AMD标准。 - Brad Parks
@BradParks 感谢您的澄清。 - Juan Carlos Coto

29
Underscore的开发者认为支持AMD会破坏非AMD脚本的支持。实际上并非如此,因为您可以拥有既启用AMD又可在非AMD部署中按原样工作的脚本。
现在有一个可替换Underscore的工具:Lo-Dash。它除了不在Underscore中的其他功能外,还包括AMD/非AMD双重性。

17
我认为这个答案被低估了。不过,我觉得这个答案的语气(无论是否故意)对下划线开发者有些傲慢,我认为这是不合适的。 - Brian M. Hunt
Lodash听起来很酷,但我不明白这如何回答问题。 - Zach Lysobey
我同意你们两个的观点 - 这并没有真正回答“为什么”的问题。相反,它很快地给出了一个替代方案。因此,我会稍微编辑一下这个答案。 - Angelos Pikoulas

10

1

ES5-shim 提供了许多与 underscore 和 lodash 相同的功能(例如 array.forEach()、array.map() 等)。

ES5-shim 原生支持 AMD,不像 underscore 和 lodash 那样添加浏览器已经提供的东西的额外副本。相反,它将原生 ES5 功能添加到旧版浏览器中。

当 IE8 和其他旧版浏览器消失时,您可以简单地删除 ES5-shim 依赖项,而无需像使用 lodash 或 underscore 一样移植代码。


2
问题不是关于underscore库的功能,而是关于做出这种(有争议/不透明)架构选择的原因。 - c69
@c69 已经理解,但 lodash 的答案也没有涵盖从 underscore 中删除 AMD 的原因。由于该答案受到高度审核,我认为指出使用 ES5 本身/ES5 shim 作为旧浏览器的更加未来安全的替代方案更好。 - mikemaccana

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接