Использование модуля Underscore с Node.js

147

Я изучал node.js и модули и не могу заставить библиотеку Underscore работать должным образом ... кажется, что когда я в первый раз использую функцию из Underscore, она перезаписывает объект _ с результатом мой вызов функции. Кто-нибудь знает, что происходит? Например, вот сеанс из REPL узла.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

Когда я сам создаю файлы Javascript и импортирую их, кажется, что они работают правильно. Может быть, есть что-то особенное в библиотеке Underscore?

Geoff
источник

Ответы:

169

Node REPL использует переменную подчеркивания для хранения результата последней операции, поэтому он конфликтует с использованием библиотекой Underscore той же переменной. Попробуйте что-то вроде этого:

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
Майк Скотт
источник
2
Спасибо. Это было просто.
Джефф
6
Я уже 30 минут бьюсь головой о клавиатуру, спасибо за это!
Россипедия
3
Вот почему так здорово. Великолепные ответы, подобные этому, экономят часы «ударов головой». Thankyou @Mike
Брайан Трейси
Узел v6 поддерживает назначение_ в REPL.
Джон-Дэвид Далтон
194

С сегодняшнего дня (30 апреля 2012 г.) вы можете использовать Underscore как обычно для своего кода Node.js. Предыдущие комментарии правильно указывают на то, что интерфейс REPL (режим командной строки узла) использует «_» для хранения последнего результата, НО вы можете свободно использовать его в своих файлах кода, и он будет работать без проблем, выполняя стандарт:

var _ = require('underscore');

Удачного кодирования!

Эрик Руис де Чавес
источник
7
Обратите внимание, это не сработает, если вы попытаетесь глобализировать подчеркивание: gist.github.com/3220108
Лэнс Поллард,
9
Кто-то однажды сказал мне, что Globals плохо работают на всех языках разработки. Я не вижу проблемы, связанной с указанием var _ = require ('underscore') для модулей, которым он требуется. nodejs.org/api/modules.html#modules_caching
Эрик Руис де Чавес,
Какой версии Node соответствует 30 апреля 2012 года?
посейд
Апрель 2012 года соответствует 0,6.
Эрик Руис де Чавес,
Эрик, это проблема, если ты пытаешься повторно использовать код на стороне клиента и на стороне сервера.
Брэндон
13

Имя, _используемое node.jsREPL для хранения предыдущего ввода. Выберите другое имя.

dkiyatkin
источник
10
__ двойное подчеркивание? :)
Amc_rtty
3
двойное подчеркивание лучше чем я чувствую :)
Каушик Тиртхаппа
-3

Примечание: следующее работает только для следующей строки кода и только из-за совпадения.

С Лодашем,

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

Нет, var _ = require('lodash')поскольку Lodash таинственно устанавливает это значение глобально, когда это необходимо.

Код Whisperer
источник
Нет, это не будет работать с lodash или чем-то еще. Это работает в вашем примере, потому что, как указано выше, узел устанавливает результат последнего оператора в _. Результатом вашего последнего заявления стала библиотека lodash. Так _.isArray([])будет работать на следующей строке , но больше никогда.
Марк Кан