Javascript - лучший способ структурирования функций помощников в NodeJS

Я пытаюсь создать набор utils для моего проекта 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

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

Я новичок в Node, и я хочу начать правильно.

Ответы

Ответ 1

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

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

Методы структурирования в категории

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

Если ваши шаблоны использования 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
}

Структурирование файлов категорий служебных программ для создания большей библиотеки утилиты

Что касается организации методов утилиты, то пример Luca хорош. Я организовал несколько аналогично:

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;

Затем, когда я хочу использовать утилиту lib, скажу некоторую модель User в моем 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

Ответ 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, только одно пространство имен или одну функцию.

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