Maison  >  Article  >  interface Web  >  Explication détaillée de la différence entre exports et module.exports dans seaJs

Explication détaillée de la différence entre exports et module.exports dans seaJs

黄舟
黄舟original
2017-10-14 10:13:031620parcourir

Cet article présente principalement la différence entre exports et module.exports sur la base de l'expérience d'utilisation de seaJs. Il analyse les fonctions spécifiques, les méthodes d'utilisation et les précautions de fonctionnement associées sous forme d'exemples. peut s'y référer

L'exemple de cet article décrit la différence entre exports et module.exports sur la base de l'expérience d'utilisation de seaJs. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :

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 les exportations. object

2. module.exports également L'API

peut être fournie directement au monde extérieur Référence : https://github.com/seajs/seajs/issues/242

.

objet exports

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.

Note 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() {}
 };
});

Conseil : 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.

module.exports Objet

L'interface fournie par le module actuel.

Le paramètre exports passé au constructeur d'usine 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 : Affectation à module.exports Il doit être exécuté de manière synchrone et ne peut pas être placé dans la fonction de rappel . Ce qui suit ne fonctionne pas :


// x.jsdefine(function(require, exports, module) {
 // 错误用法
 setTimeout(function() {
  module.exports = { a: "hello" };
 }, 0);
});

Dans y.js, il y a un appel au x.js ci-dessus :


// y.jsdefine(function(require, exports, module) {
 var x = require('./x');
 // 无法立刻得到模块 x 的属性 a
 console.log(x.a); // undefined
});

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn