Javascript – 在NodeJS中构build助手函数的最佳方式
我正在尝试为我的NodeJS项目build立一套utils。 这些助手将包括:文本使用(如子串,控制台日志等),以及更多具体的助手,如parsing推文的文本。
所以我试图把模块分成不同的文件,并且清楚地知道每个东西是什么意思。
例如,我想实现这一点:
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来处理不同的事情,通过调用非常具体的方法和子方法。
我试图理解inheritance是如何在这里工作的,但是我有点迷茫。
这就是我正在做的(一些粗略的示例代码):
//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很新,我想以正确的方式开始。
为了澄清我对你的post的理解,我看到两个问题:
- 如何构造文件中的代码/方法,代表一类实用函数的文件
- 如何将这些分类文件组织到一个更大的库中
在一个类别内构build方法
而不是制作对象的所有特定于类别的函数方法(例如Twitter或Text),您可以将函数导出到以它们命名的文件中。 由于看起来你正在传递你想要使用的数据,所以没有必要为一些空类创build函数实例方法。
如果您的Twitter或文本的使用模式通常有你想保持状态的类variables,并且你想要实例化文本或Twitter对象来使用你的例子,那么我想这是适当的。 当我在我的项目中安装util lib时,它通常是一堆组成模块的导出函数,而不是导出的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 }
构build实用程序类别文件以创build更大的实用程序库
就组织效用方法而言,卢卡的例子很好。 我已经组织了一些类似的这样的:
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;
希望有所帮助。 当我第一次学习的时候,看看stream行的,受人尊敬的图书馆是非常有帮助的,看看有多less有经验的node / javascript开发者在做什么。 那里有那么多好(坏)的!
最好,
克雷格
你可以用lodash看到一个utils库的例子。
Lodash是一个像underscorejs这样的工具库。 这个库有像你一样的文件结构。
它将function分类。 每个类别都是一个带有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");
您可以创build一个类似的文件系统结构以获得更大的灵活性。 您可以要求整个库,只有一个命名空间或一个函数。
这对性能更好,因为您只使用您所需的内存使用增益。
实用程序库“强制”你拉一大堆你不一定需要的代码。
我编写了一个名为Bit的开源项目,它可以让您在处理项目时创build可重用的组件,然后在整个存储库中单独使用它们。
以下是Bit开源社区中心上Javascript实用函数的示例集合 。
希望这可以帮助。