Estoy tratando de construir un conjunto de utilidades para mi proyecto NodeJS. Estos ayudantes incluirán: utilidades de texto (como subcadenas, registro de consola, etc.) y ayudantes más específicos, como analizar el texto de un tweet.
Así que estoy tratando de dividir el módulo en diferentes archivos y con una idea muy clara de lo que significa cada cosa.
Por ejemplo, me gustaría lograr esto:
var helpers = require("helpers"); var Utils = new helpers.Utils(); // working with text Utils.text.cleanText("blahblalh"); // working with a tweet Utils.twitter.parseTweet(tweet);Como puede ver, estoy usando Utils para diferentes cosas, llamando a métodos y submétodos muy específicos.
Traté de entender cómo funciona la herencia aquí, pero me perdí un poco.
Esto es lo que estoy haciendo (un código de muestra aproximado):
//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/texto.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¿Es esta una forma correcta? ¿Estoy haciendo algo mal o eso podría ralentizar las actuaciones, etc.?
Para aclarar cómo entiendo tu publicación, veo dos preguntas:
Métodos de estructuración dentro de una categoría
En lugar de hacer que todas las funciones específicas de la categoría sean métodos de objetos (p. ej., Twitter o Text), podría simplemente exportar las funciones en archivos con su nombre. Dado que parece que está pasando los datos que desea usar, no es necesario crear los métodos de instancia de funciones de alguna clase vacía.
Si sus patrones de uso de Twitter o Text generalmente tienen variables de clase en las que desea mantener el estado, y desea instanciar objetos de Text o Twitter para usar sus ejemplos, entonces supongo que sería apropiado. Cuando configuro util libs en mis proyectos, generalmente hay un montón de funciones exportadas que forman un módulo, en lugar de una clase de javascript exportada.
Para proporcionar un ejemplo de cómo se vería un archivo text.js compuesto por funciones de utilidad basadas en texto:
module.exports = { cleanText:function(text) { // clean it and return }, isWithinRange(text, min, max) { // check if text is between min and max length } }Alternativamente, podrías hacerlo de esta manera:
exports.cleanText = function(text) { // clean it and return } exports.isWithinRange = function (text, min, max) { // check if text is between min and max length }Estructuración de archivos de categorías de utilidades para crear una biblioteca de utilidades más grande
En cuanto a la organización de los métodos de utilidad, el ejemplo de Luca es bueno. He organizado algunos de manera similar a esto:
utils-module/ lib/ text.js <-- this is the example file shown above twitter.js test/ index.jsDonde index.js hace algo como
var textUtils = require('./lib/text'); exports.Text = textUtils;Luego, cuando quiero usar util lib, digamos algún modelo de usuario en mi API de nodo, es simplemente:
/* * 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;Espero que ayude. Cuando estaba aprendiendo por primera vez, fue muy útil mirar bibliotecas populares y respetadas para ver cómo estaban haciendo las cosas los desarrolladores de nodos/javascript más experimentados. ¡Hay tantos buenos (y malos) por ahí!
Puede ver un ejemplo de biblioteca de utilidades con lodash.
Lodash es una utilidad lib como underscorejs. Esta biblioteca tiene una estructura de sistema de archivos como la suya.
Divide las funciones en categorías. ¡Cada categoría es una carpeta con un archivo index.js que incluye en un espacio de nombres (objeto literal) cada función para esa categoría!
Lodash/ Objects/ Function1.js Functions2.js .... Index.js Array/ Function1.js ... Index.jsLuego en tu código puedes hacer esto:
var objectsUtils = require("lodash/objects"); var foreach = require("lodash/array/each");Puede crear una estructura de sistema de archivos similar para tener más flexibilidad. Puede requerir toda la biblioteca, solo un espacio de nombres o una sola función.
Esto es mejor para el rendimiento, porque usa solo lo que necesita y tiene una ganancia de uso de memoria.