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