Skip to content

遷移指南

本指南將幫助您從 Lodash 平滑遷移到 Radash,包括常見函數的對應關係、遷移步驟和最佳實踐。

為什麼選擇 Radash?

優勢對比

特性RadashLodash
包體積零依賴,體積更小有依賴,體積較大
TypeScript 支持原生支持,類型安全需要額外安裝類型包
現代化使用現代 JS 特性兼容舊版本瀏覽器
性能優化的現代實現兼容性優先
維護狀態活躍維護維護相對滯後

遷移步驟

1. 安裝 Radash

bash
# 安裝 Radash
npm install radash

# 可選:保留 Lodash 用於對比測試
npm install lodash @types/lodash

2. 更新導入語句

從 Lodash 導入

typescript
// 舊方式 - Lodash
import _ from 'lodash'
import { map, filter, debounce } from 'lodash'

遷移到 Radash 導入

typescript
// 新方式 - Radash
import { map, filter, debounce } from 'radash'

// 或者按需導入
import { map } from 'radash/array'
import { debounce } from 'radash/curry'

3. 函數映射表

數組操作函數

Lodash 函數Radash 函數說明
_.map()map()數組映射
_.filter()filter()數組過濾
_.reduce()reduce()數組歸約
_.find()find()查找元素
_.findIndex()findIndex()查找索引
_.some()some()部分匹配
_.every()every()全部匹配
_.includes()includes()包含檢查
_.uniq()unique()去重
_.flatten()flat()數組扁平化
_.chunk()chunk()數組分塊
_.range()range()範圍生成

對象操作函數

Lodash 函數Radash 函數說明
_.get()get()安全獲取屬性
_.set()set()安全設置屬性
_.pick()pick()選擇屬性
_.omit()omit()排除屬性
_.cloneDeep()clone()深度克隆
_.merge()merge()對象合併
_.keys()keys()獲取鍵名
_.values()values()獲取值
_.entries()entries()獲取鍵值對

函數式編程工具

Lodash 函數Radash 函數說明
_.debounce()debounce()防抖
_.throttle()throttle()節流
_.memoize()memo()記憶化
_.compose()compose()函數組合
_.curry()curry()柯里化

類型檢查函數

Lodash 函數Radash 函數說明
_.isArray()isArray()數組檢查
_.isObject()isObject()對象檢查
_.isString()isString()字符串檢查
_.isNumber()isNumber()數字檢查
_.isFunction()isFunction()函數檢查
_.isEmpty()isEmpty()空值檢查

遷移示例

數組操作遷移

從 Lodash 遷移

typescript
import _ from 'lodash'

const users = [
  { id: 1, name: 'Alice', age: 25 },
  { id: 2, name: 'Bob', age: 30 },
  { id: 3, name: 'Charlie', age: 35 }
]

// Lodash 方式
const names = _.map(users, 'name')
const adults = _.filter(users, { age: { $gte: 30 } })
const totalAge = _.sumBy(users, 'age')
const uniqueAges = _.uniq(_.map(users, 'age'))

遷移到 Radash

typescript
import { map, filter, reduce, unique } from 'radash'

const users = [
  { id: 1, name: 'Alice', age: 25 },
  { id: 2, name: 'Bob', age: 30 },
  { id: 3, name: 'Charlie', age: 35 }
]

// Radash 方式
const names = map(users, user => user.name)
const adults = filter(users, user => user.age >= 30)
const totalAge = reduce(users, (sum, user) => sum + user.age, 0)
const uniqueAges = unique(map(users, user => user.age))

對象操作遷移

從 Lodash 遷移

typescript
import _ from 'lodash'

const user = {
  name: 'Alice',
  age: 25,
  address: {
    city: 'New York',
    country: 'USA'
  }
}

// Lodash 方式
const city = _.get(user, 'address.city', 'Unknown')
const userInfo = _.pick(user, ['name', 'age'])
const userWithoutAge = _.omit(user, ['age'])
const clonedUser = _.cloneDeep(user)

遷移到 Radash

typescript
import { get, pick, omit, clone } from 'radash'

const user = {
  name: 'Alice',
  age: 25,
  address: {
    city: 'New York',
    country: 'USA'
  }
}

// Radash 方式
const city = get(user, 'address.city', 'Unknown')
const userInfo = pick(user, ['name', 'age'])
const userWithoutAge = omit(user, ['age'])
const clonedUser = clone(user)

函數工具遷移

從 Lodash 遷移

typescript
import _ from 'lodash'

// Lodash 方式
const debouncedSearch = _.debounce(searchFunction, 300)
const throttledScroll = _.throttle(scrollHandler, 100)
const memoizedCalc = _.memoize(expensiveCalculation)

遷移到 Radash

typescript
import { debounce, throttle, memo } from 'radash'

// Radash 方式
const debouncedSearch = debounce(searchFunction, 300)
const throttledScroll = throttle(scrollHandler, 100)
const memoizedCalc = memo(expensiveCalculation)

鏈式操作遷移

Lodash 鏈式操作

typescript
import _ from 'lodash'

const result = _(users)
  .filter(user => user.age >= 30)
  .map(user => user.name)
  .uniq()
  .value()

Radash 函數式方式

typescript
import { filter, map, unique } from 'radash'

const result = unique(
  map(
    filter(users, user => user.age >= 30),
    user => user.name
  )
)

類型安全改進

遷移前 (Lodash)

typescript
import _ from 'lodash'

// 需要額外的類型處理
if (_.isArray(data)) {
  (data as any[]).forEach(item => console.log(item))
}

const result = _.map(users, 'name') // 類型推斷不準確

遷移後 (Radash)

typescript
import { isArray, map } from 'radash'

// 完整的類型安全
if (isArray(data)) {
  data.forEach(item => console.log(item)) // TypeScript 知道 data 是數組
}

const result = map(users, user => user.name) // 準確的類型推斷

性能優化

遷移前

typescript
import _ from 'lodash'

// Lodash 的兼容性優先實現
const largeArray = Array.from({ length: 100000 }, (_, i) => i)
const doubled = _.map(largeArray, n => n * 2)
const evens = _.filter(largeArray, n => n % 2 === 0)

遷移後

typescript
import { map, filter } from 'radash'

// Radash 的優化現代實現
const largeArray = Array.from({ length: 100000 }, (_, i) => i)
const doubled = map(largeArray, n => n * 2)
const evens = filter(largeArray, n => n % 2 === 0)

遷移檢查清單

第一階段:準備

  • [ ] 備份當前代碼
  • [ ] 安裝 Radash
  • [ ] 創建遷移分支
  • [ ] 設置測試環境

第二階段:核心遷移

  • [ ] 更新導入語句
  • [ ] 替換數組操作函數
  • [ ] 替換對象操作函數
  • [ ] 替換函數式編程工具
  • [ ] 替換類型檢查函數

第三階段:優化

  • [ ] 移除鏈式操作
  • [ ] 優化類型定義
  • [ ] 性能測試
  • [ ] 代碼審查

第四階段:驗證

  • [ ] 單元測試通過
  • [ ] 集成測試通過
  • [ ] 性能基準測試
  • [ ] 生產環境部署

常見問題

Q: 如何處理 Lodash 特有的功能?

A: 某些 Lodash 特有功能可能需要自定義實現或使用原生 JavaScript 方法。

Q: 遷移會影響性能嗎?

A: Radash 通常提供更好的性能,但建議進行基準測試驗證。

Q: 如何處理鏈式操作?

A: 將鏈式操作轉換為函數式組合,或使用 Radash 的 compose 函數。

Q: TypeScript 類型會丟失嗎?

A: 不會,Radash 提供更好的類型安全性和推斷。

總結

遷移到 Radash 是一個值得的投資,它將為您的項目帶來:

  • 更小的包體積 - 零依賴設計
  • 更好的類型安全 - 原生 TypeScript 支持
  • 更高的性能 - 優化的現代實現
  • 更簡潔的 API - 現代化的設計理念

按照本指南進行遷移,您將能夠平滑地從 Lodash 過渡到 Radash,享受現代化的開發體驗。

Released under the MIT License.