Añadir soporte de DevTools

9305 단어 rxjs

이력서



En este tutorial vamos a ver cómo integrar nuestra solución de gestión de estado con las DevTools del navegador para poder depurar nuestras aplicaciones de la forma más cómoda.

엔토르노


  • Slimbook Prox15 32Gb RAM i7
  • SlimbookOS(Ubuntu 20.04)
  • RxJS 6.6.2
  • 비주얼 스튜디오 코드

  • 소개



    Seguro que a poco que hayas visto algo de Redux y todas sus variantes en los frameworks de turno, te habrá llamado la atención su integración con las DevTools de Chrome donde se puede ver en todo momento una foto del estado, las acciones que se han producido y "viajar"entre ellas.

    Así que vamos a ver cómo conseguir esto sin recurrir a ninguna librería, solo nuestro proyecto de gestión de estado con RxJS.

    바모스 알 리오



    개발자 도구에서 "Redux"를 사용하여 Chrome 확장 프로그램을 설치하는 방법을 미리 알아보세요. Esto es tan sencillo como ir a la URL y 펄서 및 설치.

    Ahora tenemos que hacer alguna modificación en nuestro proyecto para habilitar la conxión a esta extension y mandar la información. Para habilitar la conexion, vamos a ir a nuestro fichero raíz y vamos a incluir lo siguiente:

    const win = window as any;
    
    if (win.__REDUX_DEVTOOLS_EXTENSION__) {
      win.devTools = win.__REDUX_DEVTOOLS_EXTENSION__.connect();
    }
    


    En mi caso estoy en un proyecto con TypeScript de ahí que tenga que wrappear el window del navegador.

    Para evitar que la aplicación falle en el arranque si previamente no hemos instalado la extension, vamos a poner un if de guarda a la sentencia que nos permite conectar con la extension.

    Ahora tenemos que ver de qué forma le transmissionimos los datos a la extensión, es decir, le informamos a la extension de las acciones y los cambios de estado que se producen.

    Esto lo vamos a hacer en el fichero store.ts que implementamos en los anteriores tutoriales de esta serie. De forma que ahora el store va a recibir el tipo de acción y el estado resultante de aplicar dicha acción, quedando de esta forma:

    import { BehaviorSubject, Observable } from 'rxjs';
    
    const win = window as any;
    
    export abstract class Store<T> {
        private state$: BehaviorSubject<T> = new BehaviorSubject(undefined);
        get = (): T => this.state$.getValue();
        get$ = (): Observable<T> => this.state$.asObservable();
        store = (type: string, nextState: T) => {
            if (win.devTools) {
                win.devTools.send(type, nextState);
            }
            return this.state$.next(nextState);
        }
    }
    


    como ves también es handy verificar que existe el objeto win.devTool antes de utilizarlo, de otra forma nos daría error, al no estar instalada la extension.

    Esto nos obliga a cambiar la implementación de los métodos del store, ya que ahora es obligatorio pasarle el nombre de la acción antes del store modificado. 예를 들면 다음과 같습니다.

    export class ApplicationsStoreService extends Store<Application[]> {
    
      constructor(private service: ApplicationsService) {
        super();
      }
    
      init(): Promise<Application[]> {
        if (this.get()) { return; }
        return this.service.getApplications().pipe(
          tap((data) => this.store('APPLICATIONS_INIT', data))
        ).toPromise();
      }
    }
    


    Este será el nombre que veremos en la extension de Redux cuando nuestra aplicación ejecuta la acción, como vemos en la siguiente imagen.



    결론



    Como ves podemos implementar una solución más sencilla y sobre todo universal, sin perder las ventajas de otras tecnologías más complejas (y completas) como NgRx, Vuex, etc...

    Notarás que la extension muestra los cambios de estado por aplicación como si solo hubiese un store, esto es porque Redux funciona solo con un store. En nuestro caso creamos múltiples por lo que realmente la extension solo nos vale para saber las acciones que se han ejecutado y el orden de ejecución.

    La ventaja es que no trabajamos con reducers y nos ahorramos la típica estructura switch con todas las acciones y su lógica asociada.

    좋은 웹페이지 즐겨찾기