在NodeJS中构造helper函数的最佳方式

Best way to structure helpers functions in NodeJS

本文关键字:函数 最佳 方式 helper NodeJS      更新时间:2023-09-26

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

因此,我试图将模块划分到不同的文件中,并且非常清楚每件事的含义。

例如,我想实现如下:

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

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

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

  • 我如何在文件中构建代码/方法,文件代表一类实用程序函数
  • 如何将这些分类文件组织成一个更大的库

在一个类别中构造方法

与其将所有类别特定的函数设置为对象(例如Twitter或Text)的方法,不如将函数导出到以其命名的文件中。因为似乎你正在传递你想要使用的数据,所以没有必要使函数实例方法的一些空类。

如果你的Twitter或Text的使用模式通常有你想要保持状态的类变量,并且你想实例化Text或Twitter对象来使用你的示例,那么我认为这将是合适的。当我在我的项目中设置util库时,它通常是一堆导出的函数,组成一个模块,而不是一个导出的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库时,只需:

/*
 * 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开发人员是如何做事情的,这对我很有帮助。有那么多好的(和坏的)!

您可以使用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");

您可以创建一个类似的文件系统结构,以获得更大的灵活性。您可以需要整个库,只需要一个命名空间或单个函数。

这对性能更好,因为您只使用您需要的,并且有内存使用增益。