Korzystanie z modułu Underscore w Node.js.

147

Dowiedziałem się o node.js i modułach i nie mogę sprawić, by biblioteka Underscore działała poprawnie ... wygląda na to, że gdy po raz pierwszy używam funkcji z Underscore, nadpisuje ona obiekt _ wynikiem moje wywołanie funkcji. Czy ktoś wie, co się dzieje? Na przykład, oto sesja z pliku 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

Kiedy sam tworzę pliki Javascript i importuję je, wydaje się, że działają poprawnie. Może jest coś specjalnego w bibliotece Underscore?

Geoff
źródło

Odpowiedzi:

169

Węzeł REPL używa zmiennej podkreślenia do przechowywania wyniku ostatniej operacji, więc powoduje to konflikt z użyciem tej samej zmiennej przez bibliotekę Underscore. Spróbuj czegoś takiego:

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
źródło
2
Dziękuję Ci. To było proste.
Geoff,
6
Uderzam głową w klawiaturę od 30 minut, dzięki za to!
rossipedia
3
Właśnie dlatego SO jest niesamowity. Takie świetne odpowiedzi pozwalają zaoszczędzić wiele godzin „machania głową”. Thankyou @Mike
Brian Tracy
Node v6 obsługuje przypisywanie do_ w REPL.
John-David Dalton
194

Od dzisiaj (30 kwietnia 2012 r.) Możesz normalnie używać podkreślenia w kodzie Node.js. Poprzednie komentarze wskazują, że interfejs REPL (tryb wiersza poleceń węzła) używa znaku „_” do przechowywania ostatniego wyniku, ALE możesz go używać na swoich plikach kodu i będzie działać bez problemu, wykonując standard:

var _ = require('underscore');

Miłego kodowania!

Erick Ruiz de Chavez
źródło
7
Uwaga, to nie zadziała, jeśli spróbujesz zglobalizować podkreślenie: gist.github.com/3220108
Lance Pollard
9
Ktoś mi kiedyś powiedział, że Globals źle radzą sobie ze wszystkimi językami programowania. Nie widzę problemu z koniecznością określenia var _ = require ('underscore') w modułach, które tego wymagają. nodejs.org/api/modules.html#modules_caching
Erick Ruiz de Chavez
Z jaką wersją węzła odpowiada 30 kwietnia 2012 r.?
poseid
Kwiecień 2012 odpowiada 0,6.
Erick Ruiz de Chavez
Erick, to problem, jeśli próbujesz ponownie użyć kodu po stronie klienta również po stronie serwera.
Brandon
13

Nazwa _używana przez node.jsREPL do przechowywania poprzedniego wejścia. Wybierz inną nazwę.

dkiyatkin
źródło
10
__ podwójne podkreślenie? :)
Amc_rtty
3
podwójne podkreślenie jest lepsze niż _nie czuję :)
Kaushik Thirthappa
-3

Uwaga: Poniższe działa tylko dla następnego wiersza kodu i tylko z powodu zbiegów okoliczności.

Z Lodash,

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

Nie, var _ = require('lodash')ponieważ Lodash w tajemniczy sposób ustawia tę wartość globalnie, gdy jest to wymagane.

Zaklinacz kodów
źródło
Nie, to nie zadziała z lodash ani z niczym innym. Działa to w twoim przykładzie, ponieważ, jak wspomniano powyżej, node ustawia wynik ostatniej instrukcji na _. Wynikiem twojego ostatniego oświadczenia była lodash lib. Tak _.isArray([])będzie działać na następnej linii , ale nigdy więcej.
Mark Kahn