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?

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

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


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!


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



-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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.