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.
엔토르노
소개
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.
Reference
이 문제에 관하여(Añadir soporte de DevTools), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/raguilera82/anadir-soporte-de-devtools-3f2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)