2010-10-06 23 views
5

Theory:Gợi ý để đối phó với `exports` trong Node.js

Một trong những điều mà kháng cáo cho tôi về Node.js đang sử dụng nó như một công cụ dòng lệnh.

Về lý thuyết, tôi có thể viết thư viện bằng Javascript và đặt chúng trong thư mục ~/.node_libraries của mình, sau đó tôi có thể sử dụng lại các thư viện đó. Ví dụ:

Ví dụ: tôi có text.js trong ~/.node_libraries và có nhiều chức năng liên quan đến văn bản tôi sử dụng nhiều lần (depunctuate(), tokenize_text(), những thứ tương tự).

Vẻ đẹp của việc này là tôi có thể sử dụng cùng một tệp text.js với các dòng lệnh và phía máy chủ của tôi. Ngay bây giờ tôi đang làm tất cả các công cụ xử lý văn bản với Python, nhưng tôi muốn chỉ dính vào một ngôn ngữ.

Thực hành:

AFAICT, để tạo ra một mô-đun Node.js, tôi phải đính kèm tất cả mọi thứ mà tôi muốn có sẵn cho exports hoặc this. Tức là, trong text.js, tôi phải làm:

exports.depunctuate = depunctuate 

hoặc

this.depunctuate = depunctuate 

Nếu tôi sử dụng exports, tôi có vấn đề với việc sử dụng các thư viện server-side à la:

<script src=text.js></script> 

bởi vì sau đó tôi nhận được xuất không được xác định lỗi.

Nếu tôi sử dụng this, tôi tránh lỗi, nhưng mọi thứ tôi xuất kết thúc đều được đính kèm với đối tượng cửa sổ.

Có cách nào để tôi có thể thiết lập các thư viện này để tránh cả hai vấn đề này? Ví dụ, có một số cách tôi có thể bọc xuất khẩu của exports để var sẽ được rõ ràng cho nút, nhưng không phải khi nó được sử dụng trong một tập tin Javascript đồng bằng trên một máy chủ?

Trả lời

7

Làm thế nào để kiểm tra sự tồn tại của đối tượng exports trước khi dán nội dung vào trong đó?

này đã làm việc tốt cho tôi cho đến nay, nhưng có lẽ đó là những ý tưởng tốt hơn trên mạng:

if(typeof(exports) !== 'undefined' && exports !== null) { 
    exports.foo = foo; 
    exports.bar = bar; 
} 

Trong CoffeeScript, điều này có thể được thực hiện ngắn gọn hơn một chút:

[exports.foo, exports.bar] = [foo, bar] if exports? 
+0

Điều đó đã xảy ra! Gotta yêu Stackoverflow ... BTW, tại sao tôi không thể nói 'if (export)'? –

+0

Đợi đã, trong suy nghĩ thứ hai, tôi vẫn có thể truy cập vào 'window.depunctuate'. –

7

vì vậy đây đi vào một vấn đề không gian tên. Trừ khi một hàm được gọi với toán tử mới, bạn sẽ nhận được một ngữ cảnh này === đến cửa sổ (toàn cục). Một cách để né tránh điều này là:

(function(exports) { 
    /* put your depuncuate definition here to keep it from leaking to the global */ 
    exports.depunctuate = depunctuate; 
})((typeof exports === 'undefined') ? myAppNamespace : exports);