Sử dụng mô-đun Underscore với Node.js


147

Tôi đã tìm hiểu về node.js và các mô-đun và dường như không thể khiến thư viện Underscore hoạt động chính xác ... có vẻ như lần đầu tiên tôi sử dụng một hàm từ Underscore, nó ghi đè lên đối tượng _ với kết quả là chức năng của tôi gọi. Có ai biết chuyện gì đang xảy ra không? Ví dụ: đây là một phiên từ REPL của node.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

Khi tôi tự tạo các tệp Javascript và nhập chúng, chúng dường như hoạt động bình thường. Có lẽ có gì đặc biệt với thư viện Underscore?

Câu trả lời:


169

Nút REPL sử dụng biến gạch dưới để giữ kết quả của hoạt động cuối cùng, do đó, nó mâu thuẫn với việc sử dụng cùng một biến của thư viện Underscore. Hãy thử một cái gì đó như thế này:

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
Cảm ơn bạn. Điều đó thật đơn giản.
Geoff

6
Tôi đã đập đầu vào bàn phím của tôi trong 30 phút rồi, cảm ơn vì điều này!
rossipedia

3
Đây là lý do tại sao SO là tuyệt vời. Những câu trả lời tuyệt vời như thế này tiết kiệm hàng giờ "đập đầu". Thankyou @Mike
Brian Tracy

Nút v6 hỗ trợ gán_ trong REPL.
John-David Dalton

194

Kể từ hôm nay (30 tháng 4 năm 2012), bạn có thể sử dụng Underscore như bình thường trên mã Node.js của mình. Các ý kiến ​​trước đây đã chỉ ra rằng giao diện REPL (chế độ dòng lệnh của Node) sử dụng "_" để giữ kết quả cuối cùng NHƯNG bạn có thể tự do sử dụng nó trên các tệp mã của mình và nó sẽ hoạt động mà không gặp vấn đề gì khi thực hiện tiêu chuẩn:

var _ = require('underscore');

Chúc mừng mã hóa!


7
Lưu ý, điều này không hoạt động nếu bạn cố gắng toàn cầu hóa dấu gạch dưới: gist.github.com/3220108
Lance Pollard

9
Ai đó đã từng nói với tôi rằng Globals là xấu trên tất cả các ngôn ngữ phát triển. Tôi không thấy vấn đề phải chỉ định var _ = quiries ('gạch dưới') trên các mô-đun yêu cầu. nodejs.org/api/modules.html#modules_caching
Erick Ruiz de Chavez

Phiên bản Node 30-apri-2012 tương ứng với cái gì?
đặt ra

Tháng 4 năm 2012 tương ứng với 0,6.
Erick Ruiz de Chavez

Erick, đó là một vấn đề nếu bạn đang cố gắng sử dụng lại mã phía máy khách ở phía máy chủ.
Brandon


13

Tên _được sử dụng bởi node.jsREPL để giữ đầu vào trước đó. Chọn một tên khác.


10
__ gạch dưới gấp đôi? :)
Amc_rtty

3
gạch dưới gấp đôi tốt hơn _und tôi cảm thấy :)
Kaushik Thirthappa

-3

Lưu ý: Phần sau chỉ hoạt động cho dòng mã tiếp theo và chỉ do sự trùng hợp ngẫu nhiên.

Với Lodash,

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

Không var _ = require('lodash')kể từ khi Lodash bí mật thiết lập giá trị này trên toàn cầu khi được yêu cầu.


Không, điều này sẽ không hoạt động với lodash hoặc bất cứ điều gì khác. Nó hoạt động trong ví dụ của bạn bởi vì, như đã nêu ở trên, nút đặt kết quả của câu lệnh cuối cùng thành _. Kết quả của tuyên bố cuối cùng của bạn là lib lodash. Vì vậy, _.isArray([])sẽ làm việc trên dòng tiếp theo , nhưng không bao giờ nữa.
Mark Kahn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.