2024 年還在用 Lodash?這個現(xiàn)代化替代品更安全、好用!
相信許多前端開發(fā)者對Lodash都耳熟能詳,作為 JavaScript 領(lǐng)域的一款常用實用工具庫,它在前端開發(fā)中廣受歡迎, npm 周下載量高達(dá) 5200 萬。然而,時光荏苒,轉(zhuǎn)眼已是 2024 年,Lodash 是否仍然值得使用呢?它的確為開發(fā)者帶來了許多便利,但同樣存在一些不容忽視的問題。本文將深入探討 Lodash 的局限性,并推薦一個更為現(xiàn)代化、值得一試的 JavaScript 實用工具庫 —— Radash。
Lodash 的問題
Lodash 最初在 2009 年以 Underscore之名誕生,并在 2012 至 2013 年間經(jīng)過一次分支(成為Lodash)后崛起。Lodash 的設(shè)計初衷是為了解決 2012 年前后 JavaScript 開發(fā)者面臨的一系列難題。然而,時過境遷,那些問題在今天已不再是主要挑戰(zhàn)。
隨著可選鏈和空值合并的引入,許多 Lodash 函數(shù)變得多余。Lodash 的 _.filter
函數(shù)就是一個很好的例子。它曾經(jīng)是一個很好的選擇,可以遍歷對象數(shù)組并根據(jù)屬性過濾數(shù)組項,即使對象的屬性不存在也不會出錯。
import _ from "lodash";
const users = [
{ user: "Poorna", age: 26, active: true },
{ user: "Widura", age: 28 },
{ user: "Binara", age: 24, active: true }
];
const filtered_users = _.filter(users, { active: true });
console.log(filtered_users);
// { 'user': 'Poorna', 'age': 26, 'active': true }
// { 'user': 'Binara', 'age': 24, 'active': true }
但現(xiàn)在,我們可以使用可選鏈操作符來完成這個任務(wù)。它更為簡單,并且不需要導(dǎo)入任何第三方庫。
const users = [
{ user: "Poorna", age: 26, active: true },
{ user: "Widura", age: 28 },
{ user: "Binara", age: 24, active: true }
];
const filtered_users = users.filter(user => user?.active == true );
console.log(filtered_users);
// { 'user': 'Poorna', 'age': 26, 'active': true }
// { 'user': 'Binara', 'age': 24, 'active': true }
同樣地,由于最新的 JavaScript 和 TypeScript 功能,像 .get、.map 和 _.size 這樣的函數(shù)也變得多余了。并且,在性能方面,像可選鏈這樣的特性遠(yuǎn)遠(yuǎn)超過了 Lodash 函數(shù),可選鏈的性能幾乎是 Lodash 的 _.get 函數(shù)的兩倍。
Lodash 主要是用純 JavaScript 編寫的,并沒有為 TypeScript 提供原生的支持。雖然社區(qū)提供了相應(yīng)的 TypeScript 類型定義,但這些類型定義是基于 JavaScript 代碼反向推斷的,有時可能無法完全準(zhǔn)確地描述 Lodash 的所有功能和使用場景。
另外,Lodash 在過去的 3 年里并沒有發(fā)布新版本, 上一次版本發(fā)布還停留在 2021 年。而像 Radash 這樣的新庫則提供了持續(xù)的更新以解決現(xiàn)代編程中的問題:
Radash:現(xiàn)代化實用工具庫
Radash 是“新一代的 Lodash”,其目前在 GitHub 上擁有 2.6k Star,npm 周下載量 70k。它的特點如下:
- 一款零依賴的 JavaScript 實用工具庫
- 采用 TypeScript 編寫,類型已經(jīng)預(yù)先打包
- 舍棄了 Lodash 中逐漸過時的函數(shù)
- 推出了眾多前所未見但一直想要的新功能
- 源代碼的維護(hù)以新手的可理解性為首要任務(wù)。在大多數(shù)情況下,如果想使用 Radash 的某個函數(shù)但不想安裝它,可以直接從 GitHub 上復(fù)制它。
Radash 旨在提供強大的函數(shù)來解決 JavaScript 中的現(xiàn)代問題。此外,Radash 中的函數(shù)類型定義準(zhǔn)確、測試充分、文檔完善,且編寫時以簡潔性為首要考慮。最重要的是,這些函數(shù)能夠解決現(xiàn)代 JavaScript 中的問題。
Radash 目前提供了 90+ 個實用函數(shù):
下面來看幾個 Radash 中很實用的函數(shù)。
list()
list() 函數(shù)允許動態(tài)地生成具有特定項的列表,根據(jù)提供的參數(shù)進(jìn)行靈活調(diào)整。它同樣支持最少 1 個參數(shù),最多 4 個輸入?yún)?shù)。
import { list } from 'radash';
const myList = list(25, 100, i => i, 25);
console.log(myList); // 輸出: [25, 50, 75, 100]
在這個例子中,利用 list() 函數(shù)創(chuàng)建了一個列表。函數(shù)的第一個參數(shù)是起始值 25,第二個參數(shù)是結(jié)束值 100(注意,結(jié)束值是不包含在最終列表中的)。第三個參數(shù)是一個映射函數(shù),這里我們簡單地返回了每個元素本身(即沒有進(jìn)行任何轉(zhuǎn)換)。最后一個參數(shù)是步長 25,意味著每次增加 25 來生成列表中的下一個值。
retry()
retry() 函數(shù)用于重試失敗的異步操作。它接受一個異步操作函數(shù)、一個重試次數(shù)以及一個延遲時間作為參數(shù),并在操作失敗時不斷重試,直到操作成功或達(dá)到指定的最大重試次數(shù)。
import { retry } from 'radash';
await retry({ times: 2, delay: 1000 }, api.articles.list);
在這個例子中,retry() 函數(shù)嘗試執(zhí)行 api.articles.list 異步操作,如果操作失敗,它會等待 1000 毫秒(即 1 秒)后重試,最多重試 2 次。
可以使用 retry() 函數(shù)來替代傳統(tǒng)的異步重試庫,因為它提供了更加簡潔和靈活的接口。結(jié)合 Radash 的其他功能,如 tryit、parallel 等,可以輕松構(gòu)建出高效且健壯的異步處理邏輯,以應(yīng)對后端服務(wù)的各種不確定性。無論是處理網(wǎng)絡(luò)請求、數(shù)據(jù)庫操作還是其他異步任務(wù),retry() 函數(shù)都能提供強大的容錯能力,確保應(yīng)用程序的穩(wěn)定性和可靠性。
counting()
counting() 函數(shù)用于統(tǒng)計類數(shù)組集合中各類元素的數(shù)量。它接收一個對象數(shù)組和一個回調(diào)函數(shù),通過回調(diào)函數(shù)定義計數(shù)條件,并返回一個對象,其中包含了各類元素的數(shù)量。
傳統(tǒng)上,可能需要使用循環(huán)和多個條件判斷來實現(xiàn)類似的統(tǒng)計功能,代碼較為繁瑣。而使用 counting()
函數(shù),可以極大地簡化這一過程。
import { counting } from 'radash';
const users = [
{name: 'Poorna', type: 'engineer'},
{name: 'Widura', type: 'manager'},
{name: 'Binara', type: 'engineer'},
];
const typeCounts = counting(users, user => user.type);
console.log(typeCounts); // 輸出: { engineer: 2, manager: 1 }
在這個例子中,定義了一個 users 數(shù)組,其中包含了不同角色的用戶對象。通過調(diào)用 counting() 函數(shù),并傳入 users 數(shù)組和一個提取 type 屬性的回調(diào)函數(shù),得到了一個 typeCounts 對象,其中包含了每種類型的用戶數(shù)量。
類型化函數(shù)
Radash 中的類型化函數(shù)是一項非常出色的特性,它提供了一系列工具函數(shù),如 isArray()、isDate()、isFloat()、isInt() 等,用于檢測變量的數(shù)據(jù)類型。這些函數(shù)極大地簡化了在編程過程中驗證和確保數(shù)據(jù)類型正確性的任務(wù),使得代碼更加健壯和可靠。通過使用這些函數(shù),開發(fā)者可以更加自信地處理預(yù)期的數(shù)據(jù)類型,從而有效避免潛在的錯誤和異常。