Menggunakan modul Underscore dengan Node.js

147

Saya telah belajar tentang node.js dan modul, dan sepertinya tidak bisa membuat perpustakaan Underscore berfungsi dengan baik ... sepertinya pertama kali saya menggunakan fungsi dari Underscore, itu menimpa objek _ dengan hasil dari panggilan fungsi saya. Ada yang tau apa yang terjadi? Sebagai contoh, berikut adalah sesi dari 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

Ketika saya membuat file Javascript sendiri dan mengimpornya, mereka sepertinya berfungsi dengan baik. Mungkin ada sesuatu yang istimewa dengan perpustakaan Garis Bawah?

Geoff
sumber

Jawaban:

169

Node REPL menggunakan variabel garis bawah untuk menampung hasil operasi terakhir, sehingga bertentangan dengan penggunaan variabel yang sama perpustakaan Underscore. Coba sesuatu seperti ini:

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
sumber
2
Terima kasih. Itu mudah.
Geoff
6
Saya telah membenturkan kepala ke keyboard saya selama 30 menit sekarang, terima kasih untuk ini!
rossipedia
3
Inilah sebabnya mengapa SO luar biasa. Jawaban bagus seperti ini menghemat berjam-jam "head banging". Thankyou @ Mike
Brian Tracy
Node v6 mendukung penetapan_ dalam REPL.
John-David Dalton
194

Mulai hari ini (30 April 2012) Anda dapat menggunakan Garis Bawah seperti biasa pada kode Node.js Anda. Komentar sebelumnya benar menunjuk bahwa antarmuka REPL (mode baris perintah Node) menggunakan "_" untuk menahan hasil terakhir TAPI Anda bebas menggunakannya pada file kode Anda dan itu akan bekerja tanpa masalah dengan melakukan standar:

var _ = require('underscore');

Selamat coding!

Erick Ruiz de Chavez
sumber
7
Catatan, ini tidak berfungsi jika Anda mencoba untuk mengglobalkan garis bawah: gist.github.com/3220108
Lance Pollard
9
Seseorang pernah mengatakan kepada saya bahwa Globals buruk pada semua bahasa pembangunan. Saya tidak melihat masalah harus menentukan var _ = membutuhkan ('garis bawah') pada modul yang membutuhkannya. nodejs.org/api/modules.html#modules_caching
Erick Ruiz de Chavez
Versi Node apa yang cocok dengan 30-April-2012?
Poseid
April 2012 sesuai dengan 0,6.
Erick Ruiz de Chavez
Erick, itu masalah jika Anda mencoba menggunakan kembali kode sisi klien di sisi server juga.
Brandon
13

Nama yang _digunakan oleh node.jsREPL untuk menampung input sebelumnya. Pilih nama lain.

dkiyatkin
sumber
10
__ garis bawah ganda? :)
Amc_rtty
3
menggarisbawahi lebih baik daripada _und kurasa :)
Kaushik Thirthappa
-3

Catatan: Berikut ini hanya berfungsi untuk baris kode berikutnya, dan hanya karena kebetulan.

Dengan Lodash,

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

Tidak var _ = require('lodash')karena Lodash secara misterius menetapkan nilai ini secara global saat diminta.

Pembisik kode
sumber
Tidak, ini tidak akan berfungsi dengan lodash atau yang lainnya. Ini berfungsi dalam contoh Anda karena, seperti yang dinyatakan di atas, simpul menetapkan hasil dari pernyataan terakhir _. Hasil dari pernyataan terakhir Anda adalah lash lodash. Jadi _.isArray([])akan bekerja pada baris berikutnya , tetapi tidak pernah lagi.
Mark Kahn