2016-04-28 35 views
0

我看到JS库使用这两种不同的实现。 CommonJS线只有不同之处。UMD:是否正在分配给module.exports冗余?

它们在功能上是否相同?将值分配给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; }; 
})); 

回答

2

TL;博士它并不真正的问题,但包括module.exports = ...一般建议。

较长的解释

我相信“更好”的版本在你展示的代码是不设置module.exports之一:

module.exports = factory(require('jquery')); 

然而,这并不来。通常,您使用jQuery插件的方式是通过全局变量$/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(区间导出插件作为一个模块(可选)