Javascript - 在NodeJS中构建助手函数的最佳方法

时间:2015-05-16 09:29:43

标签: javascript node.js

我正在尝试为我的NodeJS项目构建一组utils。 这些帮助程序将包括:text utils(如子字符串,控制台日志记录等),以及更具体的帮助程序,如解析推文的文本。

所以我试图将模块划分为不同的文件,并清楚地知道每件事情的意图。

例如,我想实现这个目标:

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 /助手/ 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 /助手/ 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 /助手/ twitter.js

function Twitter() {

};

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

module.exports = Twitter

这是正确的方法吗?我做错了什么还是会减慢表演等等?

我对Node很陌生,我想以正确的方式开始。

2 个答案:

答案 0 :(得分:52)

为了澄清我对你的帖子的理解,我看到两个问题:

  • 如何在文件中构建代码/方法,代表一类实用功能的文件
  • 如何将这些分类文件整理到一个更大的库中

在类别中构建方法

您可以将函数导出到以它们命名的文件中,而不是制作对象的所有类别特定函数方法(例如Twitter或Text)。由于您似乎传递了要使用的数据,因此无需使用某些空类的函数实例方法。

如果您的Twitter或Text的使用模式通常具有您希望保持状态的类变量,并且您希望实例化Text或Twitter对象以使用您的示例,那么我认为这是合适的。当我在我的项目中设置util 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;

然后当我想在我的节点API中使用util lib说一些User模型时,它只是:

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

希望有所帮助。当我第一次学习时,查看流行的,备受推崇的库是非常有帮助的,看看更有经验的节点/ javascript开发者是如何做的。那里有很多好的(和坏的)!

最佳,

克雷格

答案 1 :(得分:4)

您可以使用lodash查看utils库示例。

Lodash是一个类似于下划线的实用程序库。 这个库有像你的文件一样的文件结构。

它按类别划分功能。每个类别都是一个带有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,只需要一个命名空间或单个函数。

这对性能更好,因为您只使用所需内容并获得内存使用量。