Luis Medel

Ficheros .env en Node.js

Uno de los flames más habituales cuando debato con otros programadores sobre dependencias en los proyectos es relativo al gatillo rápido que muchos parecen tener a la hora de añadirlas de manera indiscriminada. En particular, en el mundo Node.js se alcanzan, en mi humilde opinión, cotas realmente absurdas de dependencias con librerías de terceros, tanto directa como indirectamente.

Personalmente suelo alargar bastante la decisión de añadir nuevas dependencias. No es que no quiera utilizar código de terceros a toda costa. Es sólo que prefiero analizar con detenimiento qué necesito y cómo podría implementarlo, en vez de simplemente buscar una librería que lo haga. Si el esfuerzo de implementación es pequeño no compensa añadir una nueva dependencia. Y permíteme que te diga que no veo a nadie hacer este análisis nunca.

Un ejemplo muy claro es el uso de ficheros .env para la gestión de variables de entorno. La mayoría de proyectos Node.js utilizan casi como estándar de facto la librería dotenv (y dotenv-expand para expansión) cuando en realidad lo único que se necesita para ambas cosas es una simple función como esta:

function loadEnv (opts)
{
  const expand = (env, value) => value.trim ()
                                      .replace (/^"([^"]*)"$/, "$1")
                                      .replace (/\$[a-zA-Z_][a-zA-Z0-9_]*/g, m => expand (env, env[m.substr (1)]));

  return fs.readFileSync (opts?.path || ".env", opts?.fs || { encoding:"utf8", flag:"r" })
           .split (/\n|\r/)
           .map (s => /^([^=\s]+)\s*\=(.+)$/.exec (s))
           .reduce ((env,m) => { m && (env[m[1].trim ()] = expand (env, m[2])); return env; }, opts?.env || process.env);
}

No hay más. Esa función, llamada sin parámetros, se encarga de cargar el fichero .env que haya en la ruta actual, expandiendo los valores de las variables si fuera necesario. Me atrevo a decir que cubre el 95% de las necesidades.

Y sí, seguro que ya estás pensando que esas otras librerías que todo el mundo utiliza permiten usos más avanzados, como gestión de distintos .env por entorno y más cosas muy chulas y hexagonales. ¿Realmente necesitas todo eso? Si es así, adelante.

Si por el contrario resulta que tras analizar tu caso de uso descubres que no necesitas tanta parafernalia para cargar un fichero de texto, en mi repo dsenv tienes la función y un par de ejemplos de cómo usarla.

Vale, reconozco que la función tiene algo de code golfing aplicado. Pero eso no quita que, incluso si fuese el doble de extensa, siga siendo una puñetera función.