2016-04-28 4 views
0

Je vois des bibliothèques JS utilisant ces deux implémentations différentes. La seule différence est la ligne CommonJS.UMD: l'affectation à module.exports est-elle redondante?

Sont-ils fonctionnellement identiques? L'affectation de la valeur à module.exports n'est-elle pas requise?

/* 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; }; 
})); 

Répondre

2

tl; dr Il n'a pas vraiment d'importance, mais y compris module.exports = ... est généralement recommandé.

Explication plus

je crois que la version "meilleur" dans le code que vous présentez est celui qui ne crée module.exports:

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

Cependant, il n'a pas avoir à. En général, la façon dont vous utilisez le plugin jQuery passe par la variable globale $/jQuery, et dans ce cas le module.exports = ... n'est pas nécessaire. La ligne faisant le travail-plugin jQuery est:

$.fn.jqueryPlugin = function() { return true; }; 

Mais - en principe - vous pouvez utiliser le plug-in comme celui-ci, en l'appelant directement sans passer par jQuery:

myjQueryPlugin = require('myjQueryPlugin'); 
var $myElement = $('#my-element'); 
myjQueryPlugin.apply($myElement, {}); 

Dans ce cas, vous besoin de régler module.exports. Notez que cela semble un peu bizarre, donc en général la plupart des gens n'utiliseraient pas votre plugin comme ça.

En réglant module.exports, vous acceptez les deux cas d'utilisation, sans rien perdre.

Voir aussi:http://blog.npmjs.org/post/112712169830/making-your-jquery-plugin-work-better-with-npm (la section Exportation du plug-in en tant que module (en option))