1 of 60

Deja de repetir código en tus aplicaciones, ¡Monorepos al rescate!

Alejandro Ñáñez Ortiz, Frontend Engineer @Zapier

2 of 60

@alejandronanez

  • Frontend engineer @ Zapier
  • 4+ años trabajando con React
  • OSS
  • Co organizador React Medellín
  • Interesado en: buenas prácticas, performance y PWAs.

3 of 60

https://alejandro.dev

4 of 60

El común denominador

5 of 60

Un proyecto de frontend en Github

proyecto/frontend

6 of 60

Aplicación web

7 of 60

El frontend en detalle

8 of 60

Componentes de React (UI)

Componentes con estado

Componentes sin estado

9 of 60

Redux

Redux Store

Action creators

Selectors

Reducers

10 of 60

Utils, API wrappers, Middleware, hooks

API

Data transformation

Redux Middlewares

Hooks

11 of 60

Frontend

Utils

12 of 60

Mientras tanto, el cliente...

13 of 60

14 of 60

Una aplicación móvil...

15 of 60

16 of 60

¿Cómo lo solucionamos?

17 of 60

Separación de conceptos

18 of 60

19 of 60

Opción 1 - no monorepo:

Publicar paquetes a NPM

20 of 60

21 of 60

Agreguemos un nuevo reducer

22 of 60

cd @reactweek/redux

23 of 60

Escribir el nuevo reducer

24 of 60

Escribir pruebas!

¿Pero cómo? ¿Contra qué probar nuestro código?

25 of 60

npm/yarn link

26 of 60

cd @reactweek/web

27 of 60

npm/yarn link @reactweek/redux

28 of 60

Todo “funciona”*

29 of 60

Crear el Pull Request en @reactweek/redux

30 of 60

Merge del Pull Request en @reactweek/redux

31 of 60

npm publish con la nueva versión de @reactweek/redux

32 of 60

Actualizar dependencias en los consumidores

33 of 60

¡11 Pasos!

34 of 60

¡Hay un BUG!

35 of 60

36 of 60

Opción 2 - Monorepos:

:D

37 of 60

Muchos proyectos en un repositorio

38 of 60

Monolito

!==

Monorepo

39 of 60

40 of 60

Estructura de archivos

41 of 60

/package.json

42 of 60

¿Qué hay en cada paquete?

43 of 60

/packages/web

44 of 60

/packages/web/package.json

45 of 60

Paquetes en el monorepo

common

46 of 60

Creemos un store compartido en

/packages/redux/

47 of 60

/packages/redux/store.js

48 of 60

/packages/redux/index.js

49 of 60

/packages/redux/package.json

50 of 60

Importemos el store compartido en /packages/mobile/

51 of 60

/packages/mobile/package.json

52 of 60

/packages/mobile/App.js

53 of 60

Importemos el store compartido en /packages/web/

54 of 60

/packages/web/package.json

55 of 60

/packages/web/src/index.js

56 of 60

57 of 60

58 of 60

Siguientes pasos:

59 of 60

React Native Web

Storybook

Linter & Pruebas unitarias

60 of 60

https://alejandro.dev