UMD:分配给 module.exports 是多余的吗?
UMD: is assigning to module.exports redundant?
我看到 JS 库使用这两种不同的实现。唯一的区别是 CommonJS 行。
它们在功能上是否相同?是否不需要将值分配给 module.exports?
/* 1: Assignment to module.exports */
(function(factory) {
if (typeof define === 'function' && define.amd) {
// AMD
define(['jquery'], factory);
} else if (typeof module === 'object' && module.exports) {
// CommonJS
module.exports = factory(require('jquery'));
} else {
// Browser globals
factory(jQuery);
}
}(function($) {
$.fn.jqueryPlugin = function () { return true; };
}));
/* 2: Doesn't assign to module.exports */
(function(factory) {
if (typeof define === 'function' && define.amd) {
// AMD
define(['jquery'], factory);
} else if (typeof module === 'object' && module.exports) {
// CommonJS
factory(require('jquery'));
} else {
// Browser globals
factory(jQuery);
}
}(function($) {
$.fn.jqueryPlugin = function () { return true; };
}));
tl;dr 没关系,但通常建议包含 module.exports = ...
。
更长的解释
我相信您显示的代码中的 "better" 版本确实设置了 module.exports
:
module.exports = factory(require('jquery'));
然而,它没有。通常,您使用 jQuery-plugin 的方式是通过全局 $
/jQuery
变量,在这种情况下不需要 module.exports = ...
。使 jQuery-插件工作的行是:
$.fn.jqueryPlugin = function () { return true; };
但是 – 原则上 – 您可以像这样使用插件,直接调用它而无需通过 jQuery:
myjQueryPlugin = require('myjQueryPlugin');
var $myElement = $('#my-element');
myjQueryPlugin.apply($myElement, {});
在这种情况下,您需要设置 module.exports
。请注意,这看起来确实有点奇怪,所以一般来说大多数人不会像这样使用你的插件。
通过设置 module.exports
,您可以同时支持这两种用例,而不会丢失任何东西。
另请参阅:http://blog.npmjs.org/post/112712169830/making-your-jquery-plugin-work-better-with-npm(将插件导出为模块(可选)部分)
我看到 JS 库使用这两种不同的实现。唯一的区别是 CommonJS 行。
它们在功能上是否相同?是否不需要将值分配给 module.exports?
/* 1: Assignment to module.exports */
(function(factory) {
if (typeof define === 'function' && define.amd) {
// AMD
define(['jquery'], factory);
} else if (typeof module === 'object' && module.exports) {
// CommonJS
module.exports = factory(require('jquery'));
} else {
// Browser globals
factory(jQuery);
}
}(function($) {
$.fn.jqueryPlugin = function () { return true; };
}));
/* 2: Doesn't assign to module.exports */
(function(factory) {
if (typeof define === 'function' && define.amd) {
// AMD
define(['jquery'], factory);
} else if (typeof module === 'object' && module.exports) {
// CommonJS
factory(require('jquery'));
} else {
// Browser globals
factory(jQuery);
}
}(function($) {
$.fn.jqueryPlugin = function () { return true; };
}));
tl;dr 没关系,但通常建议包含 module.exports = ...
。
更长的解释
我相信您显示的代码中的 "better" 版本确实设置了 module.exports
:
module.exports = factory(require('jquery'));
然而,它没有。通常,您使用 jQuery-plugin 的方式是通过全局 $
/jQuery
变量,在这种情况下不需要 module.exports = ...
。使 jQuery-插件工作的行是:
$.fn.jqueryPlugin = function () { return true; };
但是 – 原则上 – 您可以像这样使用插件,直接调用它而无需通过 jQuery:
myjQueryPlugin = require('myjQueryPlugin');
var $myElement = $('#my-element');
myjQueryPlugin.apply($myElement, {});
在这种情况下,您需要设置 module.exports
。请注意,这看起来确实有点奇怪,所以一般来说大多数人不会像这样使用你的插件。
通过设置 module.exports
,您可以同时支持这两种用例,而不会丢失任何东西。
另请参阅:http://blog.npmjs.org/post/112712169830/making-your-jquery-plugin-work-better-with-npm(将插件导出为模块(可选)部分)