Використання модуля підкреслення з Node.js


147

Я дізнався про node.js та модулі, і не можу зробити так, щоб бібліотека підкреслення працювала належним чином ... здається, що в перший раз, коли я використовую функцію з Underscore, вона перезаписує об'єкт _ з результатом мій виклик функції. Хтось знає, що відбувається? Наприклад, ось сеанс від node.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

Коли я сам створюю файли Javascript та імпортую їх, вони, здається, працюють належним чином. Можливо, у бібліотеці підкреслення є щось особливе?

Відповіді:


169

Вузол REPL використовує змінну підкреслення для утримання результату останньої операції, тому вона суперечить використанню бібліотеки підкреслення тієї самої змінної. Спробуйте щось подібне:

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 хвилин стукаю головою об клавіатуру, дякую за це!
rossipedia

3
Ось чому SO дивовижно. Чудові відповіді на кшталт цього економлять години "удару в голову". Thankyou @Mike
Брайан Трейсі


194

На сьогодні (30 квітня 2012 р.) Ви можете використовувати підкреслення як зазвичай у коді Node.js. Попередні коментарі вірно вказують на те, що інтерфейс REPL (командний рядок Node) використовує "_" для утримання останнього результату, АЛЕ ви можете використовувати його у своїх кодових файлах, і він буде працювати без проблем, виконуючи стандарт:

var _ = require('underscore');

Щасливого кодування!


7
Зауважте, це не спрацює, якщо ви спробуєте глобалізувати підкреслення: gist.github.com/3220108
Lance Pollard

9
Хтось одного разу сказав мені, що глобальні люди погано ставляться до всіх мов розвитку. Я не бачу проблеми з необхідністю вказати var _ = requ ('підкреслення') на модулях, які вимагають цього. nodejs.org/api/modules.html#modules_caching
Erick Ruiz de Chavez,

З якою версією Node відповідає 30 квітня 2012 року?
poseid

Квітень 2012 року відповідає 0,6.
Ерік Руїс де Чавес

Ерік, це проблема, якщо ти намагаєшся повторно використовувати код на стороні клієнта і на стороні сервера.
Брендон


13

Ім'я, яке _використовується node.jsREPL для утримання попереднього вводу. Виберіть інше ім'я.


10
__ подвійне підкреслення? :)
Amc_rtty

3
подвійне підкреслення краще, ніж _und я відчуваю :)
Kaushik Thirthappa

-3

Примітка. Наступне працює лише для наступного рядка коду, і лише через збіг.

З Лодашем,

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

Ні, var _ = require('lodash')оскільки Лодаш загадково встановлює це значення в усьому світі, коли це вимагається.


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