Maison > interface Web > js tutoriel > 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

黄舟
Libérer: 2017-10-14 10:13:03
original
1719 Les gens l'ont consulté

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() {};
});
Copier après la connexion

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() {}
 };
});
Copier après la connexion

Si l'instruction return est le seul code du module, elle peut également être simplifiée en :


define({
 foo: 'bar',
 doSomething: function() {}
});
Copier après la connexion

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() {}
 };
});
Copier après la connexion

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() {}
 };
});
Copier après la connexion

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
});
Copier après la connexion

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);
});
Copier après la connexion

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
});
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal