Использование модуля 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?

Ответы:


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
— Брайан Трейси


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 для хранения предыдущего ввода. Выберите другое имя.


10
__ двойное подчеркивание? :)
— Amc_rtty

3
двойное подчеркивание лучше чем я чувствую :)
— Каушик Тиртхаппа

-3

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

С Лодашем,

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

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


Нет, это не будет работать с lodash или чем-то еще. Это работает в вашем примере, потому что, как указано выше, узел устанавливает результат последнего оператора в _. Результатом вашего последнего заявления стала библиотека lodash. Так _.isArray([])будет работать на следующей строке , но больше никогда.
— Марк Кан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.