4
为了让我的库更具可移植性,我一直在阅读AMD和CommonJS。我首先注意到的一件事就是他们使用目录结构的方式,并且旨在为每个文件创建一个模块。从我可以告诉他们的'命名空间'与目录树一致。然而,我自己的代码使用全局对象作为命名空间,然后在我的各种文件中,无论目录如何,我都向这个对象添加类。如何在JavaScript中使用名称空间对象以及AMD?
(function (Twifty) {
// Add objects to the Twifty namespace
return Twifty;
}(Twifty || {}));
在升级过程中,我试图支持AMD和CommonJs。有很多关于如何做到这一点的文章,但我无法围绕AMD define函数打包。这里是我正在转变上面的代码:
(function (root, factory) {
// Define the namespace if it doesn't exist
var Twifty = root.Twifty || {};
'use strict';
if (typeof define === 'function' && define.amd) {
// AMD is used - Register as an anonymous module.
define([], factory);
} else if (typeof exports === 'object') {
// CommonJS is used - Twifty is a namespace and doesn't need to be required
factory(Twifty);
} else {
// Neither AMD nor CommonJS used. Use global variables.
if (!document) {
throw 'twifty-map requires a DOM object';
}
root.Twifty = factory(Twifty);
}
}(this, function(Twifty) {
// Add objects to the Twifty namespace
return Twifty;
}));
的问题是与AMD define
。工厂需要一个Twifty
对象,但由于它不是一个模块,我不能将它作为依赖项添加。我该如何处理?
移除名称空间并不是真的有用,因为这会破坏依赖它的任何代码。
对不起,如果这是一个微不足道的问题。
当你的库被加载为AMD模块时,是否有任何原因'root.Twifty'应该存在?看到,使用AMD的原因之一就是防止在全球范围内拥有一切。由于歇斯底里的原因,一些被设计为加载为AMD库的旧库默认情况下泄漏到全局空间中(例如jQuery)。通常这是因为有第三方扩展(例如jQuery插件),否则无法工作,因为扩展创建时,扩展的库不支持AMD。对于新图书馆,你真的**应该避免泄漏到全球空间。 – Louis
@路易这是有道理的。从我所了解的情况来看,这个对象被传递而不是被附加。但是,我仍然回到创建'Twifty'对象的相同问题。代码应该支持AMD,但不会被卡住。 IE,如果使用标准的'