2015-05-16 2 views
11

Я пытаюсь создать набор utils для моего проекта NodeJS. Эти помощники будут включать: текстовые утилиты (например, подстроку, консольное ведение журнала и т. Д.) И более конкретные помощники, такие как синтаксический анализ текста твита.Javascript - лучший способ структурирования функций помощников в NodeJS

Поэтому я пытаюсь разделить модуль в разных файлах и с очень четким представлением о том, что каждая вещь должна делать.

Например, я хотел бы, чтобы достичь этого:

var helpers = require("helpers"); 

var Utils = new helpers.Utils(); 

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

Как вы можете видеть, я использую Utils для различных вещей, по телефону очень специфические методы и вложенные методы.

Я попытался понять, как наследование работает здесь, но я немного потерялся.

Это то, что я делаю (некоторые грубый пример кода):

//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 

Правильно ли это. Я делаю что-то неправильно или это может замедлить работу и т. Д.?

Я довольно новичок в Узел, и я хочу начать правильно.

ответ

28

Чтобы выяснить, как я понять ваш пост, я вижу два вопроса:

  • Как я структура кода/методы в файлах, файлы, которые представляют собой категорию функций полезности
  • Как организовать что эти категоричные файлы в одну большую библиотеку

методы структуризации внутри категории

Вместо того, чтобы создавать все функции функций конкретных объектов (например, Twitter или Text), вы можете просто экспортировать функции в файлы, названные в их названии. Так как кажется, что вы передаете данные, которые хотите использовать, нет необходимости создавать функции экземпляров экземпляров какого-либо пустого класса.

Если ваши шаблоны использования Twitter или Text обычно имеют переменные класса, которые вы хотите сохранить, и вы хотите создать экземпляр объектов Text или Twitter, чтобы использовать ваши примеры, то я полагаю, что это было бы уместно. Когда я настраиваю использование libs в своих проектах, обычно это куча экспортируемых функций, которые составляют модуль, а не экспортированный класс javascript.

Чтобы привести пример какой text.js файл из текстовых функций полезности может выглядеть следующим образом:

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

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

В качестве альтернативы, вы можете сделать это следующим образом:

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

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

Структурирование файлов категорий полезности для создания более крупной полезной библиотеки

Что касается организации методов утилиты, exa Luca mple приятно. Я организовал некоторые так же, как это:

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

Где index.js делает что-то вроде

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

exports.Text = textUtils; 

Затем, когда я хочу использовать Util Lib, скажем, некоторые модели пользователя в моем узле API, это просто:

/* 
* 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; 

Надеюсь, что это поможет. Когда я впервые узнал, было очень полезно посмотреть на популярные, уважаемые библиотеки, чтобы увидеть, как все более опытные разработчики node/javascript делают что-то. Там так много хороших (и плохих)!

Бест,

Craig

+0

Спасибо за подробный ответ: D – Anonymous

2

Вы можете увидеть пример библиотеки utils с lodash.

Lodash - это утилита lib, как underscorejs. Эта библиотека имеет структуру файла sustem, такую ​​как ваша.

Он делит функции в категориях. Каждая категория - это папка с файлом index.js, который включает в себя пространство имен (буквальный объект), каждый из которых функционирует для этой категории!

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

Тогда в вашем коде вы можете сделать это:

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

Вы можете создать аналогичную структуру файловой системы для того, чтобы иметь больше гибкости. Вы можете потребовать всю библиотеку lib, только одно пространство имен или одну функцию.

Это лучше для производительности, потому что вы используете только то, что вам нужно, и получаете прибыль от использования памяти.

1

библиотеки Utility «сила» вы тянуть целую кучу кода кода вам не обязательно нужно.

Я написал проект с открытым исходным кодом под названием Bit, который позволяет создавать многоразовые компоненты во время работы над вашим проектом, а затем использовать их отдельно в репозиториях.

Здесь an example collection of Javascript utility functions размещен в сети с открытым исходным кодом с открытым исходным кодом.

Надеюсь, это поможет.

Смежные вопросы