From b30722bf687cee60b180ffd9bb78dfbe65a46f18 Mon Sep 17 00:00:00 2001 From: luis cespedes Date: Tue, 6 May 2025 12:12:00 -0400 Subject: [PATCH] optimizacion y preload de rutas y imagenes --- .dockerignore | 66 +++++++++++++++++ .gitignore | 3 +- .htaccess | 67 ++++++++++++++++++ Dockerfile | 28 ++++++++ angular.json | 34 +++++++-- docker-compose.yml | 12 ++++ nginx.conf | 27 +++++++ package.json | 1 + public/img/footer-logo.webp | Bin 0 -> 9548 bytes public/img/header2.webp | Bin 0 -> 40648 bytes src/app/app.config.ts | 16 ++--- src/app/app.routes.ts | 50 +++++++++---- .../components/footer/footer.component.html | 3 +- src/app/pages/login/login.component.html | 2 +- src/app/pages/login/login.component.scss | 4 +- src/index.html | 3 + 16 files changed, 283 insertions(+), 33 deletions(-) create mode 100644 .dockerignore create mode 100644 .htaccess create mode 100644 Dockerfile create mode 100644 docker-compose.yml create mode 100644 nginx.conf create mode 100644 public/img/footer-logo.webp create mode 100644 public/img/header2.webp diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..ca926ac --- /dev/null +++ b/.dockerignore @@ -0,0 +1,66 @@ +# Dependencias +node_modules +npm-debug.log +yarn-debug.log +yarn-error.log + +# Archivos de compilación +/dist +/tmp +/out-tsc +/bazel-out + +# Archivos de IDE y editores +.idea/ +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace +.vscode/* + +# Archivos del sistema +.DS_Store +Thumbs.db + +# Archivos de entorno (excepto los de ejemplo) +.env +.env.local +.env.development.local +.env.test.local +.env.production.local + +# Archivos de Docker (para evitar recursión) +Dockerfile +Dockerfile.* +docker-compose.yml +docker-compose.*.yml + +# Archivos Git +.git +.gitignore + +# Archivos de test y coverage +/coverage +/tests +*.spec.ts + +# Archivos de configuración +.angular/cache +.sass-cache/ +connect.lock +libpeerconnection.log +testem.log +/typings + +# Archivos de build temporales +.build +.buildinfo +.cache + +# Otros archivos innecesarios +README.md +CHANGELOG.md +*.md +LICENSE \ No newline at end of file diff --git a/.gitignore b/.gitignore index 2aa7e3b..fb2685d 100644 --- a/.gitignore +++ b/.gitignore @@ -42,4 +42,5 @@ testem.log Thumbs.db .sonarlint .vscode -.scannerwork \ No newline at end of file +.scannerwork +package-lock.json \ No newline at end of file diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..7147036 --- /dev/null +++ b/.htaccess @@ -0,0 +1,67 @@ +# Habilitar compresión GZIP + + # Comprimir HTML, CSS, JavaScript, Text, XML y fonts + AddOutputFilterByType DEFLATE application/javascript + AddOutputFilterByType DEFLATE application/rss+xml + AddOutputFilterByType DEFLATE application/vnd.ms-fontobject + AddOutputFilterByType DEFLATE application/x-font + AddOutputFilterByType DEFLATE application/x-font-opentype + AddOutputFilterByType DEFLATE application/x-font-otf + AddOutputFilterByType DEFLATE application/x-font-truetype + AddOutputFilterByType DEFLATE application/x-font-ttf + AddOutputFilterByType DEFLATE application/x-javascript + AddOutputFilterByType DEFLATE application/xhtml+xml + AddOutputFilterByType DEFLATE application/xml + AddOutputFilterByType DEFLATE font/opentype + AddOutputFilterByType DEFLATE font/otf + AddOutputFilterByType DEFLATE font/ttf + AddOutputFilterByType DEFLATE image/svg+xml + AddOutputFilterByType DEFLATE image/x-icon + AddOutputFilterByType DEFLATE text/css + AddOutputFilterByType DEFLATE text/html + AddOutputFilterByType DEFLATE text/javascript + AddOutputFilterByType DEFLATE text/plain + AddOutputFilterByType DEFLATE text/xml + + # Eliminar bugs de navegadores antiguos + BrowserMatch ^Mozilla/4 gzip-only-text/html + BrowserMatch ^Mozilla/4\.0[678] no-gzip + BrowserMatch \bMSIE !no-gzip !gzip-only-text/html + + # No comprimir imágenes (ya están comprimidas) + SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|webp)$ no-gzip + + +# Habilitar caché de navegador + + ExpiresActive On + + # Imágenes + ExpiresByType image/jpeg "access plus 1 year" + ExpiresByType image/gif "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/webp "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + ExpiresByType image/x-icon "access plus 1 year" + + # Video + ExpiresByType video/mp4 "access plus 1 year" + ExpiresByType video/mpeg "access plus 1 year" + + # CSS, JavaScript + ExpiresByType text/css "access plus 1 month" + ExpiresByType text/javascript "access plus 1 month" + ExpiresByType application/javascript "access plus 1 month" + + # Otros + ExpiresByType application/pdf "access plus 1 month" + ExpiresByType application/x-shockwave-flash "access plus 1 month" + + +# Reglas de SPA para Angular +RewriteEngine On +RewriteBase / +RewriteRule ^index\.html$ - [L] +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteRule . /index.html [L] \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..f71eca5 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,28 @@ +FROM node:20.19.1-alpine AS build + +# Establecer directorio de trabajo +WORKDIR /app + +# Copiar archivos de dependencias e instalar +COPY package*.json ./ +RUN npm install + +# Copiar el resto de archivos de la aplicación +COPY . . + +# Compilar la aplicación +RUN npm run build:prod + +# Segunda etapa: Nginx +FROM nginx:latest + +# Copiar la configuración de Nginx +COPY nginx.conf /etc/nginx/nginx.conf + +# Copiar archivos compilados desde la etapa anterior +COPY --from=build /app/dist/cronogramas-primeng/browser /usr/share/nginx/html + +# Exponer puerto +EXPOSE 80 + +# Comando para iniciar Nginx (usa el predeterminado de la imagen) \ No newline at end of file diff --git a/angular.json b/angular.json index 3bc0b7a..67a8205 100644 --- a/angular.json +++ b/angular.json @@ -29,13 +29,30 @@ { "glob": "**/*", "input": "public" + }, + { + "glob": ".htaccess", + "input": ".", + "output": "/" } ], "styles": [ "src/styles.scss", - "node_modules/animate.css/animate.min.css", - "node_modules/primeflex/primeflex.css", - "node_modules/primeicons/primeicons.css" + { + "input": "node_modules/animate.css/animate.min.css", + "bundleName": "animate", + "inject": true + }, + { + "input": "node_modules/primeflex/primeflex.css", + "bundleName": "primeflex", + "inject": true + }, + { + "input": "node_modules/primeicons/primeicons.css", + "bundleName": "primeicons", + "inject": true + } ], "scripts": [], "allowedCommonJsDependencies": [ @@ -45,7 +62,11 @@ }, "configurations": { "production": { - "outputHashing": "all" + "outputHashing": "all", + "optimization": true, + "namedChunks": false, + "aot": true, + "extractLicenses": true }, "development": { "optimization": false, @@ -83,6 +104,11 @@ { "glob": "**/*", "input": "public" + }, + { + "glob": ".htaccess", + "input": ".", + "output": "/" } ], "styles": [ diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..791043d --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,12 @@ +version: '3.8' + +services: + web: + build: + context: . + dockerfile: Dockerfile + ports: + - "80:80" + volumes: + - ./nginx.conf:/etc/nginx/nginx.conf + restart: unless-stopped \ No newline at end of file diff --git a/nginx.conf b/nginx.conf new file mode 100644 index 0000000..bd3cc2b --- /dev/null +++ b/nginx.conf @@ -0,0 +1,27 @@ +# the events block is required +events{} + +http { + # include the default mime.types to map file extensions to MIME types + include /etc/nginx/mime.types; + + server { + # set the root directory for the server (we need to copy our + # application files here) + root /usr/share/nginx/html; + + # set the default index file for the server (Angular generates the + # index.html file for us and it will be in the above directory) + index index.html; + + # specify the configuration for the '/' location + location / { + # try to serve the requested URI. if that fails then try to + # serve the URI with a trailing slash. if that fails, then + # serve the index.html file; this is needed in order to serve + # Angular routes--e.g.,'localhost:8080/customer' will serve + # the index.html file + try_files $uri $uri/ /index.html; + } + } +} diff --git a/package.json b/package.json index bbb7b8c..17cb376 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "ng": "ng", "start": "ng serve", "build": "ng build", + "build:prod": "ng build --configuration production", "watch": "ng build --watch --configuration development", "test": "ng test" }, diff --git a/public/img/footer-logo.webp b/public/img/footer-logo.webp new file mode 100644 index 0000000000000000000000000000000000000000..0b3df458438db00867abf6ddbbc09cb2c170534f GIT binary patch literal 9548 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 literal 0 HcmV?d00001 diff --git a/public/img/header2.webp b/public/img/header2.webp new file mode 100644 index 0000000000000000000000000000000000000000..4328642b07999c70feb333c194aef20baf023f0e GIT binary patch literal 40648 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 NB4OY@DH?oW{TES`s)_&r literal 0 HcmV?d00001 diff --git a/src/app/app.config.ts b/src/app/app.config.ts index 975748c..6d4c25f 100644 --- a/src/app/app.config.ts +++ b/src/app/app.config.ts @@ -1,5 +1,5 @@ import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core'; -import { provideRouter, RouteReuseStrategy } from '@angular/router'; +import { provideRouter, withPreloading, PreloadAllModules } from '@angular/router'; import { provideHttpClient, withFetch, withInterceptors } from '@angular/common/http'; import { routes } from './app.routes'; @@ -7,12 +7,14 @@ import { provideAnimations } from '@angular/platform-browser/animations'; import { providePrimeNG } from 'primeng/config'; import Aura from '@primeng/themes/aura'; import { authInterceptor } from './interceptors/auth.interceptor'; -import { CustomRouteReuseStrategy } from './utils/custom-route-reuse-strategy'; export const appConfig: ApplicationConfig = { providers: [ provideZoneChangeDetection({ eventCoalescing: true }), - provideRouter(routes), + provideRouter( + routes, + withPreloading(PreloadAllModules) + ), provideAnimations(), provideHttpClient(withFetch(), withInterceptors([authInterceptor])), providePrimeNG({ @@ -22,12 +24,6 @@ export const appConfig: ApplicationConfig = { darkModeSelector: false || 'none' } } - }), - // Añadir estrategia de reuso de rutas personalizada para forzar - // recreación de componentes en cada navegación - { - provide: RouteReuseStrategy, - useClass: CustomRouteReuseStrategy - } + }) ] }; diff --git a/src/app/app.routes.ts b/src/app/app.routes.ts index 6c617c1..04c92d5 100644 --- a/src/app/app.routes.ts +++ b/src/app/app.routes.ts @@ -1,12 +1,6 @@ -import { Routes } from '@angular/router'; +import { Routes, PreloadAllModules } from '@angular/router'; import { LoginComponent } from './pages/login/login.component'; import { LayoutComponent } from './components/layout/layout.component'; -import { HomeComponent } from './pages/home/home.component'; -import { ConcesionesComponent } from './pages/concesiones/concesiones.component'; -import { ActualizacionPdComponent } from './pages/actualizacion-pd/actualizacion-pd.component'; -import { AjustePdComponent } from './pages/ajuste-pd/ajuste-pd.component'; -import { ResumenComponent } from './pages/resumen/resumen.component'; -import { UnidadInformacionComponent } from './pages/unidad-informacion/unidad-informacion.component'; import { authGuard } from './guards/auth.guard'; import { NotFoundComponent } from './pages/not-found/not-found.component'; @@ -18,13 +12,41 @@ export const routes: Routes = [ canActivate: [authGuard], children: [ { path: '', redirectTo: 'inicio', pathMatch: 'full' }, - { path: 'inicio', component: HomeComponent, data: { title: 'Inicio' } }, - { path: 'unidad-concesiones', component: ConcesionesComponent, data: { title: 'Unidad de Concesiones' } }, - { path: 'ct-actualizacion', component: ActualizacionPdComponent, data: { title: 'Cronograma temporal por actualización de PD' } }, - { path: 'ct-ajuste', component: AjustePdComponent, data: { title: 'Cronograma temporal por ajuste de PD' } }, - { path: 'resumen', component: ResumenComponent, data: { title: 'Resumen' } }, - { path: 'unidad-informacion', component: UnidadInformacionComponent, data: { title: 'Unidad de Información' } }, - { path: '404', component: NotFoundComponent , data: { title: 'Error 404' } }, + { + path: 'inicio', + loadComponent: () => import('./pages/home/home.component').then(m => m.HomeComponent), + data: { title: 'Inicio' } + }, + { + path: 'unidad-concesiones', + loadComponent: () => import('./pages/concesiones/concesiones.component').then(m => m.ConcesionesComponent), + data: { title: 'Unidad de Concesiones' } + }, + { + path: 'ct-actualizacion', + loadComponent: () => import('./pages/actualizacion-pd/actualizacion-pd.component').then(m => m.ActualizacionPdComponent), + data: { title: 'Cronograma temporal por actualización de PD' } + }, + { + path: 'ct-ajuste', + loadComponent: () => import('./pages/ajuste-pd/ajuste-pd.component').then(m => m.AjustePdComponent), + data: { title: 'Cronograma temporal por ajuste de PD' } + }, + { + path: 'resumen', + loadComponent: () => import('./pages/resumen/resumen.component').then(m => m.ResumenComponent), + data: { title: 'Resumen' } + }, + { + path: 'unidad-informacion', + loadComponent: () => import('./pages/unidad-informacion/unidad-informacion.component').then(m => m.UnidadInformacionComponent), + data: { title: 'Unidad de Información' } + }, + { + path: '404', + component: NotFoundComponent, + data: { title: 'Error 404' } + }, ] }, { path: '**', redirectTo: '404' } diff --git a/src/app/components/footer/footer.component.html b/src/app/components/footer/footer.component.html index 92f5541..e7f39f3 100644 --- a/src/app/components/footer/footer.component.html +++ b/src/app/components/footer/footer.component.html @@ -2,14 +2,13 @@