2015-05-16 12 views
11

Tôi đang cố gắng xây dựng một tập hợp các utils cho dự án NodeJS của mình. Những người trợ giúp này sẽ bao gồm: utils văn bản (như chất nền, giao diện điều khiển đăng nhập, v.v.) và những người trợ giúp cụ thể hơn như phân tích cú pháp văn bản của một tweet.Javascript - Cách tốt nhất để cấu trúc các hàm trợ giúp trong NodeJS

Vì vậy, tôi đang cố gắng phân chia mô-đun trong các tệp khác nhau và với một ý tưởng rất rõ ràng về việc mỗi thứ có ý nghĩa gì.

Ví dụ tôi muốn đạt được điều này:

var helpers = require("helpers"); 

var Utils = new helpers.Utils(); 

// working with text 
Utils.text.cleanText("blahblalh"); 
// working with a tweet 
Utils.twitter.parseTweet(tweet); 

Như bạn có thể thấy tôi đang sử dụng Utils cho những thứ khác nhau, bằng cách gọi phương pháp rất cụ thể và phương pháp tiểu.

Tôi đã cố gắng hiểu cách thức hoạt động của kế thừa ở đây nhưng tôi bị mất một chút.

Đây là những gì tôi đang làm (một số mẫu mã thô):

//node_modules/helpers/index.js

var Text = require('./text'); 
var Twitter = require('./twitter'); 

function Utils() { 

} 

Utils.prototype.text = { 
    cleanText: function(text) { 
     Text.cleanText(text); 
    } 
}; 

Utils.prototype.twitter = { 
    parseTweet(tweet) { 
     Twitter.parseTweet(tweet); 
    } 
}; 

//node_modules/helpers/text.js

function Text() { 

} 

Text.prototype.cleanText = function(text) { 
    if (typeof text !== 'undefined') { 
     return text.replace(/(\r\n|\n|\r)/gm,""); 
    } 
    return null; 
}; 

module.exports = Text; 

//node_modules/helpers/twitter.js

function Twitter() { 

}; 

Twitter.prototype.parseTweet = function(data) { 
    return data; 
}; 

module.exports = Twitter 

Đây có phải là cách chính xác không. Tôi có làm điều gì đó sai hoặc có thể làm chậm tốc độ biểu diễn không?

Tôi khá mới với Node và tôi muốn bắt đầu đúng cách.

Trả lời

28

Để làm rõ thế nào tôi hiểu được bài viết của bạn, tôi thấy hai câu hỏi:

  • Làm thế nào để tôi mã cấu trúc/phương pháp trong file, các file mà đại diện cho một chủng loại chức năng tiện ích
  • Làm thế nào để tổ chức các các tập tin phân loại vào một thư viện lớn

phương pháp Cấu trúc bên trong một loại

Thay vì làm cho tất cả các phương pháp chức năng cụ thể của các đối tượng (ví dụ: Twitter hoặc Văn bản), bạn chỉ có thể xuất các hàm trong các tệp có tên sau chúng. Vì có vẻ như bạn đang truyền dữ liệu mà bạn muốn sử dụng, nên không cần phải thực hiện các phương thức hàm của một số lớp rỗng.

Nếu mẫu sử dụng Twitter hoặc Văn bản của bạn thường có các biến lớp bạn muốn giữ trạng thái và bạn muốn khởi tạo các đối tượng Văn bản hoặc Twitter để sử dụng các ví dụ của mình, thì tôi cho rằng đó là thích hợp. Khi tôi thiết lập util libs trong các dự án của tôi, nó thường là một loạt các hàm được export tạo nên một module, chứ không phải là một lớp javascript được xuất khẩu.

Để cung cấp một ví dụ về những gì một tập tin text.js tạo thành từ các chức năng tiện ích dựa trên văn bản có thể trông giống như:

module.exports = { 
    cleanText:function(text) { 
     // clean it and return 
    }, 

    isWithinRange(text, min, max) { 
     // check if text is between min and max length 
    } 
} 

Ngoài ra, bạn có thể làm theo cách này:

exports.cleanText = function(text) { 
    // clean it and return 
} 

exports.isWithinRange = function (text, min, max) { 
    // check if text is between min and max length 
} 

Cấu trúc các tệp danh mục tiện ích để tạo một thư viện tiện ích lớn hơn

Theo như tổ chức các phương pháp tiện ích, exa của Luca mple là tốt đẹp. Tôi đã tổ chức một số tương tự như thế này:

utils-module/ 
    lib/ 
     text.js <-- this is the example file shown above 
     twitter.js 
    test/ 
    index.js 

đâu index.js làm điều gì đó như

var textUtils = require('./lib/text'); 

exports.Text = textUtils; 

Sau đó, khi tôi muốn sử dụng util lib trong nói một số mô hình người dùng trong API nút của tôi, nó là chỉ cần:

/* 
* Dependencies 
*/ 
var textUtils = require('path/to/lib').Text; 

/* 
* Model 
*/ 
function User() {} 

/* 
* Instance Methods 
*/ 
User.prototype.setBio = function(data) { 
    this.bio = textUtils.cleanText(data); 
} 

module.exports = User; 

Hy vọng điều đó sẽ hữu ích. Khi tôi lần đầu tiên được học nó rất hữu ích để xem xét các thư viện phổ biến, được tôn trọng để xem các nhà phát triển node/javascript có kinh nghiệm làm việc nhiều hơn như thế nào. Có rất nhiều cái tốt (và xấu) ngoài kia!

nhất,

Craig

+0

Cảm ơn câu trả lời chi tiết: D – Anonymous

2

Bạn có thể xem ví dụ thư viện utils với lodash.

Lodash là một tiện ích lib như underscorejs. Thư viện này có cấu trúc tập tin vững chắc như của bạn.

Nó chia chức năng theo danh mục. Mỗi thể loại là một thư mục với một tệp index.js bao gồm vào một không gian tên (đối tượng theo nghĩa đen) mỗi chức năng cho danh mục đó!

Lodash/ 
    Objects/ 
     Function1.js 
     Functions2.js 
     .... 
     Index.js 
    Array/ 
     Function1.js 
     ... 
     Index.js 

Sau đó trong mã của bạn, bạn có thể làm điều này:

var objectsUtils = require("lodash/objects"); 
var foreach = require("lodash/array/each"); 

Bạn có thể tạo một cấu trúc hệ thống tập tin tương tự để có sự linh hoạt hơn. Bạn có thể yêu cầu toàn bộ lib, chỉ một vùng tên hoặc một hàm duy nhất.

Điều này là tốt hơn cho hiệu suất, bởi vì bạn chỉ sử dụng những gì bạn cần và có được mức sử dụng bộ nhớ.

1

thư viện Utility "lực lượng" bạn kéo một toàn bộ rất nhiều mã code bạn không nhất thiết cần.

Tôi đã viết một dự án mã nguồn mở có tên là Bit cho phép bạn tạo các thành phần có thể tái sử dụng trong khi làm việc trên dự án của bạn và sau đó sử dụng chúng riêng lẻ trên các kho lưu trữ.

Đây là an example collection of Javascript utility functions trên trung tâm cộng đồng nguồn mở Bit.

Hy vọng điều này sẽ hữu ích.

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