我正在尝试为我的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很陌生,我想以正确的方式开始。
答案 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,只需要一个命名空间或单个函数。
这对性能更好,因为您只使用所需内容并获得内存使用量。