GenericSuite para ReactJS

GenericSuite (versión frontend) cuenta con un editor CRUD personalizable, generador de menús, interfaz de inicio de sesión, comunicación segura con la API y una batería de herramientas para acelerar tu proceso de desarrollo.
Características
- Editor CRUD personalizable: código CRUD básico (Crear-Leer-Actualizar-Eliminar) que puede parametrizarse y ampliarse mediante archivos de configuración JSON. No es necesario reescribir el código para cada editor de tablas.
- Menú personalizable: el menú y los endpoints pueden parametrizarse y ampliarse mediante archivos de configuración JSON en el lado del backend. La API suministrará la estructura del menú y la verificación de seguridad basada en el grupo de seguridad del usuario, y GenericSuite dibujará el menú y las opciones disponibles.
- Interfaz de inicio de sesión personalizable: adapte fácilmente la página de inicio de sesión para que coincida con la identidad de su marca con el logotipo de la App.
- Scripts de desarrollo y producción: comandos rápidos para iniciar el desarrollo o construir su aplicación para entornos de QA, staging y producción en AWS.
- Pruebas con Jest: Viene preconfigurado con Jest para ejecutar pruebas, incluyendo una prueba inicial para el componente
<App />.
El compañero perfecto para esta solución de frontend es la versión de backend de The GenericSuite.
Hay una versión de esta biblioteca con características de IA: The GenericSuite AI.
Pre-requisitos
Necesitas instalar estas herramientas:
- Versión de Node 20+, instalada vía NVM (Node Package Manager) o instalación de NPM y Node
- Git
- Make: Mac | Windows
Getting Started
Para empezar con GenericSuite, sigue estos pasos:
Crear los repositorios de Git
Crea los repositorios en tu plataforma de Git favorita (Github, Gitlab, Bitbucket).
Un repositorio es para la App frontend y el otro para las configuraciones (archivos JSON de configuración) que se compartirán entre los repos y repos backend como un submódulo de Git.
Una vez creados, abre una ventana de Terminal y cambia al directorio raíz de tus repos.
Clona los repos.
Ej.: para un repositorio llamado exampleapp_frontend creado en Github:
git clone https://github.com/tomkat-cr/exampleapp_frontend.git
Y para el repositorio de configuraciones llamado exampleapp_configs creado en Github:
git clone https://github.com/tomkat-cr/exampleapp_configs.git
Build tools
Genericsuite admite las siguientes herramientas de build:
-
Vite
Vite es una herramienta de construcción que busca proporcionar una experiencia de desarrollo más rápida y liviana para proyectos web modernos. Para más información consulta la documentación de Vite. -
Webpack
En su núcleo, Webpack es un empaquetador estático de módulos para aplicaciones modernas de JavaScript. Para más información consulta la documentación de Webpack. -
Create React App
Create React App (CRA) es una herramienta que permite crear aplicaciones React. Su desarrollo y mantenimiento están abandonados, por lo que se recomienda usar "Vite" o "Webpack". Para más información consulta la documentación de Create React App. -
React-app-rewired
React-app-rewired es una alternativa al Create React App por defecto. Recomendamos usar "Vite" o "Webpack" porque hoy en día se mantiene de forma “ligera” en su mayoría por la comunidad. Para más información consulta la documentación de react-app-rewired.
Iniciar tu proyecto
Crea la App ReactJS. Por ejemplo, exampleapp_frontend:
- Vite
npm create vite@latest exampleapp_frontend -- --template react
Automáticamente realiza el npm init y git init, añade las dependencias de ReactJS y crea una estructura de proyecto ReactJS por defecto.
- Webpack
npm create webpack@latest exampleapp_frontend -- --template react
Automáticamente realiza el npm init y git init, añade las dependencias de ReactJS y crea una estructura de proyecto ReactJS por defecto.
- Create React App
npx create-react-app exampleapp_frontend
NOTA: Consulta la documentación aquí para alternativas de CRA (create-react-app).
- React-app-rewired
Cambia al directorio de desarrollo local del frontend.
cd exampleapp_frontend
CRA (create-react-app) está desactualizado, por lo que usamos react-app-rewired para personalizar la configuración de CRA sin necesidad de expulsarla:
npm install --save-dev react-app-rewired
Instalar el paquete GenericSuite
npm install genericsuite
Instalar dependencias de desarrollo adicionales
npm install --save-dev \
@babel/cli \
@babel/core \
@babel/plugin-transform-class-properties \
@babel/plugin-proposal-private-property-in-object \
@babel/plugin-syntax-jsx \
@babel/preset-env \
@babel/preset-react \
@babel/preset-stage-0 \
@babel/preset-typescript \
@testing-library/jest-dom \
@testing-library/react \
@testing-library/user-event \
@types/jest \
@types/react \
babel-jest \
babel-loader \
babel-plugin-css-modules-transform \
css-loader \
file-loader \
interpolate-html-plugin \
jest \
jest-environment-jsdom \
path \
postcss \
postcss-loader \
react-test-renderer \
style-loader \
tailwindcss \
url-loader \
whatwg-fetch
Desinstalar dependencias no requeridas
Desinstalar dependencias instaladas por CRA e incluidas en la biblioteca GenericSuite:
npm uninstall react react-dom react-scripts web-vitals
Instalar las herramientas de construcción por separado
Si ya tienes tu proyecto inicializado, por ejemplo con CRA, puedes instalar por separado las herramientas de construcción alternativas:
- Vite
npm install --save-dev vite @vitejs/plugin-react
- Webpack
npm install --save-dev webpack webpack-cli webpack-dev-server html-webpack-plugin interpolate-html-plugin
Preparar los Archivos de Configuración
Copia la plantilla de archivo .env.example desde node_modules/genericsuite a tu archivo .env:
cp node_modules/genericsuite/.env.example .env`
Y configura las variables según tus necesidades:
-
Asigna
REACT_APP_APP_NAMEcon el nombre de tu App. -
Asigna
API_VERSIONcon la versión de la API. Por defecto es "v1". -
Asigna
APP_LOCAL_DOMAIN_NAMEcon el dominio del API del backend en el entorno de desarrollo local. Por ejemplo app.ejemploapp.local o localhost.
Por defecto es app.${REACT_APP_APP_NAME}.local (el REACT_APP_APP_NAME se convertirá a minúsculas). -
Asigna
FRONTEND_LOCAL_PORTcon el número de puerto del frontend en desarrollo local. Por defecto es 3000. -
Asigna
BACKEND_LOCAL_PORTcon el puerto del backend API en desarrollo local. Por defecto es 5001. -
Asigna
APP_API_URL_QA,APP_API_URL_STAGING,APP_API_URL_PRODyAPP_API_URL_DEMOcon los nombres de dominio públicos correspondientes del backend API para los entornos de tu App. -
Asigna
APP_FE_URL_QA,APP_FE_URL_STAGING,APP_FE_URL_PRODyAPP_FE_URL_DEMOcon los nombres de dominio públicos correspondientes del frontend para los entornos de tu App. -
Asigna
REACT_APP_URI_PREFIXcon el prefijo de URI de la App. Esto se usará en todos los entornos después del nombre de dominio. Por ejemplo, https://app.ejemploapp.com/ejemplo_frontend -
Configura tu
RUN_BUNDLERdeseado. Las opciones disponibles son "vite", "webpack" y "react-scripts". Por defecto es "vite". -
Configura
RUN_PROTOCOLcon el protocolo para tu entorno de desarrollo local. Las opciones disponibles son "http" y "https". Por defecto es "" lo que significa que el usuario debe configurar manualmente el protocolo cuando inicie el entorno de desarrollo local. -
Configura
BACKEND_PATHcon la ruta de tu repositorio local de desarrollo del backend. -
Configura
GIT_SUBMODULE_LOCAL_PATH_FRONTENDyGIT_SUBMODULE_URLcon los parámetros de los archivos JSON para establecer un lugar de configuración común tanto para el frontend como para el backend (utilizado por add_github_submodules.sh).
Para ver archivos de ejemplo, consulta: Guía de Configuración de Generic Suite -
Configura los parámetros
AWS_*con tus datos de AWS (utilizados por aws_deploy_to_s3.sh y change_env_be_endpoint.sh). Necesitarás una cuenta de AWS.
Para más información, consulta los comentarios de cada variable en el archivo .env.example.
Otros parámetros
REACT_APP_X_TOKEN=1para usar 'x-access-tokens' en lugar de 'Authorization: Bearer'. Por defecto es "0"
Preparar el Makefile
Copia la plantilla de Makefile desde node_modules/genericsuite:
cp node_modules/genericsuite/Makefile ./Makefile
Cambiar Scripts en Package.json
Abre el package.json:
vi ./package.json
# o
# code ./package.json
Si quieres alojar tu frontend en github.io, añade el parámetro homepage:
"homepage": "https://your-github-username.github.io/your-github-repository/",
NOTA: reemplaza `your-github-username` y `your-github-repository` por los tuyos.
Añade los siguientes scripts:
"scripts": {
"start": "node server.js",
"start-build": "./node_modules/react-app-rewired/bin/react-app-rewired.js build && node server.js",
"start-debug": "ls -lah && node server.js",
"start-dev": "react-app-rewired start",
"start-dev-webpack": "npx webpack-dev-server --config webpack.config.js",
"build-prod": "webpack --mode production",
"build-dev": "react-app-rewired build",
"build": "react-app-rewired build",
"eject-dev": "react-scripts eject",
"test-dev": "react-app-rewired test",
"test": "jest",
"predeploy": "npm run build",
"deploy": "gh-pages -d build"
},
Estructura de la aplicación
Esta es una estructura de repositorio de desarrollo de la App sugerida:
.
├── .babelrc
├── .env
├── .env.example
├── .gitignore
├── CHANGELOG.md
├── index.html
├── LICENSE
├── Makefile
├── README.md
├── babel.config.js
├── config-overrides.js
├── jest.config.cjs
├── package-lock.json
├── package.json
├── public
├── server.js
├── src
│ ├── components
│ │ ├── About
│ │ │ └── About.jsx
│ │ ├── App
│ │ │ ├── App.jsx
│ │ │ └── App.test.tsx
│ │ ├── HomePage
│ │ │ ├── HomePage.jsx
│ │ ├── ExampleMenu
│ │ │ ├── ExampleMainElement.jsx
│ │ │ └── ExampleChildElement.jsx
│ ├── constants
│ │ └── app_constants.jsx
│ ├── images
│ │ ├── app_logo_circle.svg
│ │ └── madeby_logo_square.svg
│ ├── configs
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── backend
│ │ │ ├── app_main_menu.json
│ │ │ ├── endpoints.json
│ │ │ ├── general_config.json
│ │ │ ├── example_main_element.json
│ │ │ └── example_child_element.json
│ │ └── frontend
│ │ ├── app_constants.json
│ │ ├── general_constants.json
│ │ ├── users_profile.json
│ │ ├── example_main_element.json
│ │ └── example_child_element.json
│ ├── d.ts
│ ├── index.jsx
│ ├── input.css
│ └── setupTests.js
├── tailwind.config.js
├── tsconfig.json
├── version.txt
├── vite.config.mjs
└── webpack.config.js
Configurar el proyecto
En el directorio del proyecto:
-
.babelrc(ejemplo) -
babel.config.js(ejemplo)
Configuración del transpiler Babel. Consulta la documentación aquí. -
CHANGELOG(ejemplo)
Documentación de cambios para este proyecto. -
config-overrides.js(ejemplo)
Configuración de React-app-rewired. Para más información consulta la documentación de react-app-rewired. -
jest.config.cjs(ejemplo)
Configuración de pruebas JEST. -
server.js(ejemplo)
Servidor Node, para probar y depurar tu App en un entorno similar a producción. -
tailwind.config.js
Instala e inicializa Tailwind con instrucciones aquí.
Para configuración adicional de Tailwind consulta la documentación aquí.
Configuración sugerida de Tailwind:
const { relative } = require('path');
/** @type {import('tailwindcss').Config} */
module.exports = {
darkMode: 'selector',
content: {
relative: true,
files: [
"./node_modules/genericsuite/src/lib/**/*.{html,js,jsx}",
"./src/lib/components/**/*.{html,js,jsx}",
"./src/lib/constants/**/*.{html,js,jsx}",
.
.
"./src/index.{tsx,jsx,cjs}",
'./public/index.html',
],
},
theme: {
extend: {},
},
plugins: [
],
}
vite.config.mjs(ejemplo)
Configuración de Vite. Para más información consulta la documentación de Vite.
IMPORTANTE: si tienes un archivo vite.config.js, cámbialo a vite.config.mjs. Si no lo haces, Vite no funcionará y dará errores como:
ERROR: [plugin: externalize-deps] Failed to resolve "@tailwindcss/vite". This package is ESM only but it was tried to load by `require`.
-
webpack.config.js(ejemplo)
Para configurar Webpack como alternativa a CRA /react-app-rewired.
IMPORTANTE: Asegúrate de reemplazarentry: './src/index.tsx'porentry: './src/index.jsx'.
Consulta la documentación aquí.
-
tsconfig.json
Para configurar TypeScript. p. ej.
{
"compilerOptions": {
"outDir": "./dist",
"module": "ESNext",
"moduleResolution": "node",
"target": "es5",
"lib": [
"es6",
"dom"
],
"sourceMap": true,
"allowJs": true,
"checkJs": false,
"jsx": "react",
"baseUrl": "./src",
"rootDirs": [
"src"
],
"resolveJsonModule": true,
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"allowSyntheticDefaultImports": true,
"strict": true,
"skipLibCheck": true,
"declaration": true,
"declarationDir": "types",
"emitDeclarationOnly": true,
"paths": {
"src/*": ["./src/*"],
}
},
"include": [
"src/**/*",
]
}
Personalizar index.html
Opción 1
Si no tienes un public/index.html personalizado (solo el predeterminado creado por CRA):
Crea el archivo public/index.html:
vi public/index.html
Copiar y pegar este contenido:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="theme-color" content="#000000" />
<meta
name="description"
content="Web site created using create-react-app"
/>
<link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
<!-- Tailwind -->
<link href="%PUBLIC_URL%/output.css" rel="stylesheet">
<!--
manifest.json provides metadata used when your web app is installed on a
user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
-->
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
<!--
Notice the use of %PUBLIC_URL% in the tags above.
It will be replaced with the URL of the `public` folder during the build.
Only files inside the `public` folder can be referenced from the HTML.
Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
work correctly both with client-side routing and a non-root public URL.
Learn how to configure a non-root public URL by running `npm run build`.
-->
<title>exampleapp.com</title>
<style>
a { cursor: pointer; }
</style>
<base href="/">
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div>
<!--
This HTML file is a template.
If you open it directly in the browser, you will see an empty page.
You can add webfonts, meta tags, or analytics to this file.
The build step will place the bundled scripts into the <body> tag.
To begin the development, run `npm start` or `yarn start`.
To create a production bundle, use `npm run build` or `yarn build`.
-->
</body>
</html>
Opción 2
Si ya tienes un archivo public/index.html personalizado:
Edita el archivo public/index.html:
vi public/index.html
Asegúrate de añadir %PUBLIC_URL% a estas líneas:
<link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
<link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
Después de esta línea:
<link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
... añade esta línea:
<link href="%PUBLIC_URL%/output.css" rel="stylesheet">
Elimina el pie de página y los créditos:
<!-- credits -->
<div class="text-center">
<p>
<a href="https://exampleapp.com" target="_blank" rel="noreferrer">exampleapp.com</a>
</p>
</div>
Paso final para cualquier opción
Finalmente ejecuta este comando para crear el archivo src/output.css:
npx @tailwindcss/cli -i ./src/input.css -o ./public/output.css
Y copia el archivo generado al directorio public:
cp src/output.css public/
Para mantener actualizado el archivo src/output.css, durante el ciclo de desarrollo abre una nueva terminal y ejecuta:
make tailwind
Ejemplos de código y archivos de configuración JSON
La configuración principal del menú, endpoints de la API y el editor CRUD se definen en los archivos de configuración JSON.
Puedes encontrar ejemplos sobre configuraciones y cómo codificar una App en la Guía de Creación y Configuración de GenericSuite.
Uso
Realizar la primera compilación
make build
Iniciar el servidor de desarrollo
Para iniciar el servidor de desarrollo:
make run
Despliegue para QA
Consulta la Guía de Despliegue para más detalles.