Usando el módulo Underscore con Node.js

147

He estado aprendiendo sobre node.js y módulos, y parece que no puedo hacer que la biblioteca Underscore funcione correctamente ... parece que la primera vez que uso una función de Underscore, sobrescribe el objeto _ con el resultado de Mi llamada a la función. Alguien sabe lo que está pasando? Por ejemplo, aquí hay una sesión del nodo.js REPL:

Admin-MacBook-Pro:test admin$ node
> require("./underscore-min")
{ [Function]
  _: [Circular],
  VERSION: '1.1.4',
  forEach: [Function],
  each: [Function],
  map: [Function],
  inject: [Function],
  (...more functions...)
  templateSettings: { evaluate: /<%([\s\S]+?)%>/g, interpolate: /<%=([\s\S]+?)%>/g },
  template: [Function] }
> _.max([1,2,3])
3
> _.max([4,5,6])
TypeError: Object 3 has no method 'max'
    at [object Context]:1:3
    at Interface.<anonymous> (repl.js:171:22)
    at Interface.emit (events.js:64:17)
    at Interface._onLine (readline.js:153:10)
    at Interface._line (readline.js:408:8)
    at Interface._ttyWrite (readline.js:585:14)
    at ReadStream.<anonymous> (readline.js:73:12)
    at ReadStream.emit (events.js:81:20)
    at ReadStream._emitKey (tty_posix.js:307:10)
    at ReadStream.onData (tty_posix.js:70:12)
> _
3

Cuando hago archivos Javascript yo mismo y los importo, parece que funcionan correctamente. ¿Tal vez hay algo especial con la biblioteca Underscore?

Geoff
fuente

Respuestas:

169

El Node REPL utiliza la variable de subrayado para contener el resultado de la última operación, por lo que entra en conflicto con el uso de la misma variable por parte de la biblioteca de subrayado. Intenta algo como esto:

Admin-MacBook-Pro:test admin$ node
> _und = require("./underscore-min")
{ [Function]
  _: [Circular],
  VERSION: '1.1.4',
  forEach: [Function],
  each: [Function],
  map: [Function],
  inject: [Function],
  (...more functions...)
  templateSettings: { evaluate: /<%([\s\S]+?)%>/g, interpolate: /<%=([\s\S]+?)%>/g },
  template: [Function] }
> _und.max([1,2,3])
3
> _und.max([4,5,6])
6
Mike Scott
fuente
2
Gracias. Eso fue sencillo.
Geoff
66
Llevo 30 minutos golpeándome la cabeza contra el teclado, ¡gracias por esto!
rossipedia
3
Es por eso que SO es increíble. Grandes respuestas como esta ahorran horas de "golpes en la cabeza". Gracias @Mike
Brian Tracy
El nodo v6 admite la asignación_ en REPL.
John-David Dalton
194

A partir de hoy (30 de abril de 2012) puede usar el subrayado como de costumbre en su código Node.js. Los comentarios anteriores apuntan correctamente a que la interfaz REPL (modo de línea de comando del Nodo) usa la "_" para mantener el último resultado PERO en usted es libre de usarlo en sus archivos de código y funcionará sin problemas haciendo el estándar:

var _ = require('underscore');

¡Feliz codificación!

Erick Ruiz de Chavez
fuente
77
Tenga en cuenta que esto no funciona si intenta globalizar el guión bajo: gist.github.com/3220108
Lance Pollard
9
Alguien me dijo una vez que los Globals son malos en todos los lenguajes de desarrollo. No veo un problema al tener que especificar var _ = require ('subrayado') en los módulos que lo requieren. nodejs.org/api/modules.html#modules_caching
Erick Ruiz de Chavez
¿Con qué versión de nodo corresponde el 30 de abril de 2012?
Poseid
Abril de 2012 corresponde a 0.6.
Erick Ruiz de Chavez
Erick, es un problema si también intentas reutilizar el código del lado del cliente en el lado del servidor.
Brandon
28

O:

    var _ = require('underscore')._;
micrub
fuente
21
"npm install subrayado" primero
Sr. Ming
3
npm install -g underscore, quieres decir :)
Eliran Malka
13

El nombre _utilizado por node.jsREPL para mantener la entrada anterior. Elige otro nombre.

dkiyatkin
fuente
10
__ doble guión bajo? :)
Amc_rtty
3
doble guión bajo es mejor que _und me siento :)
Kaushik Thirthappa
-3

Nota: Lo siguiente solo funciona para la siguiente línea de código, y solo debido a una coincidencia.

Con Lodash

require('lodash');
_.isArray([]); // true

No, var _ = require('lodash')ya que Lodash establece misteriosamente este valor a nivel mundial cuando es necesario.

Code Whisperer
fuente
No, esto no funcionará con lodash o cualquier otra cosa. Funciona en su ejemplo porque, como se indicó anteriormente, el nodo establece el resultado de la última instrucción en _. El resultado de su última declaración fue la lodash lib. Entonces _.isArray([])trabajará en la siguiente línea , pero nunca más.
Mark Kahn