【问题标题】:Best way to structure helpers functions in NodeJS在 NodeJS 中构造辅助函数的最佳方法
【发布时间】:2015-07-28 05:36:12
【问题描述】:

我正在尝试为我的 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

这是正确的方法吗?我是否做错了什么或者可能会减慢表演等?

【问题讨论】:

    标签: javascript node.js


    【解决方案1】:

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

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

    类别中的结构化方法

    您可以将函数导出到以它们命名的文件中,而不是将所有特定类别的函数都设为对象的方法(例如 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 lib 时,它很简单:

    /*
     * 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 开发人员是如何做事的。那里有很多好的(和坏的)!

    【讨论】:

    • 感谢您的详细回答:D
    • @cpentra1 如何在第二种方法中声明类变量?
    • 感谢@cpentra1 的详细解答。 ++ed.
    • 一个非常好的和干净的方法。谢谢!
    • 对我来说最烦人的是require('.../.../.../path/to/lib'),我还没有找到解决这个问题的好方法。
    【解决方案2】:

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

    Lodash 是一个类似于 underscorejs 的实用程序库。 该库具有与您类似的文件系统结构。

    它将功能划分为类别。每个类别都是一个文件夹,其中包含一个 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");
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-10
      相关资源
      最近更新 更多