Primero, es necesario instalar Node. Se puede hacer de las siguientes formas:
-
Usando el instalador de la página oficial: https://nodejs.org/en.
Se recomienda instalar la versión LTS (Long Term Support).
-
Usando nvm (Node Version Manager): https://github.com/nvm-sh/nvm.
Es una herramienta que permite tener múltiples versiones de Node instaladas.
También se recomienda instalar una versión LTS.
Luego de tener Node, se necesita un gestor de paquetes. Entre las opciones están:
-
npm: viene por defecto al instalar Node.
-
yarn: se instala con el siguiente comando:
npm install --global yarn
-
pnpm: Se instala con los siguientes comandos:
npm install --global corepack@latest corepack enable pnpm
Se recomienda leer los pasos de instalación por si han cambiado.
Luego de tener Node y un gestor de paquetes, vamos a seguir los siguientes pasos para crear un proyecto que use Node + TS + Jest:
-
Crear carpeta e inicializar proyecto:
mkdir <project_name> cd <project_name> npm init -y
-
Instalar dependencias:
Todas son dependencias de desarrollo
// Dependencias de Typescript npm install -D -E typescript @types/node ts-node-dev tsc-alias tsconfig-paths rimraf // Dependencias para el testing npm install -D -E jest ts-jest @types/jest // Dependencias para configurar el linter del proyecto npm install -D -E eslint prettier eslint-config-prettier eslint-plugin-prettier
-
Iniciar TypeScript
npx tsc --init
Con este comando se va a crear un archivo llamado tsconfig.json.
-
Configurar el tsconfig.json
El archivo generado vendrá con varias configuraciones; por el momento vamos a dejar los siguientes ajustes para que nuestro proyecto funcione.
{ "compilerOptions": { "target": "ES6", "module": "esnext", "outDir": "./dist", "rootDir": "./", "strict": true, "esModuleInterop": true, "skipLibCheck": true }, "include": ["src/**/*", "test/**/*"], "exclude": ["node_modules", "dist"] } -
Configuración de los alias path.
Creamos un archivo llamado tsconfig.paths.json y en él colocamos el siguiente contenido:
{ "compilerOptions": { "baseUrl": "./", "paths": { "@src/*": ["src/*"], "@test/*": ["test/*"] } } }En path podemos configurar todos los alias path que necesitemos.
Luego volvemos al tsconfig.json para incluir los alias path.
{ "extends": "./tsconfig.paths.json", // Agregamos esta linea para incluir los alias path "compilerOptions": { "target": "ES6", "module": "CommonJS", "outDir": "./dist", "rootDir": "./", "strict": true, "esModuleInterop": true, "skipLibCheck": true, "resolveJsonModule": true }, "include": ["src/**/*", "test/**/*"], "exclude": ["node_modules", "dist"] } -
Configuración de Jest
Ejecutamos el siguiente comando para crear el archivo de configuración de Jest:
npx create-jest
Al ejecutarlo, debemos indicar que estamos usando TypeScript; al finalizar, nos va a crear un archivo llamado jest.config.ts con varias opciones que podemos configurar. Con el fin de simplificar el proceso y poder usar los alias path en nuestras pruebas unitarias, vamos a reemplazar el contenido del archivo jest.config.ts por el siguiente:
import type { Config } from "jest"; import { pathsToModuleNameMapper } from "ts-jest"; import fs from "fs"; const pathAlias = JSON.parse( fs.readFileSync("./tsconfig.paths.json", "utf-8") ); const config: Config = { preset: "ts-jest", testEnvironment: "node", moduleNameMapper: pathsToModuleNameMapper( pathAlias.compilerOptions.paths, { prefix: "<rootDir>/", } ), moduleDirectories: ["node_modules", "src", "test"], roots: ["<rootDir>/test"], }; export default config;
-
Configurar los scripts
Ahora vamos a configurar los scripts en el package.json para agilizar varios procesos:
"scripts": { "dev": "tsnd --respawn --clear --project tsconfig.json -r tsconfig-paths/register src/app.ts", "build": "rimraf ./dist && tsc --project tsconfig.prod.json && tsc-alias", "start": "npm run build && node -r tsconfig-paths/register dist/app.js", "test": "jest --config jest.config.ts", "test:watch": "jest --watch" },
-
Crear un tsconfig.json específico para producción.
Creamos un archivo con el siguiente nombre tsconfig.prod.json y agregamos el siguiente contenido:
{ "extends": "./tsconfig.paths.json", "compilerOptions": { "target": "ES6", "module": "esnext", "outDir": "./dist", "rootDir": "./", "strict": true, "esModuleInterop": true, "skipLibCheck": true }, "include": ["src/**/*"], "exclude": ["node_modules", "test/**/*", "dist"] }
Con esto ya tenemos un proyecto con las siguientes características:
- Trabajaremos Node con TypeScript.
- Realizaremos pruebas unitarias con Jest.
- Utilizaremos alias path.