การใช้โมดูล Underscore กับ Node.js


147

ฉันได้เรียนรู้เกี่ยวกับ node.js และโมดูลและดูเหมือนจะไม่สามารถทำให้ไลบรารี Underscore ทำงานได้อย่างถูกต้อง ... ดูเหมือนว่าครั้งแรกที่ฉันใช้ฟังก์ชั่นจาก 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 ด้วยตนเองและนำเข้าไฟล์ดูเหมือนว่าจะทำงานได้อย่างถูกต้อง อาจมีบางสิ่งที่พิเศษกับ 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 นาทีแล้วขอบคุณสำหรับสิ่งนี้!
rossipedia

3
นี่คือเหตุผลที่ SO นั้นยอดเยี่ยม คำตอบที่ยอดเยี่ยมเช่นนี้ช่วยประหยัดเวลาในการ "ต่อสู้หัว" Thankyou @Mike
Brian Tracy


194

ณ วันนี้(30 เมษายน 2012)คุณสามารถใช้ขีดล่างตามปกติในรหัส Node.js ของคุณ ความคิดเห็นก่อนหน้าชี้ไปที่ถูกต้องว่าอินเตอร์เฟส REPL (โหมดบรรทัดคำสั่งของโหนด) ใช้ "_" เพื่อเก็บผลลัพธ์สุดท้าย แต่คุณมีอิสระที่จะใช้มันในไฟล์รหัสของคุณและมันจะทำงานได้โดยไม่มีปัญหาโดยทำตามมาตรฐาน:

var _ = require('underscore');

การเข้ารหัสมีความสุข!


7
หมายเหตุสิ่งนี้ใช้ไม่ได้หากคุณพยายามขีดเส้นใต้โลกาภิวัตน์: gist.github.com/3220108
Lance Pollard

9
มีคนเคยบอกฉันว่า Globals ไม่ดีในทุกภาษาที่พัฒนา ฉันไม่เห็นปัญหาในการระบุ var _ = require ('ขีดล่าง') ในโมดูลที่ต้องใช้ nodejs.org/api/modules.html#modules_caching
Erick Ruiz de Chavez

30-apri-2012 เวอร์ชั่นใดที่สอดคล้องกับโหนด?
ก่อให้เกิด

เมษายน 2012 สอดคล้องกับ 0.6
Erick Ruiz de Chavez

ก่อนหน้านี้มันเป็นปัญหาถ้าคุณพยายามใช้รหัสฝั่งไคลเอ็นต์บนฝั่งเซิร์ฟเวอร์อีกครั้ง
แบรนดอน


13

ชื่อที่_ใช้โดยnode.jsREPL เพื่อเก็บอินพุตก่อนหน้า เลือกชื่ออื่น


10
__ ขีดล่างคู่หรือไม่ :)
Amc_rtty

3
ขีดล่างดีกว่า _und ฉันรู้สึก :)
Kaushik Thirthappa

-3

หมายเหตุ: ข้อมูลต่อไปนี้ใช้สำหรับรหัสบรรทัดถัดไปและเกิดจากความบังเอิญเท่านั้น

กับ Lodash

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

ไม่var _ = require('lodash')เนื่องจาก Lodash ตั้งค่านี้อย่างลึกลับทั่วโลกเมื่อต้องการ


ไม่สิ่งนี้จะไม่สามารถใช้งานได้กับ lodash หรือสิ่งอื่นใด _มันทำงานได้ในตัวอย่างของคุณเพราะตามที่ระบุไว้ข้างต้นโหนดชุดผลมาจากคำสั่งสุดท้ายไป ผลลัพธ์ของข้อความสั่งสุดท้ายของคุณคือ lodash lib ดังนั้น_.isArray([])จะทำงานในบรรทัดถัดไปแต่ไม่เคยอีกครั้ง
Mark Kahn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.