Browserify - Cómo llamar a la función incluida en un archivo generado a través de browserify en el navegador


Soy nuevo en nodejs y browserify. Empecé con este enlace .

Tengo el archivo main.js que contiene este código

var unique = require('uniq');

var data = [1, 2, 2, 3, 4, 5, 5, 5, 6];

this.LogData =function(){
console.log(unique(data));
};

Ahora instalo el módulo uniq con npm:

 npm install uniq

Luego agrupo todos los módulos requeridos comenzando en main.js en un solo archivo llamado bundle.js con el comando browserify:

browserify main.js -o bundle.js

El archivo generado se ve así:

(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
var unique = require('uniq');

var data = [1, 2, 2, 3, 4, 5, 5, 5, 6];

this.LogData =function(){
console.log(unique(data));
};

},{"uniq":2}],2:[function(require,module,exports){
"use strict"

function unique_pred(list, compare) {
  var ptr = 1
    , len = list.length
    , a=list[0], b=list[0]
  for(var i=1; i<len; ++i) {
    b = a
    a = list[i]
    if(compare(a, b)) {
      if(i === ptr) {
        ptr++
        continue
      }
      list[ptr++] = a
    }
  }
  list.length = ptr
  return list
}

function unique_eq(list) {
  var ptr = 1
    , len = list.length
    , a=list[0], b = list[0]
  for(var i=1; i<len; ++i, b=a) {
    b = a
    a = list[i]
    if(a !== b) {
      if(i === ptr) {
        ptr++
        continue
      }
      list[ptr++] = a
    }
  }
  list.length = ptr
  return list
}

function unique(list, compare, sorted) {
  if(list.length === 0) {
    return []
  }
  if(compare) {
    if(!sorted) {
      list.sort(compare)
    }
    return unique_pred(list, compare)
  }
  if(!sorted) {
    list.sort()
  }
  return unique_eq(list)
}

module.exports = unique
},{}]},{},[1])

Después de incluir el paquete.archivo js en mi índice.página htm, cómo llamo a logData ¿función ??

Author: SharpCoder, 2014-04-25

8 answers

Por defecto, browserify no le permite acceder a los módulos desde fuera del código browserified – si desea llamar a código en un módulo browserified, se supone que browserify su código junto con el módulo. Véase http://browserify.org / para ejemplos de eso.

Por supuesto, también puedes hacer que tu método sea accesible desde afuera de esta manera:

window.LogData =function(){
  console.log(unique(data));
};

Entonces puedes llamar a LogData() desde cualquier otro lugar de la página.

 60
Author: thejh,
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-04-25 14:43:14

La parte clave de agrupar módulos independientes con Browserify es la opción --s. Expone todo lo que exportas desde tu módulo usando el nodo module.exports como una variable global. El archivo se puede incluir en una etiqueta <script>.

Solo necesita hacer esto si por alguna razón necesita que la variable global sea expuesta. En mi caso, el cliente necesitaba un módulo independiente que pudiera incluirse en las páginas web sin que tuvieran que preocuparse por este negocio Browserify.

Aquí hay un ejemplo donde usamos la opción --s con un argumento de module:

browserify index.js --s module > dist/module.js

Esto expondrá nuestro módulo como una variable global llamada module.
Source .

Actualización: Gracias a @fotinakis. Asegúrate de pasar --standalone your-module-name. Si olvidas que --standalone toma un argumento, Browserify podría generar silenciosamente un módulo vacío ya que no pudo encontrarlo.

Espero que esto te ahorre algo de tiempo.

 76
Author: Matas Vaitkevicius,
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
2016-05-20 19:00:36

La respuesta de@Matas Vaitkevicius con la opción independiente de Browserify es correcta (la respuesta de@thejh usando la variable global de ventana también funciona, pero como otros han señalado, contamina el espacio de nombres global por lo que no es ideal). Quería añadir un poco más de detalle sobre cómo utilizar la opción independiente.

En el script fuente que desea agrupar, asegúrese de exponer las funciones que desea llamar a través del módulo.exportación. En el script de cliente, puede llamar a estos expuestos funciones a través de .. He aquí un ejemplo:

Mi archivo fuente src/script.js tendrá esto:
module.exports = {myFunc: func};

Mi comando browserify se verá algo como esto:
browserify src/script.js --standalone myBundle > dist/bundle.js

Y mi script de cliente dist/client.js cargará el script incluido
<script src="bundle.js"></script>
y luego llamar a la función expuesta como esta:
<script>myBundle.myFunc();</script>


No es necesario requerir el nombre del paquete en el script del cliente antes llamar a las funciones expuestas, p. ej. <script src="bundle.js"></script><script>var bundled = require("myBundle"); bundled.myFunc();</script> no es necesario y no funcionará.

De hecho, al igual que todas las funciones incluidas por browserify sin modo independiente, la función require no estará disponible fuera del script incluido. Browserify le permite usar algunas funciones de nodo del lado del cliente, pero solo en el propio script incluido; no está destinado a crear un módulo independiente que pueda importar y usar en cualquier lugar del lado del cliente, por lo que tenemos que ir a todos este problema adicional solo para llamar a una sola función fuera de su contexto incluido.

 15
Author: Galen Long,
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
2018-08-14 15:20:17

Debe decir README.md de browserify acerca de --standalone parámetro o google "browserify umd"

 7
Author: undoZen,
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-07-01 16:35:24

Acabo de leer las respuestas y parece que nadie mencionó el uso del alcance de la variable global? Que es útil si desea utilizar el mismo código en el nodo.js y en el navegador.

class Test
{
  constructor()
  {
  }
}
global.TestClass = Test;

Entonces puedes acceder a la clase de prueba en cualquier lugar.

<script src="bundle.js"></script>
<script>
var test = new TestClass(); // Enjoy!
</script>

Nota: La clase de prueba estará disponible en todas partes. Que es lo mismo que usar la variable window.

Además, puede crear un decorador que exponga una clase al ámbito global. Que es realmente agradable, pero hace que sea difícil rastrear dónde se define una variable.

 4
Author: Azarus,
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
2018-05-06 14:17:25

Tienes algunas opciones:

  1. Deje que plugin browserify-bridge exporte automáticamente los módulos a un módulo de entrada generado. Esto es útil para proyectos de SDK o situaciones en las que no tiene que mantenerse al día manualmente con lo que se exporta.

  2. Siga un patrón de pseudo-espacio de nombres para la exposición roll-up:

Primero, organice su biblioteca de esta manera, aprovechando las búsquedas de índices en carpetas:

/src
--entry.js
--/helpers
--- index.js
--- someHelper.js
--/providers
--- index.js
--- someProvider.js
...

Con este patrón, se define la entrada así:

exports.Helpers = require('./helpers');
exports.Providers = require('./providers');
...

Observe que el require carga automáticamente el índice.js from each respective sub-folder

En sus subcarpetas, solo puede incluir un manifiesto similar de los módulos disponibles en ese contexto:

exports.SomeHelper = require('./someHelper');

Este patrón escala muy bien y permite el seguimiento contextual (carpeta por carpeta) de lo que se debe incluir en la api enrollada.

 1
Author: deepelement,
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-08-12 21:06:56

Para fines de depuración agregué esta línea a mi código.js:

window.e = function(data) {eval(data);};

Entonces podría ejecutar cualquier cosa incluso fuera del paquete.

e("anything();");
 -1
Author: Karveiani,
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
2017-07-23 22:11:51
window.LogData =function(data){
   return unique(data);
};

Llame a la función simplemente por LogData(data)

Esto es solo una ligera modificación a la respuesta de thejh pero importante

 -1
Author: Pratik Khadtale,
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
2018-05-01 08:56:22