# Creación de una aplicación FrontEnd
Para la creación de una aplicación FrontEnd se utilizará el FrameWork Next.js, el cual amplía la biblioteca React original para proporcionar un framework React extensible y fácil de usar.
Abrimos una consola en el directorio de nuestro proyecto para crearla dentro de este y ejecutamos el siguiente comando:
```ssh
npx create-next-app@latest app-name --typescript --tailwind --app
```
Al ejecutarse este comando, solicitará aprobación para crear la aplicación, respondemos afirmativamente: `y` (yes):
```ssh
Ok to proceed? (y) y
```
Posteriormente realizará algunas preguntas, a todas ellas contestaremos `yes`:
Creamos entonces la aplicación que llamaremos `my-app`
```typescript
√ Which linter would you like to use? » ESLint
√ Would you like your code inside a `src/` directory? ... No / Yes
√ Would you like to use Turbopack? (recommended) ... No / Yes
√ Would you like to customize the import alias (`@/*` by default)? ... No / Yes
√ What import alias would you like configured? ... @/*
Creating a new Next.js app in C:\develop\polite\my-app.
```
Una vez haya concluido el proceso, desplegará el mensaje "Success!..."
```ssh
added 388 packages, and audited 389 packages in 2m
138 packages are looking for funding
run `npm fund` for details
found 0 vulnerabilities
Initialized a git repository.
Success! Created app-test-001 at C:\develop\polite\my-app
```
### Instalación de librerías
Acto seguido instalamos las librerías necesarias en el nuevo directorio:
```typescript
cd my-app
```
Agregamos el preprocesador de estilos SASS y el namejador de estado global de la aplicación:
```typescript
yarn add zustand
```
### Directorios
Dentro del directorio `/src`, creamos los siguientes subdirectorios:
- `components` para alojar los componentes
- `data` para datos estáticos en json
- `interfaces` para las interfaces globales del sistema
- `labels` para los textos que se desplegarán por pantalla
- `store` para creación de stores y hooks para manejo de estado global de la aplicación
- `utils` para librerías y funciones útiles para toda la aplicación
Dentro del subdirectorio `/src/components`, creamos los siguientes subdirectorios:
- `functional` para alojar los componentes funcionales
- `layout` para alojar los componentes de tipo layout
- `ui` para alojar los componentes de tipo UI
Dentro del subdirectorio `/src/store`, creamos los siguientes subdirectorios:
- `hooks` para alojar los hooks que van a interactuar con los stores
- `zustand` para alojar los stores
- `services` pas alojar los servicios de conexión a la api
Adicionalmente la aplicación ya cuenta con directorios previamente creados dentro de `/src` como `app` para alojar las páginas (rutas) de nuestra aplicación.
Dentro de `/src/app`, se deben hacer algunas modificaciones:
- Reemplazar `favicon.ico` por el definitivo de la aplicación
- Reemplazar el contenido de `globals.scss` por [**Global Styles**](https://hackmd.io/@mGoZaVHZQTWgwFlq-J3U0w/HJiOQ7SQR)<br>
- Eliminar directorio /src/app/fonts
- Modificar contenido archivo /src/app/layout.tsx
- Modificar contenido archivo /src/app/page.tsx
/src/app/layout.tsx:
```typescript=
import type { Metadata } from "next";
import "./globals.css";
export const metadata: Metadata = {
title: "Título de la aplicación",
description: "Descripción de la aplicación",
};
export default function RootLayout({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
return (
<html lang="es">
<body>{children}</body>
</html>
);
}
```
/src/app/page.tsx:
```typescript=
export default function Home() {
return <div></div>;
}
```
### Variables de entorno
Lo siguiente es crear un archivo de variables de entorno, este debe llamarse `.env` y debe posicionarse en la raíz del proyecto, dentro de él deben establecerse los valores de estas, algunas pueden ser, por ejemplo, la URL donde se ubica la API y si api-key:
- `NEXT_PUBLIC_API_URL` URL de la api
- `NEXT_PUBLIC_API_KEY` Key de la api
> **NOTA:**
> Los nombres de las variables deben comenzar con el prefijo `NEXT_PUBLIC_` para ser consideradas como parte del FrontEnd.
### package.json
En el archivo `package.json` se mencionan los componentes, librerías y script que necesita la aplicación para funcionar correctamente y de forma completa. En la sección `script` de su contenido, especificaremos el puerto en el cual vamos a requerir que la aplicación funcione, agregamos `-p <N° de puerto>`, en este caso 3002, debe quedar como sigue:
```json
"scripts": {
"dev": "next dev -p 3002",
"build": "next build",
"start": "next start -p 3002",
"lint": "next lint"
}
```
De esta forma, nuestra aplicación para este ejemplo podrá verse localmente en la URL `http://localhost:3002`
### Resultado final
Para verificar que todo está correcto, el proyecto debe tener la siguiente estructura mínima de directorios y archivos:
```ssh
/[main-app]
/app-[name]
/src
/app
favicon.ico
globals.css
layout.tsx
page.tsx
/components
/functional
/layout
/ui
/data
/store
/hooks
/zustand
/services
/interfaces
/utils
.env
.gitignore
Dockerfile
package.json
tsconfig.json
next.config.ts
...
```
Ver los siguientes documentos:
- [**Pages**](https://hackmd.io/@mGoZaVHZQTWgwFlq-J3U0w/HkJHLMrQA)<br>
- [**Components**](https://hackmd.io/@mGoZaVHZQTWgwFlq-J3U0w/SydCepHr1l)<br>
- [**Store**](https://hackmd.io/@mGoZaVHZQTWgwFlq-J3U0w/rkN3MQrQC)<br>
- [**Styles**](https://hackmd.io/@mGoZaVHZQTWgwFlq-J3U0w/HJiOQ7SQR)<br>
- [**Utils**](https://hackmd.io/@mGoZaVHZQTWgwFlq-J3U0w/ByaoQmHQA)<br>