Crea una cuenta o inicia sesi贸n

隆Contin煤a aprendiendo sin ning煤n costo! 脷nete y comienza a potenciar tu carrera

Adquiere por un a帽o todos los cursos, escuelas y certificados por un precio especial.

Antes: $249

Currency
$219/a帽o

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Comprar ahora

Termina en:

0D
5H
9M
8S

Estructura de aplicaciones en NestJS

3/23
Recursos

NestJS posee desde el inicio de un proyecto varios directorios y archivos que se generan por defecto al crearlo. Veamos para que te sirve cada uno.

Aplicaciones y carpetas de NestJS

De arriba hacia abajo:

1. Node_modules:

Todo proyecto de Javascript posee este directorio donde se almacenan las librer铆as y dependencias que se descarguen con NPM.

2. SRC:

Directorio principal del proyecto donde encontramos:

  • app.controller.spec.ts: archivo de pruebas unitarias del controlador con el mismo nombre.
  • app.controller.ts: controlador que contiene endpoints a diferentes recursos.
  • app.module.ts: m贸dulo principal de toda la aplicaci贸n NestJS.
  • app.service.ts: servicio consumido por los controladores para determinados prop贸sitos.
  • main.ts: archivo Core de la aplicaci贸n NestJS donde se realizan configuraciones e imports b谩sicos para su funcionamiento.

3. Test:

Directorio de pruebas unitarias y de integraci贸n. NestJS utiliza por defecto Jest para escribir las pruebas.

  • .editorconfig: este archivo no viene por defecto, pero se recomienda crearlo e instalar el plugin con el mismo nombre en el editor. Permite autoformatear los archivos, espacios, indentaci贸n, etc.
  • .eslintrc.js: permite la configuraci贸n de un analizador de c贸digo para detectar tempranamente errores y resolverlos. Requiere instalaci贸n de un plugin en el editor.
  • .gitignore: indicarle a GIT qu茅 archivos/directorios ignorar.
  • .prettierrc: archivo de configuraci贸n para el autoformateo de c贸digo. Requiere instalaci贸n de un plugin en el editor.
  • nest-cli.json: archivo con configuraciones de NestJS. Algunos plugins del framework requieren de configuraciones adicionales en este archivo.
  • package-lock.json: describe las dependencias exactas que se generaron en la instalaci贸n del proyecto.
  • package.json: archivo para el manejo de dependencias, scripts y metadatos relevantes para el proyecto.
  • README.md: archivo markdown para la documentaci贸n del proyecto.
  • tsconfig.build.json: archivo principal para la configuraci贸n de TypeScript.
  • tsconfig.json: extensi贸n con m谩s configuraciones de TypeScript.

Poco a poco ir谩s conociendo la funcionalidad de cada archivo. 隆No te preocupes y continuemos!

Archivo ./editorconfig

# ./editorconfig
# Editor configuration, see https://editorconfig.org
root = true

[*]
charset = utf-8
indent_style = space
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true

[*.ts]
quote_type = single

[*.md]
max_line_length = off
trim_trailing_whitespace = false

Contribuci贸n creada por: Kevin Fiorentino.

Aportes 13

Preguntas 2

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

Archivo ./editorconfig

# Editor configuration, see https://editorconfig.org
root = true

[*]
charset = utf-8
indent_style = space
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true

[*.ts]
quote_type = single

[*.md]
max_line_length = off
trim_trailing_whitespace = false

Algo a resaltar, es que NestJs/CLI te inicializa tambi茅n un repositorio, pero lo hace creando la rama principal como master.
.
Esto puede ser un problema si queremos subir nuestro repositorio a plataformas como GitHub, ya que en ellos la rama principal es main.
.
La soluci贸n es muy sencilla, solo debes hacer commit de los archivos, y despu茅s cambiar el nombre de la rama con el siguiente comando

git branch -m master main

Y listo, podr谩s subir tu proyecto a GitHub sin problema 馃槈

Estructura de archivos de Nest.js:

/
Nest.js trae muchas carpetas y archivos cuya finalidad es configurar todo lo que nuestro proyecto de backend necesitar铆a sin tener que configurarlo nosotros. Entre todos los archivos y carpetas generados, los principales son:
/

  • La carpeta dist donde se encuentra todo el c贸digo que enviaremos a producci贸n.
    /

    /
  • La carpeta src donde crearemos nuestro proyecto backend en s铆.
    /

    /
  • El archivo package.json dentro del cual se encuentran todos los comandos y dependencias que utiliza Nest.js.
    /

    /
  • El archivo tsconfig.json dentro del cual se encuentra toda la configuraci贸n de TypeScript que necesita nuestro proyecto.
    /

crear archivo .editorconfig

Wow si no hubiera visto los 3 cursos anteriores de Typescript estaria muy perdido

Configuraci贸n Manual

Entendiendo como opera el CLI para una generaci贸n limpia de NestJS, de seguro notaron la generaci贸n absurda de archivos que puede que genere mucha distracci贸n.
.
Por ello, les presento una configuraci贸n alternativa que permitir谩 minimizar y dar una vista diferente para nuestro pool de cursos de NestJS.
.

Enlace al 獯 Repositorio GitHub.

.

Instalaci贸n de dependencias

Nota. En mi caso, he preferido pnpm por npm por sentido de performance a medida en que se va escalando un proyecto.

.
NestJS posee como dependencias core aquellas que est谩n citadas en la documentaci贸n como deseables. Sin embargo, deja abierta la configuraci贸n para soportar el transporte de informaci贸n, por ejemplo express.
.
En fin, instalaremos las siguientes:

# pnpm
pnpm init -y
pnpm i @nestjs/{common,core,platform-express} reflect-metadata rxjs
pnpm i -D source-map-support

# npm
npm init -y
npm i @nestjs/{common,core,platform-express} reflect-metadata rxjs
npm i -D source-map-support

Note que se preferir谩 express para la creaci贸n de un servidor REST.

.
Posteriormente, anexamos el script necesario para lanzar NestJS en modo 鈥渨atch鈥 (desarrollo):

{
	"name": "nestjs-project",
	"version": "0.0.0",
	...
	"scripts": {
		"dev": "nest start --watch"
	}
	...
}

.

Estructura de carpetas

Despu茅s de haber instalado y escrito nuestro script para desarrollo, pasamos a configurar nuestros primeros archivos de nuestro servidor. Dicho servidor, tendr谩 la siguiente estructura:

- src
鈹斺攢猥 controllers
|	鈹斺攢猥 app.controller.ts
|
鈹斺攢猥 modules
|	鈹斺攢猥 app.module.ts
|
鈹斺攢猥 services
|	鈹斺攢猥 app.service.ts
|
鈹斺攢猥竚ain.ts

Donde cada archivo ser谩 como est谩 establecido como 鈥淗ello World鈥.

// app.controller.ts
import { Controller, Get } from '@nestjs/common'
import { AppService } from '../services/app.service'

@Controller()
export class AppController {
    constructor(private readonly appService: AppService) {}

    @Get()
    getHello(): string {
        return this.appService.getHello()
    }
}
// app.module.ts
import { Module } from '@nestjs/common'
import { AppController } from '../controllers/app.controller'
import { AppService } from '../services/app.service'

@Module({
    imports: [],
    controllers: [AppController],
    providers: [AppService],
})
export class AppModule {}
// app.service.ts
import { Injectable } from '@nestjs/common'

@Injectable()
export class AppService {
    getHello(): string {
        return 'Hello World 馃'
    }
}
// main.ts
import { NestFactory } from '@nestjs/core'
import { AppModule } from './modules/app.module'

;(async () => {
    const app = await NestFactory.create(AppModule)
    await app.listen(3000)
})()

.

Configuraci贸n de lenguaje

Para este punto, nos faltar铆a configurar la elecci贸n del lenguaje (JavaScript o TypeScript). As铆 como tambi茅n NestJS CLI.
.
Para nuestro proyecto, ser谩 en TypeScript por lo que anexaremos nuestros archivos de TypeScript para desarrollo y compilaci贸n. Por lo que instalaremos nuestras dependencias:

#pnpm
pnpm i -D @types/node ts-node typescript
# npm
npm i -D @types/node ts-node typescript

.
Y configuramos nuestros archivos de la siguiente manera:

// tsconfig.build.json
{
    "extends": "./tsconfig.json",
    "exclude": ["test/**/*.test.ts", "debug/**/*.ts", "./package.json"]
}
// tsconfig.json
{
    "compilerOptions": {
        "target": "ES2021",
        "module": "commonjs",
        "outDir": "./dist",
        "strict": true,
        "esModuleInterop": true,
        "skipLibCheck": true,
        "forceConsistentCasingInFileNames": true,
        "emitDecoratorMetadata": true,
        "experimentalDecorators": true,
        "sourceMap": true,
        "resolveJsonModule": true,
    },
    "include": ["./src/**/*", "test/**/*"]
}

Nota. Si gustas revisar el archivo de configuraci贸n, me he basado en proyectos pasados. Sin embargo, te recomiendo buscar cada elemento en la 馃敆 referencia de documentaci贸n.

.
Finalmente nuestro archivo de configuraci贸n de NestJS nest-cli.json:

{
    "$schema": "https://json.schemastore.org/nest-cli",
    "collection": "@nestjs/schematics",
    "sourceRoot": "src"
}

隆Rock n鈥 Roll! 馃

excelente lo del editor!

Para los que no sepan c贸mo funciona .editorconfig esto es lo que pude notar

Al declarar una funci贸n en VSCode con el archivo .editorconfig sin haber instalado la extensi贸n de EditorConfig tuve lo siguiente:

function name(params:type) {
    // 4 Espacios
}

Obs茅rvese que en donde comienza el c贸digo, VSCODE elige que mi indentaci贸n ser谩 de 4 espacios, adem谩s de que cada que presione la tecla TAB vscode har谩 4 espacios. Esto es porque a pesar de tener el archivo .editorconfig no tengo la extensi贸n requerida, as铆 que no est谩 funcionando

Despu茅s de instalar la extenci贸n de VSCODE declar茅 una funci贸n y obtuve lo siguiente:

function Suma(params:type) {
  // 2 Espacios
}

Ahora la extensi贸n EditorConfig me ayuda a hacer c贸digo con las especificaciones necesarias

Esta propiedad no existe en editorConfig ```
quote_type = single

excelente

Estructura de de la aplicacion:

  • Dependencias del proyecto package.json
"dependencies": {
    "@nestjs/common": "^7.6.15",
    "@nestjs/core": "^7.6.15",
    "@nestjs/platform-express": "^7.6.15",
    "reflect-metadata": "^0.1.13",
    "rimraf": "^3.0.2",
    "rxjs": "^6.6.6"
}
  • el archivo .eslintrc.js tiene la configuracion del linter para que nuestro codigo sea entendible y los demas puedas leer facilmente.
module.exports = {
  parser: '@typescript-eslint/parser',
  parserOptions: {
    project: 'tsconfig.json',
    sourceType: 'module',
  },
  plugins: ['@typescript-eslint/eslint-plugin'],
  extends: [
    'plugin:@typescript-eslint/recommended',
    'plugin:prettier/recommended',
  ],
  root: true,
  env: {
    node: true,
    jest: true,
  },
  ignorePatterns: ['.eslintrc.js'],
  rules: {
    '@typescript-eslint/interface-name-prefix': 'off',
    '@typescript-eslint/explicit-function-return-type': 'off',
    '@typescript-eslint/explicit-module-boundary-types': 'off',
    '@typescript-eslint/no-explicit-any': 'off',
  },
};
  • el archivo nest-cli.json tiene la forma que ejecuta el cli de nest nuestro proyecto. No se suele editar mucho, solo para unos plugins en particular.
{
  "collection": "@nestjs/schematics",
  "sourceRoot": "src"
}
  • Crea un README.md sencillo
  • tsconfig.json viene con la config adecuada para que transpile el codigo de ts a js
{
  "compilerOptions": {
    "module": "commonjs",
    "declaration": true,
    "removeComments": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "allowSyntheticDefaultImports": true,
    "target": "es2017",
    "sourceMap": true,
    "outDir": "./dist",
    "baseUrl": "./",
    "incremental": true
  }
}
  • La carpeta mas importante src donde vamos a trabajar, creando servicios, clases, componentes, etc
  • .editorconfig pone la config para que todos manejemos el mismo estandar sin importar el editor que usemos.
# Editor configuration, see https://editorconfig.org
root = true

[*]
charset = utf-8
indent_style = space
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true

[*.ts]
quote_type = single

[*.md]
max_line_length = off
trim_trailing_whitespace = false

Excelente.