Browserify: Utilice el módulo.exportaciones si es necesario, de lo contrario exponer global


Estoy considerando adoptar browserify para algunos de mis proyectos, pero me gustaría asegurarme de que otros no tengan que usar browserify si quieren usar el código (incluido). La forma obvia de hacer esto es tanto exponer las exportaciones de módulos a través de module.exports como a través de un window. global. Sin embargo, prefiero no contaminar el espacio de nombres global para aquellos que están requireing el script.

¿Es posible detectar si un script está siendo require d? Si lo es, entonces podría hacer algo como:

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

Tenga en cuenta que no importa qué, esto se liará de antemano, por lo que el var mymodule no estará exponiendo un global. Además, actualmente estoy usando el patrón de módulo revelador, pero estaría dispuesto a cambiar a algo más apropiado para browserify.

¿Cuál es la mejor manera de hacer que un módulo sea tanto require capaz como <script src= capaz? ¿Es mejor exponer a un global en ambas circunstancias?

Author: Bryan Head, 2013-04-23

4 answers

Hay un buen artículo de Forbes Lindesay explicando cómo hacer compilaciones independientes: http://www.forbeslindesay.co.uk/post/46324645400/standalone-browserify-builds

La versión corta, utilice la opción independiente:

browserify beep.js --standalone beep-boop > bundle.js
 35
Author: karellm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-19 02:05:10

Estoy tratando con el mismo problema de construir una biblioteca y aquí hay una opinión rought. Creo que necesitamos separar primero las audiencias para una biblioteca en pocas categorías:

  1. aquellos que usan browserify y NPM
  2. aquellos que solo descargarán un mylib.min.js and use one way or another
  3. AMD (con enramada?), podría ser la tercera categoría.

Así, para 1 es fácil, usted tendrá un su índice.módulo js:

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

Y tu paquete.json tendrá un main

"main": "index.js "

Observe que no he añadido ninguna ventana.xx code to index.js.

Para 2 creo que la mejor idea es crear un standalone.js

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

Esto es lo que browserify debería construir.

Para 3 (si te importa) puedes ajustar independiente.js as follows:

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;
}
 19
Author: José F. Romaniello,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-24 14:07:51

Asumiendo que otra biblioteca no ha creado un módulo global.exporta el objeto, simplemente puede verificar la existencia del módulo.exportaciones

var mymodule = (function() { ... })();
if (module && module.exports) {
  module.exports = mymodule;
} else {
  window.mymodule = mymodule;
}
 2
Author: RomainMF,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-27 15:51:32

¿Por qué no envolver todo con un cierre y pasar exports como parámetro?

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

De esta manera también lo exportará al ámbito de trabajo web y a otros entornos 'sin ventanas'.

 0
Author: YemSalat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-09 11:22:23