」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 我如何使用 dpdm 修復 Redux 中的循環依賴錯誤

我如何使用 dpdm 修復 Redux 中的循環依賴錯誤

發佈於2024-11-09
瀏覽:125

How I Fixed a Circular Dependency Bug in Redux Using dpdm

打破混亂循環:Redux 循環依賴之旅

最近,我在 Redux 程式碼庫中偶然發現了一個讓我摸不著頭緒的錯誤。如果您曾經在測試套件拋出毫無意義的錯誤時感到突然的混亂,您就會知道這種感覺。這是發生的事情以及我最終如何發現(並解決)問題的。

循環依賴到底是什麼?

當兩個或多個模組直接或間接相互依賴時,就會發生循環依賴,從而在依賴鏈中創建無限循環。換句話說,就像兩個朋友說:“你先走”,但沒有人行動。在 JavaScript 中,這可能會導致未定義的模組或不完整的數據,從而導致難以追蹤的錯誤。

罪魁禍首:一個例子

想像兩個 JavaScript 文件,moduleA.js 和 moduleB.js:

// moduleA.js
import { functionB } from './moduleB.js';
export function functionA() {
  console.log('functionA called');
  functionB();
}

// moduleB.js
import { functionA } from './moduleA.js';
export function functionB() {
  console.log('functionB called');
  functionA();
}

在這裡,兩個模組相互依賴。當 JavaScript 嘗試載入它們時,它會感到困惑,因為如果對方沒有先準備好,則兩者都無法完全載入。這會導致諸如未定義的函數或不完整的模組之類的問題——基本上是一團糟。

那麼,我是如何找到我的循環依賴的呢?

啊,可怕的錯誤開始了這次冒險:

Error: `reducer` is a required argument, and must be a function or an object of functions that can be passed to combineReducers.
 ❯ Module.configureStore node_modules/@reduxjs/toolkit/src/configureStore.ts:98:11

我的第一個反應? 「等等,什麼?!」—這不是我最好的時刻。我確信我的減速器已就位,所以這個錯誤似乎是無中生有的。經過一番挖掘,我意識到這不是一個缺少減速器的問題,而是一個循環依賴潛入我的 Redux 設定中。當然,弄清楚這一點並不容易!

真正的英雄:dpdm

就在那時我找到了我的救星:npm 包 dpdm。這個 gem 分析您的依賴關係樹,並向您顯示那些偷偷摸摸的循環依賴關係所在的位置。運行以下命令給了我一個清晰的視圖:

dpdm --no-warning --no-tree ./src/index.tsx

瞧!以下是它在我的專案中發現的內容:

• Circular Dependencies
  01) src/stores/store.ts -> src/stores/rootReducer.ts -> src/stores/slice/authSlice.ts -> src/utilities/api.ts
  02) src/stores/rootReducer.ts -> src/stores/slice/bookingSlice.ts -> src/hooks/redux.tsx -> src/stores/types.ts -> src/stores/setUpStore.ts
  03) src/stores/types.ts -> src/stores/setUpStore.ts
  ...

解決方法:重構時間!

報告很清楚:我的 Redux 檔案中存在大量循環依賴項,主要在 store.ts、rootReducer.ts 和一些切片中。在拆分了一些邏輯、打破了不必要的依賴關係並重構了程式碼之後,我終於恢復正常了。

經驗教訓

  • 循環依賴是偷偷摸摸的:它們通常直到運行時或單元測試期間才會出現,這使得它們很難追蹤。
  • 像 dpdm 這樣的工具是救星:不要浪費時間手動搜尋導入。讓工具來完成繁重的工作。
  • 重構是你的朋友:有時循環依賴是糟糕架構的標誌。良好的重構不僅可以解決眼前的問題,還可以讓您的程式碼庫更乾淨且更易於維護。

所以,下次當你遇到這些討厭的錯誤時,喝杯咖啡,開懷大笑,打破這個循環!

調試愉快! ?

版本聲明 本文轉載於:https://dev.to/akshaysrepo/how-i-fixed-a-circular-dependency-bug-in-redux-using-dpdm-13ap?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何同步迭代並從PHP中的兩個等級陣列打印值?
    如何同步迭代並從PHP中的兩個等級陣列打印值?
    同步的迭代和打印值來自相同大小的兩個數組使用兩個數組相等大小的selectbox時,一個包含country代碼的數組,另一個包含鄉村代碼,另一個包含其相應名稱的數組,可能會因不當提供了exply for for for the uncore for the forsion for for ytry...
    程式設計 發佈於2025-04-30
  • 如何將來自三個MySQL表的數據組合到新表中?
    如何將來自三個MySQL表的數據組合到新表中?
    mysql:從三個表和列的新表創建新表 答案:為了實現這一目標,您可以利用一個3-way Join。 選擇p。 *,d.content作為年齡 來自人為p的人 加入d.person_id = p.id上的d的詳細信息 加入T.Id = d.detail_id的分類法 其中t.taxonomy ...
    程式設計 發佈於2025-04-30
  • 如何使用FormData()處理多個文件上傳?
    如何使用FormData()處理多個文件上傳?
    )處理多個文件輸入時,通常需要處理多個文件上傳時,通常是必要的。 The fd.append("fileToUpload[]", files[x]); method can be used for this purpose, allowing you to send multi...
    程式設計 發佈於2025-04-30
  • 在程序退出之前,我需要在C ++中明確刪除堆的堆分配嗎?
    在程序退出之前,我需要在C ++中明確刪除堆的堆分配嗎?
    在C中的顯式刪除 在C中的動態內存分配時,開發人員通常會想知道是否需要手動調用“ delete”操作員在heap-exprogal exit exit上。本文深入研究了這個主題。 在C主函數中,使用了動態分配變量(HEAP內存)的指針。當應用程序退出時,此內存是否會自動發布?通常,是。但是,即使在...
    程式設計 發佈於2025-04-30
  • Java字符串非空且非null的有效檢查方法
    Java字符串非空且非null的有效檢查方法
    檢查字符串是否不是null而不是空的if (str != null && !str.isEmpty())Option 2: str.length() == 0For Java versions prior to 1.6, str.length() == 0 can be二手: if(str!= n...
    程式設計 發佈於2025-04-30
  • 使用Bootstrap創建自定義文件上傳按鈕的技巧
    使用Bootstrap創建自定義文件上傳按鈕的技巧
    使用bootstrap 對於Bootstrap 3、4和5,可以簡單地使用HTML解決方案: 瀏覽 此隱藏的輸入元素將在維護自定義按鈕樣式的同時作為常規文件輸入控件。 如果需要與IE8和下面的兼容,請使用IE8和下面,組合: { 位置:絕對; 頂部:0; 右...
    程式設計 發佈於2025-04-30
  • 大批
    大批
    [2 數組是對象,因此它們在JS中也具有方法。 切片(開始):在新數組中提取部分數組,而無需突變原始數組。 令ARR = ['a','b','c','d','e']; // USECASE:提取直到索引作...
    程式設計 發佈於2025-04-30
  • 如何有效地選擇熊貓數據框中的列?
    如何有效地選擇熊貓數據框中的列?
    在處理數據操作任務時,在Pandas DataFrames 中選擇列時,選擇特定列的必要條件是必要的。在Pandas中,選擇列的各種選項。 選項1:使用列名 如果已知列索引,請使用ILOC函數選擇它們。請注意,python索引基於零。 df1 = df.iloc [:,0:2]#使用索引0和1 ...
    程式設計 發佈於2025-04-30
  • 為什麼在我的Linux服務器上安裝Archive_Zip後,我找不到“ class \” class \'ziparchive \'錯誤?
    為什麼在我的Linux服務器上安裝Archive_Zip後,我找不到“ class \” class \'ziparchive \'錯誤?
    Class 'ZipArchive' Not Found Error While Installing Archive_Zip on Linux ServerSymptom:When attempting to run a script that utilizes the ZipAr...
    程式設計 發佈於2025-04-30
  • C++中何時選擇大括號初始化?
    C++中何時選擇大括號初始化?
    brace-initioner:在C 11中確定其最佳用法介紹提供各種選項的各種選項》中為變量提供了各種選項。 This flexibility can lead to confusion and uncertainty about the most appropriate initializa...
    程式設計 發佈於2025-04-30
  • 如何使用Python的請求和假用戶代理繞過網站塊?
    如何使用Python的請求和假用戶代理繞過網站塊?
    如何使用Python的請求模擬瀏覽器行為,以及偽造的用戶代理提供了一個用戶 - 代理標頭一個有效方法是提供有效的用戶式header,以提供有效的用戶 - 設置,該標題可以通過browser和Acterner Systems the equestersystermery和操作系統。通過模仿像Chro...
    程式設計 發佈於2025-04-30
  • 解決MySQL錯誤1153:數據包超出'max_allowed_packet'限制
    解決MySQL錯誤1153:數據包超出'max_allowed_packet'限制
    mysql錯誤1153:故障排除比“ max_allowed_pa​​cket” bytes 更大的數據包,用於面對陰謀mysql錯誤1153,同時導入數據capase doft a Database dust?讓我們深入研究罪魁禍首並探索解決方案以糾正此問題。 理解錯誤此錯誤表明在導入過程中...
    程式設計 發佈於2025-04-30
  • MySQL中如何高效地根據兩個條件INSERT或UPDATE行?
    MySQL中如何高效地根據兩個條件INSERT或UPDATE行?
    在兩個條件下插入或更新或更新 solution:的答案在於mysql的插入中...在重複鍵更新語法上。如果不存在匹配行或更新現有行,則此功能強大的功能可以通過插入新行來進行有效的數據操作。如果違反了唯一的密鑰約束。 實現所需的行為,該表必須具有唯一的鍵定義(在這種情況下為'名稱'...
    程式設計 發佈於2025-04-30
  • 版本5.6.5之前,使用current_timestamp與時間戳列的current_timestamp與時間戳列有什麼限制?
    版本5.6.5之前,使用current_timestamp與時間戳列的current_timestamp與時間戳列有什麼限制?
    在時間戳列上使用current_timestamp或MySQL版本中的current_timestamp或在5.6.5 此限制源於遺留實現的關注,這些限制需要對當前的_timestamp功能進行特定的實現。 創建表`foo`( `Productid` int(10)unsigned not ...
    程式設計 發佈於2025-04-30
  • 在UTF8 MySQL表中正確將Latin1字符轉換為UTF8的方法
    在UTF8 MySQL表中正確將Latin1字符轉換為UTF8的方法
    在UTF8表中將latin1字符轉換為utf8 ,您遇到了一個問題,其中含義的字符(例如,“jáuòiñe”)在utf8 table tabled tablesset中被extect(例如,“致電。為了解決此問題,您正在嘗試使用“ mb_convert_encoding”和“ iconv”轉換受...
    程式設計 發佈於2025-04-30

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3