Browserify: utilisez module.exports si nécessaire, sinon exposez global

Je envisage d'adopter un navigateur pour certains de mes projets, mais je voudrais m'assurer que d'autres personnes ne doivent pas utiliser le navigateur s'ils veulent utiliser le code (fourni). La façon évidente de le faire est d'exposer les exportations de modules via module.exports ainsi que par une window. global. Cependant, je préfère ne pas polluer l'espace de noms global pour ceux qui require le script.

Est-il possible de détecter si un script require d? Si c'est le cas, je pourrais faire quelque chose comme:

 var mymodule = (function() { ... })(); if (isRequired()) { module.exports = mymodule; } else { window.mymodule = mymodule; } 

Notez que peu importe quoi, cela sera regroupé à l'avance, de sorte que le var mymodule sera pas exposer un global. En outre, je suis en train d'utiliser le modèle de module révélateur , mais je souhaiterais passer à quelque chose de plus approprié pour naviguer.

Quelle est la meilleure façon de rendre un module à la fois require et <script src= able? Est-il préférable d'exposer un monde dans les deux circonstances?

Il existe un bon article de Forbes Lindesay expliquant comment faire des versions autonomes: http://www.forbeslindesay.co.uk/post/46324645400/standalone-browserify-builds

La version courte, utilisez l'option autonome:

 browserify beep.js --standalone beep-boop > bundle.js 

J'ai affaire au même problème pour construire une bibliothèque et voici une opinion réfléchie. Je pense que nous devons séparer d'abord le public d'une bibliothèque en quelques catégories:

  1. Ceux qui utilisent browserify et NPM
  2. Ceux qui vont simplement télécharger mylib.min.js et utiliser d'une manière ou d'une autre
  3. AMD (avec bower?), Pourrait être la troisième catégorie.

Donc, pour 1 c'est facile, vous aurez un module index.js:

 module.exports = function () { /* code */ } 

Et votre package.json aura un principal

"Principal": "index.js"

Remarquez que je n'ai ajouté aucun code window.xx à index.js.

Pour 2, je pense que la meilleure idée est de créer un standalone.js

 var mylib = require('./index.js'); global.window.mylib = mylib; 

C'est ce que le navigateur devrait construire.

Pour 3 (si cela vous intéresse), vous pouvez modifier les paramètres standalone.js comme suit:

 var mylib = require('./index.js'); if (typeof global.window.define == 'function' && global.window.define.amd) { global.window.define('mylib', function () { return mylib; }); } else { global.window.mylib = mylib; } 

En supposant qu'une autre bibliothèque n'a pas créé un objet global module.exports, vous pouvez simplement vérifier l'existence de module.exports

 var mymodule = (function() { ... })(); if (module && module.exports) { module.exports = mymodule; } else { window.mymodule = mymodule; } 

Pourquoi ne pas simplement envelopper le tout avec une fermeture et passer les exports comme paramètre?

 (function (exports) { // code here // ... exports.foo = bar; })(exports || this); 

De cette façon, il l'exportera également vers la portée de WebWorker et d'autres environnements sans fenêtre.