日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

XState Viz 可视化和调试状态机

發布時間:2023/12/9 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 XState Viz 可视化和调试状态机 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 前言

狀態機的一大好處就是可以可視化狀態,降低業務的理解成本和相互間的溝通成本。

目前 XState 官方提供的可視化工具已經做的很不錯了,但用起來偏重,國內訪問也比較慢。這邊我再原基礎上進行了優化,并增加了部分新功能,開發了 Viz-Lite 版。

2. Viz-Lite

Viz-Lite 可視化工具地址

主要有如下功能:

  • 直接在右側區域進行編寫或粘貼 XState 狀態機代碼,右側進行可視化。
  • 可以在左側可視化區域通過點擊進行狀態機執行。
  • 可以在右側事件面板中查看事件歷史,且可以手動進行自定義事件發送。
  • 可以通過 @xstate/inspect 與頁面中的狀態機實時建立連接,可視化查看當前頁面狀態機細節。
  • 可以將可視化出來的狀態圖進行圖片導出。
  • 可以切切亮/暗色。

等等。

3. Inspect 底層實現

Viz-Lite 可以實時與頁面中的狀態圖建立數據連接,需要依賴 @xstate/inspect,且在頁面、Inspect、Viz-Lite 建立有嚴格的依賴關系。

我大致梳理了一下三者的關系,如下的序列圖所示:

#mermaid-svg-86dzAJtVjnO1JwiF {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-86dzAJtVjnO1JwiF .error-icon{fill:#552222;}#mermaid-svg-86dzAJtVjnO1JwiF .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-86dzAJtVjnO1JwiF .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-86dzAJtVjnO1JwiF .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-86dzAJtVjnO1JwiF .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-86dzAJtVjnO1JwiF .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-86dzAJtVjnO1JwiF .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-86dzAJtVjnO1JwiF .marker{fill:#333333;stroke:#333333;}#mermaid-svg-86dzAJtVjnO1JwiF .marker.cross{stroke:#333333;}#mermaid-svg-86dzAJtVjnO1JwiF svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-86dzAJtVjnO1JwiF .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-86dzAJtVjnO1JwiF text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-86dzAJtVjnO1JwiF .actor-line{stroke:grey;}#mermaid-svg-86dzAJtVjnO1JwiF .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-86dzAJtVjnO1JwiF .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-86dzAJtVjnO1JwiF #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-86dzAJtVjnO1JwiF .sequenceNumber{fill:white;}#mermaid-svg-86dzAJtVjnO1JwiF #sequencenumber{fill:#333;}#mermaid-svg-86dzAJtVjnO1JwiF #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-86dzAJtVjnO1JwiF .messageText{fill:#333;stroke:#333;}#mermaid-svg-86dzAJtVjnO1JwiF .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-86dzAJtVjnO1JwiF .labelText,#mermaid-svg-86dzAJtVjnO1JwiF .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-86dzAJtVjnO1JwiF .loopText,#mermaid-svg-86dzAJtVjnO1JwiF .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-86dzAJtVjnO1JwiF .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-86dzAJtVjnO1JwiF .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-86dzAJtVjnO1JwiF .noteText,#mermaid-svg-86dzAJtVjnO1JwiF .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-86dzAJtVjnO1JwiF .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-86dzAJtVjnO1JwiF .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-86dzAJtVjnO1JwiF .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-86dzAJtVjnO1JwiF .actorPopupMenu{position:absolute;}#mermaid-svg-86dzAJtVjnO1JwiF .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-86dzAJtVjnO1JwiF .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-86dzAJtVjnO1JwiF .actor-man circle,#mermaid-svg-86dzAJtVjnO1JwiF line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-86dzAJtVjnO1JwiF :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}VizInspectInterpreter開啟 Inspect 并打開 Viz 工具全局注入 __xstate__打開 VizInspect.createWindowReceiver()send('xstate.inspecting')打開狀態機服務并與注冊到 Inspect__REDUX_DEVTOOLS_EXTENSION__registerService(this)send('service.registe')send('service.registe')send('service.registe', {sessionId})三者建立連接alt[has __xstate__]VizInspectInterpreter

類似于 HTTP 三次握手。

在 Viz-Lite 中建立連接主要依靠 @xstate/inspect 的 createWindowReceiver 方法。

Viz-Lite 向 頁面狀態機發送事件,可以使用 createWindowReceiver 返回值中的 send 方法,消息體中 type 必須是 xstate.event。

頁面中狀態機的變化,可以通過 createWindowReceiver 返回值中的 subscribe 方法進行訂閱,包括 service.state 和 service.event。監聽 service.stop 可以確定連接的斷開。

4. 接入調試方法

安裝 @xstate/inspect:

npm i -S @xstate/inspect

從上面的序列圖中也可以看出,inspect 必須在 interpret() 之前執行,不然無法連接:

import { inspect } from '@xstate/inspect';inspect({url: 'https://apis.leping.fun/viz?inspect',iframe: false });
  • url 中指定 Viz-Lite 的地址 https://apis.leping.fun/viz?inspect。
  • iframe 指定在哪里掛載 Viz-Lite。可以直接指定一個 DOM,也可以設置為 false,瀏覽器會打開一個新頁面。

注意:調試模式,必須在 Viz-Lite 的地址中加上 ?inspect。如果想默認關閉右側面板可以加上 ?inspect&panel=false。

然后在創建狀態機服務時,指定 devTools 標志位就可以了:

import { interpret } from 'xstate';const service = interpret(someMachine, { devTools: true });

可以訪問這個 地址 查看效果:

Github 代碼地址

5. 快捷鍵

  • + / - 或者 CMD + 滾輪上/下:縮放。
  • CMD + Enter: 可視化當前代碼。
  • ↑↓←→:平移視圖。同時按住 Shift,增大平移服毒。
  • Shift + 1:適配到到窗口大小。

6. 配合 Redux DevTools 使用

從序列圖中可以看到在開啟 devTools: true 的時候,會判斷是否有 __REDUX_DEVTOOLS_EXTENSION__,如果有的話也可以在 Redux DevTools 中查看事件信息,如下圖所示:

? 原文地址

總結

以上是生活随笔為你收集整理的XState Viz 可视化和调试状态机的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 91丨九色丨蝌蚪丨老版 | 精品探花 | 一区二区三区日韩电影 | 久久理论视频 | 高清一区二区三区四区五区 | www.香蕉.com| 91秘密入口 | 中文字幕一区二区人妻电影丶 | 中文字幕av日韩 | xxx国产精品 | 精品久久网站 | 自拍天堂 | 日韩啪啪网 | 人人人人干 | 在线播放www| 青青草午夜 | 国产成人av影院 | 青青草原免费观看 | 国产精品爱啪在线线免费观看 | 51调教丨国产调教视频 | 一本一道久久a久久综合蜜桃 | 成人福利一区二区三区 | 国产精品日韩专区 | 色av网| 日韩激情图片 | 黄色综合网站 | 一区二区三区免费观看 | 五月天国产视频 | 国产嫩草影视 | 看全色黄大色黄女片18 | 操人视频在线观看 | 精品福利影院 | 中文字幕久久网 | 免费看的一级片 | 久久女人 | 欧美大白屁股 | 91干视频| 黑人巨大精品人妻一区二区 | 色一五月| 久久精品www人人爽人人 | 中国特级毛片 | 丁香久久综合 | 久草麻豆| 欧美少妇网| 懂色av一区二区三区 | 日本a级黄 | 成人h片 | 麻豆免费观看网站 | 国产草草浮力影院 | 国产精品一区在线 | 天堂99| 欧美日韩在线视频免费播放 | www.黄在线观看 | 国产精品二区一区 | 亚洲一线av | 午夜精品久久久内射近拍高清 | 日韩av资源站 | 午夜视频91 | 秋霞久久精品 | 国产人妻aⅴ色偷 | 久久久久久片 | 久久黄页 | 色网站免费在线观看 | 成人网站免费观看入口 | 欧美视频黄 | 三级免费观看 | 九九热这里都是精品 | 成人免费性生活视频 | 国产少妇在线 | 日韩免费高清视频 | 亚洲国产黄色av | 日韩少妇一区二区 | 影音先锋在线播放 | 久久精品国产欧美亚洲人人爽 | 一区两区小视频 | 色涩av| 日本久久黄色 | 日韩福利一区 | 国产草草 | 91精品人妻一区二区三区 | 青春草网站 | 国产一区二区高清 | 国产9区| 日日夜夜免费精品视频 | 国产精品二区一区二区aⅴ污介绍 | 四虎在线网址 | av一片| 污污视频网站免费观看 | 九一精品视频 | c逼视频 | 欧美福利一区 | 男男做爰猛烈啪啪高 | 精品一区在线看 | 成人黄色a级片 | 国内露脸中年夫妇交换 | 欧美成网 | 极品美女无套呻吟啪啪 | 国产一区视频免费观看 | 日韩欧美一区二区三区在线 |