2012-09-24 42 views
18

Tôi đã tạo ra một mô-đun nút về cơ bản chỉ là một số JS hữu ích mà cũng có thể được sử dụng phía máy khách. Tôi biết rằng require.js có thể tải các thành phần common.js, nhưng tôi không nhất thiết muốn thực hiện ủy nhiệm rằng tất cả những người sử dụng phía máy khách mô-đun của tôi cũng cần yêu cầu hoặc common.js hoặc một cái gì đó. Tôi cũng không muốn buộc họ xóa module.exports = ... ở cuối tệp. Người khác giải quyết vấn đề này như thế nào? Bạn chỉ cần tạo 2 phiên bản hoặc 2 phiên bản "được biên dịch" chứ? Module.exports có hoạt động ở mọi nơi không?module.exports phía máy khách

+2

Giải thích tốt nhất về chủ đề này tôi biết là http://www.2ality.com/2011/11/module-gap.html. Tác giả thảo luận về các ưu điểm/nhược điểm và chế độ triển khai/triển khai. –

Trả lời

16

Đây là những gì underscore.js làm:

if (typeof exports !== 'undefined') { 
    if (typeof module !== 'undefined' && module.exports) { 
    exports = module.exports = _; 
    } 
    exports._ = _; 
} else { 
    root['_'] = _; 
} 
+0

Ahh yea đó là mát mẻ! – Parris

+0

Tôi tự hỏi làm thế nào bạn có thể kiểm tra phần mã này để kiểm tra xem nó có được xuất thành công không. – Jun

4

này đã làm việc cho tôi (CoffeeScript). Giả 'Namespace' là những gì bạn muốn khẳng định trên phạm vi window cho khách hàng

(module ? {}).exports = @Namespace = 
    my: 'cool' 
    module: '!' 

Sau đó, bạn có thể sử dụng require('namespace').my === 'cool' trong Node.js hoặc Namespace.my === 'cool' trong trình duyệt. Điều này được chuyển vào JS như

(typeof module !== "undefined" && module !== null ? module : {}).exports = this.Namespace = { 
    my: 'cool', 
    module: '!' 
}; 
1

Tôi tìm thấy điều này đơn giản hơn:

try { 
    module.exports = exports = MyModule; 
} catch (e) {} 

Tập tin này có thể được bao gồm trong cả hai trình duyệt và node.js.

Các vấn đề liên quan