Utilisation du module Underscore avec Node.js

147

J'ai appris à propos de node.js et des modules, et je n'arrive pas à faire fonctionner correctement la bibliothèque Underscore ... il semble que la première fois que j'utilise une fonction de Underscore, elle écrase l'objet _ avec le résultat de mon appel de fonction. Quelqu'un sait ce qui se passe? Par exemple, voici une session du REPL node.js:

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

Lorsque je crée moi-même des fichiers Javascript et que je les importe, ils semblent fonctionner correctement. Peut-être qu'il y a quelque chose de spécial avec la bibliothèque Underscore?

Geoff
la source

Réponses:

169

Le Node REPL utilise la variable de soulignement pour contenir le résultat de la dernière opération, il entre donc en conflit avec l'utilisation de la même variable par la bibliothèque Underscore. Essayez quelque chose comme ceci:

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
la source
2
Je vous remercie. C'était simple.
Geoff
6
Je me cogne la tête contre mon clavier depuis 30 minutes maintenant, merci pour ça!
rossipedia
3
C'est pourquoi SO est génial. De bonnes réponses comme celle-ci sauvent des heures de «coups de tête». Thankyou @Mike
Brian Tracy
Node v6 prend en charge l'assignation_ dans le REPL.
John-David Dalton
194

À partir d'aujourd'hui (30 avril 2012), vous pouvez utiliser Underscore comme d'habitude sur votre code Node.js. Les commentaires précédents indiquent à droite que l'interface REPL (mode de ligne de commande de Node) utilise le "_" pour contenir le dernier résultat MAIS si vous êtes libre de l'utiliser sur vos fichiers de code et cela fonctionnera sans problème en faisant le standard:

var _ = require('underscore');

Bon codage!

Erick Ruiz de Chavez
la source
7
Remarque, cela ne fonctionne pas si vous essayez de globaliser le soulignement: gist.github.com/3220108
Lance Pollard
9
Quelqu'un m'a dit un jour que Globals est mauvais sur tous les langages de développement. Je ne vois pas de problème à devoir spécifier var _ = require ('underscore') sur les modules qui en ont besoin. nodejs.org/api/modules.html#modules_caching
Erick Ruiz de Chavez
À quelle version de Node correspond le 30 avril 2012?
poseid
Avril 2012 correspond à 0,6.
Erick Ruiz de Chavez
Erick, c'est un problème si vous essayez de réutiliser également le code côté client côté serveur.
Brandon
13

Le nom _utilisé par le node.jsREPL pour contenir l'entrée précédente. Choisissez un autre nom.

dkiyatkin
la source
10
__ double soulignement? :)
Amc_rtty
3
le double soulignement est meilleur que _und je me sens :)
Kaushik Thirthappa
-3

Remarque: ce qui suit ne fonctionne que pour la ligne de code suivante, et uniquement en raison d'une coïncidence.

Avec Lodash,

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

Non, var _ = require('lodash')car Lodash définit mystérieusement cette valeur globalement lorsque cela est nécessaire.

Code Whisperer
la source
Non, cela ne fonctionnera pas avec lodash ou quoi que ce soit d'autre. Cela fonctionne dans votre exemple car, comme indiqué ci-dessus, node définit le résultat de la dernière instruction sur _. Le résultat de votre dernière déclaration a été le lodash lib. Cela _.isArray([])fonctionnera donc sur la ligne suivante , mais plus jamais.
Mark Kahn