# Estructura del Proyecto
Comprende cómo está organizado un proyecto Dynamic Framework y las mejores prácticas para mantenerlo escalable y mantenible.
# Estructura Base
Un proyecto típico de Dynamic Framework sigue esta estructura:
mi-proyecto-dynamic/
├── src/ # Código fuente
│ ├── components/ # Componentes reutilizables
│ ├── views/ # Vistas/páginas completas
│ ├── services/ # Lógica de negocio y APIs
│ ├── hooks/ # Custom React hooks
│ ├── utils/ # Utilidades y helpers
│ ├── styles/ # Estilos globales y temas
│ ├── assets/ # Imágenes, fonts, etc.
│ ├── locales/ # Archivos de traducción
│ ├── config/ # Configuración de la app
│ ├── App.jsx # Componente raíz
│ └── index.js # Punto de entrada
├── public/ # Archivos públicos estáticos
│ ├── index.html # Template HTML
│ ├── favicon.ico # Favicon
│ └── manifest.json # PWA manifest
├── tests/ # Tests
│ ├── unit/ # Tests unitarios
│ ├── integration/ # Tests de integración
│ └── e2e/ # Tests end-to-end
├── .modyo/ # Configuración de Modyo
│ └── config.json # Config de despliegue
├── .github/ # GitHub Actions
│ └── workflows/ # CI/CD workflows
├── docs/ # Documentación del proyecto
├── .env.example # Variables de entorno ejemplo
├── .eslintrc.js # Configuración ESLint
├── .prettierrc # Configuración Prettier
├── jest.config.js # Configuración Jest
├── webpack.config.js # Configuración Webpack
├── package.json # Dependencias y scripts
└── README.md # Documentación principal
# Directorios Principales
# /src/components/
Componentes reutilizables de la aplicación:
components/
├── common/ # Componentes genéricos
│ ├── Button/
│ │ ├── Button.jsx
│ │ ├── Button.styles.js
│ │ ├── Button.test.js
│ │ └── index.js
│ ├── Card/
│ └── Modal/
├── forms/ # Componentes de formulario
│ ├── Input/
│ ├── Select/
│ └── DatePicker/
├── layout/ # Componentes de layout
│ ├── Header/
│ ├── Footer/
│ └── Sidebar/
└── business/ # Componentes de negocio
├── AccountCard/
├── TransactionItem/
└── TransferForm/
# /src/views/
Páginas y vistas completas:
views/
├── Dashboard/
│ ├── Dashboard.jsx
│ ├── Dashboard.styles.js
│ ├── Dashboard.test.js
│ └── components/ # Componentes específicos de esta vista
├── Accounts/
├── Transfers/
├── Investments/
└── Settings/
# /src/services/
Lógica de negocio y comunicación con APIs:
services/
├── api/
│ ├── client.js # Cliente HTTP configurado
│ ├── endpoints.js # Definición de endpoints
│ └── interceptors.js # Interceptores de request/response
├── auth/
│ ├── authService.js # Autenticación
│ └── tokenManager.js # Gestión de tokens
├── accounts/
│ └── accountService.js # Servicios de cuentas
└── transactions/
└── transactionService.js
# /src/hooks/
Custom React hooks:
hooks/
├── useAuth.js # Hook de autenticación
├── useApi.js # Hook para llamadas API
├── useAccounts.js # Hook para cuentas
├── useTransactions.js # Hook para transacciones
└── useTheme.js # Hook para tema
# /src/utils/
Funciones de utilidad:
utils/
├── formatters/
│ ├── currency.js # Formateo de moneda
│ ├── date.js # Formateo de fechas
│ └── number.js # Formateo de números
├── validators/
│ ├── account.js # Validación de cuentas
│ └── transfer.js # Validación de transferencias
├── constants/
│ ├── routes.js # Constantes de rutas
│ └── messages.js # Mensajes de la app
└── helpers/
├── storage.js # LocalStorage helpers
└── analytics.js # Analytics helpers
# /src/styles/
Estilos y temas:
styles/
├── base/
│ ├── _reset.scss # Reset CSS
│ ├── _typography.scss # Tipografía
│ └── _variables.scss # Variables globales
├── components/
│ └── _buttons.scss # Estilos de componentes
├── themes/
│ ├── default.js # Tema por defecto
│ ├── dark.js # Tema oscuro
│ └── custom.js # Tema personalizado
└── main.scss # Archivo principal de estilos
# /src/config/
Configuración de la aplicación:
config/
├── app.config.js # Configuración general
├── api.config.js # Configuración de API
├── theme.config.js # Configuración de tema
└── routes.config.js # Configuración de rutas
# Archivos de Configuración
# package.json
{
"name": "mi-proyecto-dynamic",
"version": "1.0.0",
"scripts": {
"start": "webpack serve --mode development",
"build": "webpack --mode production",
"test": "jest",
"lint": "eslint src/",
"format": "prettier --write src/",
"analyze": "webpack-bundle-analyzer",
"modyo:push": "modyo-cli push",
"modyo:preview": "modyo-cli preview"
},
"dependencies": {
"@dynamic-framework/ui-react": "^1.27.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-router-dom": "^6.0.0",
"axios": "^1.0.0"
},
"devDependencies": {
"@modyo/cli": "^3.0.0",
"webpack": "^5.0.0",
"jest": "^29.0.0",
"eslint": "^8.0.0",
"prettier": "^2.0.0"
}
}
# .env.example
# API Configuration
REACT_APP_API_URL=https://api.example.com
REACT_APP_API_KEY=your-api-key
# Modyo Configuration
REACT_APP_MODYO_ACCOUNT=your-account
REACT_APP_MODYO_SITE=your-site
# Feature Flags
REACT_APP_ENABLE_INVESTMENTS=true
REACT_APP_ENABLE_LOANS=false
# Analytics
REACT_APP_GA_ID=UA-XXXXXXXXX
# .modyo/config.json
{
"account": "mi-banco",
"site": "web-banking",
"widget": {
"name": "dynamic-app",
"description": "Aplicación bancaria con Dynamic Framework",
"category": "banking",
"tags": ["react", "dynamic", "banking"]
},
"deploy": {
"environments": {
"development": {
"site": "web-banking-dev",
"variables": {
"API_URL": "https://api-dev.example.com"
}
},
"production": {
"site": "web-banking",
"variables": {
"API_URL": "https://api.example.com"
}
}
}
}
}
# Mejores Prácticas
# 1. Organización de Componentes
Estructura de Componente:
Button/
├── Button.jsx # Componente principal
├── Button.styles.js # Estilos (styled-components o CSS modules)
├── Button.test.js # Tests
├── Button.stories.js # Storybook stories
└── index.js # Export público
index.js:
export { default } from './Button';
export * from './Button';
# 2. Nomenclatura
- Componentes: PascalCase (
AccountCard.jsx
) - Funciones/Hooks: camelCase (
useAuth.js
) - Constantes: UPPER_SNAKE_CASE (
API_ENDPOINTS.js
) - Archivos CSS: kebab-case (
button-styles.scss
)
# 3. Imports Organizados
// 1. Dependencias externas
import React, { useState, useEffect } from 'react';
import { useNavigate } from 'react-router-dom';
import axios from 'axios';
// 2. Componentes de Dynamic Framework
import { Button, Card, Input } from '@dynamic-framework/ui-react';
// 3. Componentes internos
import Header from '@/components/layout/Header';
import AccountCard from '@/components/business/AccountCard';
// 4. Servicios y utilidades
import { accountService } from '@/services/accounts';
import { formatCurrency } from '@/utils/formatters';
// 5. Estilos
import styles from './Dashboard.module.scss';
# 4. Alias de Rutas
Configura alias en webpack para imports más limpios:
// webpack.config.js
resolve: {
alias: {
'@': path.resolve(__dirname, 'src'),
'@components': path.resolve(__dirname, 'src/components'),
'@services': path.resolve(__dirname, 'src/services'),
'@utils': path.resolve(__dirname, 'src/utils'),
}
}
# 5. Separación de Responsabilidades
- Componentes: Solo presentación y estado UI
- Services: Lógica de negocio y APIs
- Hooks: Lógica reutilizable y estado compartido
- Utils: Funciones puras de utilidad
# Escalabilidad
# Para Proyectos Pequeños
Estructura simplificada:
src/
├── components/
├── pages/
├── services/
├── App.jsx
└── index.js
# Para Proyectos Grandes
Estructura por features:
src/
├── features/
│ ├── accounts/
│ │ ├── components/
│ │ ├── services/
│ │ ├── hooks/
│ │ └── index.js
│ ├── transfers/
│ └── investments/
├── shared/
│ ├── components/
│ └── utils/
└── core/
├── auth/
└── api/
# Para Monorepos
Estructura con workspaces:
packages/
├── web-app/
├── mobile-app/
├── shared-components/
├── business-logic/
└── design-system/
# Testing
# Estructura de Tests
tests/
├── unit/
│ ├── components/
│ ├── services/
│ └── utils/
├── integration/
│ ├── flows/
│ └── api/
└── e2e/
├── scenarios/
└── fixtures/
# Convención de Nombres
- Tests unitarios:
Component.test.js
- Tests de integración:
feature.integration.test.js
- Tests E2E:
scenario.e2e.test.js
# Documentación
# Estructura de Docs
docs/
├── getting-started/
│ └── README.md
├── components/
│ └── catalog.md
├── api/
│ └── reference.md
└── architecture/
└── decisions/