Configurando un proyecto en Node

Archivada en Desarrollo Web

Configurando un proyecto en Node

Serie “Programación Funcional”

Este es el artículo número 2 de la serie “Programación Funcional”:

  1. Transparencia Referencial
  2. Configurando un proyecto en Node
  3. Funciones de primer orden

Ahora que estamos iniciando con Node.js es importante definir algunas cosas que afectaran el desarrollo del proyecto, por ejemplo, el uso de funciones de flecha (que se llaman Fat Arrow) de ES6 como base para el estilo de programación funcional.

Configuración inicial

La configuración inicial es muy fácil porque el programa npm nos lleva de la mano.

Lo primero que tenemos que hacer es crear el directorio en el que reside nuestro proyecto. Como se me acabaron las ideas y estoy usando otras combinaciones para el Cuadro de Mando Integral, en esta ocasión, el proyecto se llama cerebro.

$ md cerebro && cd cerebro

En este directorio vamos a crear el archivo de configuración, solo tenemos que ejecutar la siguiente orden:

$ npm init

…y contestar el sencillo cuestionario que genera al final un archivo package.json. Para este proyecto, se ve así:

{
  "name": "cerebro",
  "version": "0.1.0",
  "description": "El nuevo servidor del SGC",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/SGC-Tlaxcala/cerebro.git"
  },
  "keywords": [
    "node",
    "javascript",
    "express",
    "mongodb"
  ],
  "author": "Javier Sanchez Toledano <js.toledano@me.com>",
  "license": "MIT",
  "bugs": {
    "url": "https://github.com/SGC-Tlaxcala/cerebro/issues"
  },
  "homepage": "https://github.com/SGC-Tlaxcala/cerebro#readme"
}

Es un archivo json, que tiene una sintaxis muy estricta y es como un diccionario. Las claves son bastante explícitas y describen el proyecto con claridad.

Cómo agregar módulos o librerías

Node.js cuenta con un gestor de paquetes, llamado npm, que funciona de forma muy parecida a apt o pip1 que instala los módulos y librerías que necesita un proyecto junto con todas sus dependencias. También hay un programa que le hace competencia llamado Yarn que es muy rápido y es el que vamos a usar en este proyecto.

Para instalar yarn usaremos Homebrew en mac OSX; apt en Ubuntu o Debian o el gestor de paquetes de tu sistema operativo.

$ brew install yarn

Ahora bien, hay dos tipos de dependencias en un proyecto. Las dependencias del proyecto en si y las que se usan solo en desarrollo. Las dependencias que vamos a agregar a continuación son de este segundo tipo, solo para desarrollo, por lo tanto, al instalarlas vamos a indicar su tipo con la marca --dev:

$ yarn add --dev babel-cli babel-preset-es2015

El comando anterior descarga Babel, que es un compilador de JavaScript. Traduce el código ECMAScript 6 que vamos a usar este proyecto a la versión ECMAScript 2015 que es la más común. De esta manera usaremos la versión más moderna del lenguaje y nos aseguramos que funcionará correctamente en cualquier parte.

Este comando modifica nuestro archivo packages.json de modo que cuando llevemos el código fuente a otra máquina solo escribiremos yarn y tendremos el mismo entorno en todos lados. Nuestro archivo se ve así.

{
  ...
  ,
  "devDependencies": {
    "babel-cli": "^6.24.1",
    "babel-preset-es2015": "^6.24.1"
  }
}

Configuración rápida de Babel

Babel es un compilador compuestísimo y complejo. Lo mejor es consultar su documentación. Pero para este proyecto queremos que de forma predeterminada produzca código compatible con ES2015, por lo que vamos a crear un archivo llamado .babelrc que usará Babel para su configuración automática.

{
  "presets": ["es2015"]
}

Para asegurar el funcionamiento de Babel, vamos a crear un pequeño guión en nuestro archivo packages.json que haga la compilación del código.

Vamos a agregar en la clave "scripts" una entrada llamada start, que compile nuestro archivo principal.

{
  ...
   "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "babel-node src/index.js"
  },
  ...
}

Ahora, vamos a probar el funcionamiento del compilador.

Primero, vamos a crear un directorio llamado src/lib donde crearemos un archivo utilidades.js en el que iremos colocando algunas funciones de ayuda. Por el momento, solo una:

export const consola = (mensaje) => console.log(mensaje)

Esta función que usa la sintaxis de flecha, solo es un sinónimo de console.log().

Ahora crearemos en el directorio src el archivo index.js, en el que importamos nuestra función y mostramos un mensaje.

import { consola } from './lib/utilidades.js'

consola('Hola mundo')

Si ejecutamos este archivo con node vamos a obtener un error:

$ node src/index.js                                                                      
/Volumes/datos/Proyectos/cerebro/src/index.js:1
(function (exports, require, module, __filename, __dirname) { import { consola } from 'lib/utilidades'
                                                              ^^^^^^
SyntaxError: Unexpected token import

Pero si ejecutamos el script run que tenemos en packages.json nuestra salida es la correcta.

$ npm run start

> cerebro@0.1.0 start /Volumes/datos/Proyectos/cerebro
> babel-node src/index.js

Hola mundo

Una vez que hemos verificado el funcionamiento correcto de nuestro entorno, podemos seguir adelante.


  1. La verdad, funciona mejor que pip

Javier Sanchez Toledano

Soy programador en Django+Python y WordPress. Auditor líder certificado en la norma ISO 9001:2008. Fotógrafo aficionado.
Redes Sociales:

Tlaxcala, México

Comentarios