Cette fois, je vais vous montrer comment utiliser exports et module.exports, et quelles sont les précautions lors de l'utilisation de exports et module.exports. Ce qui suit est un cas pratique, jetons un coup d'œil.
1. exports est l' objet auxiliaire de module.exports Lorsque exports fournit une API vers le monde extérieur, vous devez utiliser return pour renvoyer l'objet exports
. 2. module.exports peut également fournir directement une API
Référence : https://github.com/seajs/seajs/issues/242
exporte l'objet
exports est un objet utilisé pour fournir des interfaces de module avec le monde extérieur.
define(function(require, exports) { // 对外提供 foo 属性 exports.foo = 'bar'; // 对外提供 doSomething 方法 exports.doSomething = function() {}; });
En plus d'ajouter des membres à l'objet exports, vous pouvez également utiliser return pour fournir directement des interfaces avec le monde extérieur.
define(function(require) { // 通过 return 直接提供接口 return { foo: 'bar', doSomething: function() {} }; });
Si l'instruction return est le seul code du module, elle peut également être simplifiée en :
define({ foo: 'bar', doSomething: function() {} });
Le format ci-dessus est particulièrement adapté à la définition de modules JSONP.
Remarque spéciale : la manière d'écrire suivante est fausse !
define(function(require, exports) { // 错误用法!!! exports = { foo: 'bar', doSomething: function() {} }; });
La bonne façon de l'écrire est d'utiliser return ou d'attribuer une valeur à module.exports :
define(function(require, exports, module) { // 正确写法 module.exports = { foo: 'bar', doSomething: function() {} }; });
Astuce : exports n'est qu'une référence à module.exports. Lorsque les exportations sont réaffectées à l’intérieur de l’usine, la valeur de module.exports ne sera pas modifiée. Par conséquent, l’attribution d’une valeur aux exportations n’est pas valide et ne peut pas être utilisée pour modifier l’interface du module.
Objet module.exports
L'interface fournie par le module actuel avec le monde extérieur.
Le paramètre exports passé au constructeur factory est une référence à l'objet module.exports. Fournir des interfaces uniquement via le paramètre exports ne peut parfois pas répondre à tous les besoins des développeurs. Par exemple, lorsque l'interface d'un module est une instance d'une certaine classe, elle doit être implémentée via module.exports :
define(function(require, exports, module) { // exports 是 module.exports 的一个引用 console.log(module.exports === exports); // true // 重新给 module.exports 赋值 module.exports = new SomeClass(); // exports 不再等于 module.exports console.log(module.exports === exports); // false });
Remarque : L'affectation à module.exports doit être exécutée de manière synchrone et ne peut pas être placée dans la fonction de rappel . Les éléments suivants ne fonctionneront pas :
// x.jsdefine(function(require, exports, module) { // 错误用法 setTimeout(function() { module.exports = { a: "hello" }; }, 0); });
Dans y.js, le x.js ci-dessus s'appelle :
// y.jsdefine(function(require, exports, module) { var x = require('./x'); // 无法立刻得到模块 x 的属性 a console.log(x.a); // undefined });
Je pense que vous maîtrisez la méthode après avoir lu le cas dans cet article. Pour des informations plus intéressantes, veuillez prêter attention aux autres articles connexes sur. le site PHP chinois !
Lecture recommandée :
Problèmes de détection des modifications de tableau dans vue
JS affiche une barre de progression lors du téléchargement de fichiers
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!